无论有多少目标,如何只执行一次ansible任务

时间:2019-04-02 18:41:29

标签: ansible hipchat

请考虑以下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上停止了”。

2 个答案:

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