gpt4 book ai didi

ansible:将 with_items 与通知处理程序一起使用

转载 作者:行者123 更新时间:2023-12-04 02:52:19 26 4
gpt4 key购买 nike

我想将一个变量传递给通知处理程序,但在 SO、文档或 github 存储库中的问题、如何做的任何地方都找不到。我正在做的是部署多个 webapps,当这些 webapps 之一的代码发生更改时,它应该重新启动该 webapp 的服务。

来自 this SO question ,我让这个工作,有点:

- hosts: localhost
tasks:
- name: "task 1"
shell: "echo {{ item }}"
register: "task_1_output"
with_items: [a,b]
- name: "task 2"
debug:
msg: "{{ item.item }}"
when: item.changed
with_items: task_1_output.results

(将其放入 test.yml 并使用 ansible-playbook test.yml -c local 运行它。)

但这会注册第一个任务的结果,并有条件地在第二个任务中循环。我的问题是,当您有两个或多个任务需要通知第二个任务时,它会变得困惑!例如,如果代码已更新或配置已更改,则重新启动 Web 服务。

AFAICT,无法将变量传递给处理程序。那将干净地为我修复它。我在 github 上发现了一些问题,其他人遇到了同样的问题,并提出了一些语法,但没有一个真正起作用。

包含子剧本也不起作用,因为使用 with_items连同 include已弃用。

在我的剧本中,我有一个 site.yml列出一个组的角色,然后在 group_vars对于那个组,我定义了应该安装的 webapps 列表(包括版本)。这对我来说似乎是正确的,因为这样我可以使用相同的剧本来进行分期和制作。但也许唯一的解决方案是多次定义角色,并复制用于登台和生产的角色列表。

那么这里的智慧是什么?

最佳答案

Ansible 中的变量是全局变量,因此没有理由将变量传递给处理程序。如果您试图以某种方式对处理程序进行参数化,就像您尝试在处理程序的名称中使用变量一样,您将无法在 Ansible 中做到这一点。

您可以做的是创建一个处理程序来轻松地遍历服务列表,这是一个可以在本地进行测试的工作示例:

- hosts: localhost
tasks:
- file: >
path=/tmp/{{ item }}
state=directory
register: files_created
with_items:
- one
- two
notify: some_handler

handlers:
- name: "some_handler"
shell: "echo {{ item }} has changed!"
when: item.changed
with_items: files_created.results

关于ansible:将 with_items 与通知处理程序一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25694249/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com