Как запустить ответную задачу только один раз, независимо от количества целей - PullRequest
1 голос
/ 02 апреля 2019

Рассмотрим следующую задачу 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

Это останавливает tomcat на n серверах.То, что я хочу сделать, это отправить hipchat уведомление, когда это будет сделано.Тем не менее, этот код отправляет отдельное сообщение для каждого сервера, на котором выполняется задача.Это наводняет окно hipchat с избыточными сообщениями.Есть ли способ заставить задачу hipchat произойти один раз после выполнения задач stop tomcat / stop httpd для всех целей?Я хочу, чтобы задача выключила tomcat на всех серверах, а затем отправила одно сообщение в чате с сообщением «tomcat остановлен на модуле 1».

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Ansible handlers созданы для этого типа проблемы, когда вы хотите выполнить задачу один раз в конце операции, даже если она была запущена несколько раз в игре.

Вы можете определить раздел обработчика в своей книге игр и уведомить об этом в задачах, обработчики не будут запускаться, пока не получено уведомление от задачи, и будут выполняться только один раз, независимо от того, сколько раз они были уведомлены.

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
0 голосов
/ 02 апреля 2019

Вы можете условно запустить задачу уведомления hipchat только на одном из хостов pod1.

- 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...