【问题标题】:ansible - run handler only if any task in role changedansible - 仅当角色中的任何任务更改时才运行处理程序
【发布时间】:2019-12-23 19:35:45
【问题描述】:

我为reboot server 创建了一个处理程序,并且我有一个角色,它使用多个配置设置操作系统(此角色中大约有 6 个任务),并且我只想在整个任务中的任何一个任务时触发reboot server 处理程序角色发生变化,整个角色完成后也会发生变化。

我试图在该角色的剧本中添加“通知”。但出现ERROR! 'notify' is not a valid attribute for a Play

的错误

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' 后,如果角色中的任何任务具有 'changed' 状态,则触发 restart server 处理程序。

【问题讨论】:

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

标签: ansible yaml handler roles


【解决方案1】:

notify 是任务的属性,而不是游戏的属性。因此,您应该将notify: restart server 添加到您角色的所有任务中。假设您的所有任务都在roles/os_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

- …

处理程序的行为将按照您的预期进行。如果这些任务中的任何一个获得changed 状态,它将在播放结束时运行重新启动(仅一次)。

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


额外的cmets

注 1

我看到你链接你的处理程序。请注意,您也可以使用处理程序的 listen 属性来执行此操作。在你的任务中你宁愿notify: Restart and wait server,你的roles/os_prep/handlers/main.yml 看起来像这样:

---
- 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

请注意,还有一个reboot 模块可以用来代替command: shutdown -r

这里是文档:https://docs.ansible.com/ansible/latest/modules/reboot_module.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多