Как выполнить Play 2, только если Play 1 преуспевает в Ansible - PullRequest
0 голосов
/ 29 марта 2020

У меня есть два пьесы, каждая из которых выполняет одно задание.

При первом воспроизведении проверяется, существует ли /var/test.dat на каждой цели. Только если первая игра прошла успешно, я хочу запустить вторую игру, которая выполняет эти сценарии параллельно.

Если первая игра не удалась, т.е. test.dat не существует, я буду sh завершать игру без выполнения второй пьесы. Для этой цели я установил any_errors_fatal в значение true

Мне нужно, чтобы ansible Play strategy был установлен как свободный, поскольку для выполнения каждого из сценариев требуется 30 минут.

Мое понимание ansible ограничено.

Я понимаю, что если у меня есть обе задачи в одном PLAY и я настроил стратегию освобождения, обе задачи будут выполняться параллельно, чего я не хочу.

---
- name: Play 1- check for login and script
  hosts: all_hosts
  any_errors_fatal: true
  strategy: free
  tasks:

   - name: Check script existence
     shell: "ls /var/test.dat"
     register: checkscript
   - name:
     fail:
       msg: "script {{ scriptdet }} missing on {{ inventory_hostname }}"
     when: checkscript.rc != 0

- name: Play 2- Run scripts
  hosts: all_hosts
  user: "{{ USER }}"
  strategy: free
  tasks:
   - name: Execute backup script
     shell: "{{ scriptdet }}"
     args:
       chdir: ~/..

I попробовал описанную выше книгу, но я вижу, что вторая игра выполняется, несмотря на то, что задача первой игры не выполнена.

Подскажите, пожалуйста, как мне заставить это работать?

1 Ответ

0 голосов
/ 29 марта 2020

Если значение any_errors_fatal равно true - Ansible завершит работу sh на всех хостах - даже если какой-то другой хост вышел из строя. Однако, как вы узнали, any_errors_fatal не работает со свободной стратегией.

Также невозможно создать глобальную переменную.

Однако вы упомянули, что хотите использовать бесплатную стратегию, чтобы ускорить выполнение. Однако свободная стратегия только предотвращает «блокирование новых задач для узлов, которые уже завершили». .

Если вам нужно выполнить ту же задачу, не дожидаясь, пока другие узлы завершат работу sh, вам нужен параллелизм. Стратегия не имеет ничего общего с параллелизмом.

В Ansible количество параллельных хостов регулируется с помощью forks. Однако значение по умолчанию очень низкое, и составляет всего 5.

Вам нужно установить это число выше - в зависимости от используемых вами ресурсов хоста. По моему опыту с хорошим количеством процессора и памяти, это можно настроить на сотни.

Вы можете установить это либо в ansible.cfg, либо в командной строке :

ansible-playbook -f 30 my_playbook.yml

Таким образом, вы можете использовать линейную стратегию по умолчанию, где any_errors_fatal имеет значение true.

...