gpt4 book ai didi

ansible - 整个剧本仅运行一次Ansible处理程序

转载 作者:行者123 更新时间:2023-12-04 16:42:33 25 4
gpt4 key购买 nike

我只想在整个剧本中只运行一次处理程序。

我尝试在剧本文件的以下内容中使用include语句,但这导致处理程序多次运行,每次播放一次:

- name: Configure common config
hosts: all
become: true
vars:
OE: "{{ ansible_hostname[5] }}"
roles:
- { role: common }
handlers:
- include: handlers/main.yml

- name: Configure metadata config
hosts: metadata
become: true
vars:
OE: "{{ ansible_hostname[5] }}"
roles:
- { role: metadata }
handlers:
- include: handlers/main.yml

这是handlers/main.yml的内容:
- name: restart autofs
service:
name: autofs.service
state: restarted

这是通知处理程序的任务之一的示例:
- name: Configure automount - /opt/local/xxx in /etc/auto.direct
lineinfile:
dest: /etc/auto.direct
regexp: "^/opt/local/xxx"
line: "/opt/local/xxx -acdirmin=0,acdirmax=0,rdirplus,rw,hard,intr,bg,retry=2 nfs_server:/vol/xxx"
notify: restart autofs

我如何才能让剧本对整个剧本只执行一次处理程序?

最佳答案

答案

标题中问题的字面回答是:否。

剧本是戏剧的 list 。 Playbook没有 namespace ,没有变量,没有状态。所有配置,逻辑和任务都在游戏中定义。

处理程序是一项具有不同调用时间表的任务(不是顺序的,而是有条件的,在播放结束时一次,或由meta: flush_handlers任务触发)。

处理程序属于剧本,而不是剧本,并且无法在剧本之外(即在剧本的结尾)触发它。

解决方案

不引用处理程序就可以解决问题。

您可以使用 group_by module根据每次播放底部的任务结果创建一个临时组。

然后,您可以在剧本的末尾定义一个单独的剧本,在属于上述临时组的目标上重新启动服务。

请引用下面的 stub 以获取该想法:

- hosts: all
roles:
# roles declaration
tasks:
- # an example task modifying Nginx configuration
register: nginx_configuration

# ... other tasks ...

- name: the last task in the play
group_by:
key: hosts_to_restart_{{ 'nginx' if nginx_configuration is changed else '' }}

# ... other plays ...

- hosts: hosts_to_restart_nginx
gather_facts: no
tasks:
- service:
name: nginx
state: restarted

关于ansible - 整个剧本仅运行一次Ansible处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41556574/

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