Ansible 定义自定义服务路径,仅在服务重启时通知

Ansible define a custom service path and notify only if the service is restarted

我正在 AIX 上进行新的 opsware 代理服务检查,它的代理路径是 /etc/rc.d/init.d/opsware-agent。

首先请告诉我如何定义这个变量路径和调用服务。

其次,只有当此 opsware 代理服务已重新启动时,它才应该 运行 命令。怎么办,下面一个不行。

- name: Ensure Opsware agent is running on AIX 
service: name={{ aix_service_path }} state=started enabled=yes
register: aix_status


 - name: Opsware AIX Notify only if it failed
 when: aix_status|success
 notify:
 - hardware refresh
 - software refresh

- name: hardware refresh
command: chdir=/opt/opsware/agent/pylibs/cog/ ./bs_hardware

- name: software refresh
command: chdir=/opt/opsware/agent/pylibs/cog/ ./bs_Software

让我假设 YML 格式是正确的,只是在您的 post 中被破坏了。否则你首先需要正确地缩进你的行。

然后确保您的处理程序在 handlers/main.yml 内。在你的 post 中,看起来所有内容都在同一个文件中,然后当然会在每次播放时执行。

你终于可以在服务任务中触发你的处理程序了,不需要虚拟任务,因为实际上没有定义任何动作,它也不会工作。

所以这应该有效:

your_role/tasks/main.yml:

---

- name: Ensure Opsware agent is running on AIX 
  service: name={{ aix_service_path }} state=started enabled=yes
  notify:
  - hardware refresh
  - software refresh

...

your_role/handlers/main.yml:

---

- name: hardware refresh
  command: chdir=/opt/opsware/agent/pylibs/cog/ ./bs_hardware

- name: software refresh
  command: chdir=/opt/opsware/agent/pylibs/cog/ ./bs_Software

...

仅当服务状态为changed时才会通知处理者。

如何定义 aix_service_path 取决于您要存档的内容。您可以在 your_role/defaults/main.yml:

中定义默认值
---

aix_service_path: foo

...

或者通过在 your_role/vars/main.yml 中定义它来强制它 - 与上面的默认格式相同。

您可以在剧本中的角色调用中传递参数,例如

  roles:
    - role: your_role
      aix_service_path: foo

像这样传递的参数将覆盖 defaults/main.yml 中的定义,但不会覆盖 vars/main.yml 中定义的定义。

您可以在剧本的 vars 部分定义它。

您可以在调用 playbook 时通过命令行传递它。

ansible-playbook ... --extra-vars "aix_service_path=foo"

或者将其定义为服务器或组变量。您也可以在清单中定义变量...确实有大量用于定义变量的选项。你必须决定哪个适合你的需要。查看 variables section in the Ansible docs 了解更多详情。