请考虑以下Ansible任务:
- name: stop tomcat
gather_facts: false
hosts: pod1
pre_tasks:
- include_vars:
dir: "vars/{{ environment }}"
vars:
hipchat_message: "stop tomcat pod1 done."
hipchat_notify: "yes"
tasks:
- include: tasks/stopTomcat8AndClearCache.yml
- include: tasks/stopHttpd.yml
- include: tasks/hipchatNotification.yml
这将在n个服务器上停止tomcat。我要做的是在完成此操作后发送hipchat通知。但是,此代码为任务执行所在的每个服务器发送一条单独的聊天消息。这将使多余的消息淹没hipchat窗口。在所有目标上完成stop tomcat / stop httpd任务后,是否有一种方法可以使hipchat任务发生一次?我希望任务关闭所有服务器上的tomcat,然后发送一条简短的聊天消息,说“ tomcat在pod 1上停止了”。
答案 0 :(得分:0)
您可以有条件地仅在pod1主机之一上运行hipchat通知任务。
- include: tasks/hipChatNotification.yml
when: inventory_hostname == groups.pod1[0]
或者,如果您不需要上一剧中的任何变量,则只能在本地主机上运行它。
- name: Run notification
gather_facts: false
hosts: localhost
tasks:
- include: tasks/hipchatNotification.yml
您还可以在任务本身上使用run_once标志。
- name: Do a thing on the first host in a group.
debug:
msg: "Yay only prints once"
run_once: true
- name: Run this block only once per host group
block:
- name: Do a thing on the first host in a group.
debug:
msg: "Yay only prints once"
run_once: true
答案 1 :(得分:0)
Ansible处理程序是针对此类问题而设计的,即使您在游戏中可能多次触发任务,您也希望在操作结束时运行一次任务。
您可以在剧本中定义处理程序部分,并在任务中通知它,除非有任务通知,否则这些处理程序将不会运行,并且无论被通知多少次,该处理程序都只会运行一次。
handlers:
- name: hipchat notify
hipchat:
room: someroom
msg: tomcat stopped on pod 1
在您的游戏任务中,只需在应该触发处理程序的任务上添加一个“通知”,如果它们发生更改,它将在所有任务执行完毕后运行处理程序。
- name: Stop service httpd, if started
service:
name: httpd
state: stopped
notify:
- hipchat notify