当前位置: 首页 > 知识库问答 >
问题:

Ansible - 当角色在循环中运行时,vars 未正确传播到处理程序

申炳
2023-03-14

我正在寻求帮助,以解决从一个剧本中运行具有相同角色的应用程序的多个版本(不同变量)的问题。

我们有一个具有多个产品系列的应用程序,这些产品系列是不同的代码版本。每个版本都有单独的uWSGI附庸配置和Nginx虚拟主机配置(/api/v2,/api/v3,...).

理想的状态应该是运行剧本并用指定的所有版本配置服务器。

遗憾的是,ansible的< code > import _ role/import _ tasks 不能与< code>with_items一起使用,所以必须使用< code > include _ role/include _ tasks (有点可怜,因为它们不支持角色标签)。

include_role方法不会是最大的问题,但是我们使用处理程序来通知uWSGI touch重新加载 - 在代码更改,链接更改,virtualenv更改,app_config更改等)。
但是,当使用循环 (with_items) 时,从循环传递的变量不会正确传播到处理程序。

我试过这种场景

问题:处理程序仅在循环的第一次迭代中运行。

#!/usr/bin/env ansible-playbook

# HAndler is run only once, from first notifier
- hosts: localhost
  gather_facts: no
  vars:
    app_root: "/tmp/test_ansible"
    app_versions:
      - app_product_family: 1
        app_release: "v1.0.2"
      - app_product_family: 3
        app_release: "v4.0.7"
  tasks:
   - name: Deploy multiple versions of app
     include_role:
       name: app
     with_items: "{{ app_versions }}"
     loop_control:
       loop_var: app_version
     vars:
       app_product_family: "{{ app_version.app_product_family }}"
       app_release: "{{ app_version.app_release }}"
     tags:
       - app
       - app_debug

问题:处理程序使用“默认值”中的默认值运行

#!/usr/bin/env ansible-playbook

- hosts: localhost
  gather_facts: no
  roles:
    - app_v2
  vars:
    app_v2_root: "/tmp/test_ansible_v2"
    app_v2_versions:
      - app_v2_product_family: 1
        app_v2_release: "v1.0.2"
      - app_v2_product_family: 3
        app_v2_release: "v4.0.7"

任务< code >角色/app_v2/main.yml

---
# Workaround because import_tasks can't be run with_items
- include_tasks: deploy.yml
  when: app_v2_versions
  with_items: "{{ app_v2_versions }}"
  loop_control:
    loop_var: app_v2
  vars:
    app_v2_product_family: "{{ app_v2.app_v2_product_family }}"
    app_v2_release: "{{ app_v2.app_v2_release }}"
  tags:
    - app_v2
    - app_v2_deploy
...

一个想法是为每个产品系列编写一个单独的角色,但是它们共享nginx和uWSGI,所以这将是大量的复制粘贴和共享任务(所以标签不能正常工作)。< br >目前,我用shell脚本包装器解决了这个问题,但这不是一个理想的解决方案,并且不能在Ansible tower上工作。

带有重现问题任务的示例报告(用ansible 2.4、2.5、2.6测试)

有什么想法吗

共有2个答案

戚甫
2023-03-14

好吧,这是@George Shuklin发布的一个错误。

我将使用我的shell包装器,它读取group_vars yaml,然后根据可变列表长度多次运行剧本。

可悲的是,在过去的几周里,我在ansible中遇到了许多烦人的bug,有点失去了对它的信任):

可能每个人都在使用微服务和kubernetes,所以需要加快我们的迁移速度(:

上官和惬
2023-03-14

对于Ansible中的includes,变量的重写顺序被破坏。例如,甚至包含角色中的< code>set_fact也会被角色默认值隐藏。

查看此错误:https://github.com/ansible/ansible/issues/22025

已经关了但是还没修好。我的建议是:非常小心地使用include和变量。

实际上,我从不在循环中使用角色包含。如果需要循环,请在该循环中包含一个任务列表(该任务列表反过来可以< code>import_role)。

 类似资料:
  • 问题内容: 基本上,我正在制作一款可以更新玩家位置的游戏,它使用以下线程: 效果很好,但是如果我删除System.out.println(),它将停止运行。我不知道为什么会这样,整个班级如下: 最后说明:传入布尔值upPresses和downPressed,我唯一要关注的是: 问题答案: 像这样的循环 会完全占用CPU。它开始表现更好的原因可能是因为您为I / O每次迭代产生了数百个周期。 我建议

  • 当我执行这段代码时,输出是“140”,也就是“28*5”,但它应该是“150”,也就是“28+31+30+31+30”,它应该计算两个月“2月”和“7月”之间的天数...所以这意味着for循环不能正常工作还是怎么的?为什么会这样!你能帮我一下吗??PS:我试图将循环中的j++更改为j+1,但Android Studio说“这不是一个声明”

  • 我有一个定义doTry-doCatch块的路由。当在doCatch块中处理异常时,我希望将其传播到错误处理程序,以确保在本地处理后将消息添加到死信队列中。问题是我无法让错误处理程序的传播工作(“defaultErrorHandler called!”未打印到控制台)。我也尝试过onException,但也没有成功。 任何提示都非常感谢。此致,奥利弗

  • 我正在做简单的Spring批量工作。当我启动作业时,它在无限循环中运行。它不会停止。根据我的时间表,它应该每10秒运行一次。但当工作开始时,它不会停止。它只是分别从读卡器、处理器和写入器打印系统输出。我正在为读者、处理者和作者创造工作机会。我正在按注释进行所有配置。不是通过xml。 下面是批处理配置 PersonReader。JAVA 人Writer.java 个人处理器。JAVA

  • 我试图了解gRPC中的异常处理机制是如何工作的。 除了try-catch块之外,还有其他方法来处理运行时异常,例如服务器端的IllegalArgumentException吗? 例如,我有一些gRPC流式客户端服务,当传递的参数不满足深层次的一些断言时(在某些库中,例如,com.google.common.base.Preconditions),方法onNext抛出IllegalArgumentE