Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ansible定义自定义服务路径并仅在服务重新启动时通知_Ansible_Ansible Playbook - Fatal编程技术网

Ansible定义自定义服务路径并仅在服务重新启动时通知

Ansible定义自定义服务路径并仅在服务重新启动时通知,ansible,ansible-playbook,Ansible,Ansible Playbook,我正在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

我正在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格式是正确的,只是在你的帖子中被破坏了。否则,首先需要正确缩进行

然后确保处理程序位于
handlers/main.yml
内。在你的帖子里,看起来所有的东西都在同一个文件里,当然每个剧本都会被执行

最后,您可以在服务任务中触发处理程序,而无需使用虚拟任务,因为实际上没有定义操作,因此虚拟任务也无法工作

因此,这应该是可行的:

你的角色/任务/main.yml:

---

- name: Ensure Opsware agent is running on AIX 
  service: name={{ aix_service_path }} state=started enabled=yes
  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

...
你的角色/handlers/main.yml:

---

- name: Ensure Opsware agent is running on AIX 
  service: name={{ aix_service_path }} state=started enabled=yes
  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

...
仅当服务状态更改时才会通知处理程序

如何定义
aix\u服务\u路径取决于要归档的内容。您可以在
您的_role/defaults/main.yml
中定义默认值:

---

aix_service_path: foo

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

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

  roles:
    - role: your_role
      aix_service_path: foo
这样传递的参数将覆盖
defaults/main.yml
中的定义,但不会覆盖
vars/main.yml
中定义的定义

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

ansible-playbook ... --extra-vars "aix_service_path=foo"
您可以在调用playbook时在命令行上传递它

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

或者将其定义为服务器或组变量。您还可以在清单中定义变量。。。定义变量确实有很多选择。你必须决定哪一个适合你的需要。有关更多详细信息,请查看。

谢谢。关于在/vars/main.yml中定义角色后的“角色:您的角色”,我应该将此角色称为何处?我的意思是我应该把这个角色称为/tasks/main.yml吗?如果是,如何执行此操作。角色将在剧本中引用。建议在剧本中不要包含任务,而只包含角色,在角色中包含所有任务。看看这里,您可以看到一个基本的目录结构,包括一个示例角色:@udondan Handlers可以位于同一个playbook文件中,只要它们位于
Handlers:
块下。看,是的,但我们只喜欢剧本中的角色,不是吗D