ansible-仅当角色中的任何任务发生更改时才运行处理程序

ansible-仅当角色中的任何任务发生更改时才运行处理程序,ansible,yaml,handler,roles,Ansible,Yaml,Handler,Roles,我创建了一个处理程序,用于重新启动服务器,我有一个角色,该角色使用多个配置设置操作系统(该角色中大约有6个任务),我只想在整个角色中的任何任务发生更改时触发重新启动服务器处理程序,并且在整个角色完成后也会触发该处理程序 我试着把“通知”放在这个角色的剧本上。但得到的错误是错误“通知”不是一个有效的播放属性 site.yml --- - name: Setup OS parameters hosts: master_servers roles: - os_prep tags:

我创建了一个处理程序,用于
重新启动服务器
,我有一个角色,该角色使用多个配置设置操作系统(该角色中大约有6个任务),我只想在整个角色中的任何任务发生更改时触发
重新启动服务器
处理程序,并且在整个角色完成后也会触发该处理程序

我试着把“通知”放在这个角色的剧本上。但得到的错误是
错误“通知”不是一个有效的播放属性

site.yml

---
- name: Setup OS parameters
  hosts: master_servers
  roles:
    - os_prep
  tags: os_prep
  notify:
    - restart server
重新启动服务器的处理程序

---
- name: restart server
  command: /sbin/shutdown -r now
  async: 0
  poll: 0
  ignore_errors: true
  notify:
    - check server status

- name: check server status
  wait_for:
    port: 22
    host: '{{ inventory_hostname }}'
    search_regex: OpenSSH
    delay: 10
    timeout: 60
  connection: local

运行整个角色“os_prep”后,如果角色中的任何任务的状态已“更改”,则
重新启动要触发的服务器处理程序。

notify
是任务的属性,而不是游戏的属性。因此,您应该将
notify:restart server
添加到您角色的所有任务中。假设您的所有任务都在
角色/os\u prep/tasks/main.yml
中。它看起来像这样:

---
- name: Configure this
  template:
    src: myConfig.cfg.j2
    dest: /etc/myConfig.cfg
  notify: restart server

- name: Change that
  moduleX:
    …
  notify: restart server

- name: Add users
  user:
    name: "{{ item.key }}"
    home: "/home/{{ item.key }}"
    uid: "{{ item.value.uid }}"
  with_dict: "{{ users }}"
  notify: restart server

- …
---
- name: restart server
  command: /sbin/shutdown -r now
  async: 0
  poll: 0
  ignore_errors: true
  listen: Restart and wait server

- name: check server status
  wait_for:
    port: 22
    host: '{{ inventory_hostname }}'
    search_regex: OpenSSH
    delay: 10
    timeout: 60
  connection: local
  listen: Restart and wait server
处理程序的行为将按预期进行。如果这些任务中的任何一个获得了
更改的
状态,它将在播放结束时重新启动(仅一次)

请注意,根据我的说法,您不应将
notify
应用于不需要重新启动的任务。通常只有很少的东西需要重新启动服务器。在我上面的示例中,添加用户后不需要重新启动。大多数情况下,服务重启就足够了。当然,我不知道你的用例


额外评论 附注1 我看到你把你的经纪人拴起来了。请注意,也可以使用处理程序的
listen
属性来执行此操作。在您的任务中,您需要通知:重新启动并等待服务器,您的
角色/os_prep/handlers/main.yml将如下所示:

---
- name: Configure this
  template:
    src: myConfig.cfg.j2
    dest: /etc/myConfig.cfg
  notify: restart server

- name: Change that
  moduleX:
    …
  notify: restart server

- name: Add users
  user:
    name: "{{ item.key }}"
    home: "/home/{{ item.key }}"
    uid: "{{ item.value.uid }}"
  with_dict: "{{ users }}"
  notify: restart server

- …
---
- name: restart server
  command: /sbin/shutdown -r now
  async: 0
  poll: 0
  ignore_errors: true
  listen: Restart and wait server

- name: check server status
  wait_for:
    port: 22
    host: '{{ inventory_hostname }}'
    search_regex: OpenSSH
    delay: 10
    timeout: 60
  connection: local
  listen: Restart and wait server
附注2 请注意,还有一个
重新启动
模块,可以用来代替
命令:shutdown-r


下面是文档:

它通过从所有需要重新启动服务器的任务中调用处理程序来修复,并且似乎处理程序最后只被触发一次。