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 了解更多详情。
我正在 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 了解更多详情。