Подтвердить что ты не робот

Asible: развертывание на нескольких хостах в одно и то же время

Можно ли запустить загружаемую книгу, которая выглядит так (это пример с этого сайта: http://docs.ansible.com/playbooks_roles.html):

- name: this is a play at the top level of a file
  hosts: all
  remote_user: root
  tasks:
  - name: say hi
    tags: foo
    shell: echo "hi..."

- include: load_balancers.yml
- include: webservers.yml
- include: dbservers.yml

в многопоточном режиме?

Я хочу запустить три "включает" в одно и то же время (он все равно развертывается на разных хостах), как на этой диаграмме:

http://www.gliffy.com/go/publish/5267618

Возможно ли это?

4b9b3361

Ответ 1

По умолчанию Ansible будет пытаться работать на всех хостах параллельно. Подробнее см. эти Ansible docs. Вы также можете использовать параметр serial, чтобы ограничить количество параллельных хостов, которые вы хотите обработать в любой момент времени, поэтому, если вы хотите, чтобы playbook запускался только на одном хосте за раз, вы можете указать serial:1 и т.д..

Ansible разработан таким образом, что каждая задача будет выполняться на всех хостах, прежде чем перейти к следующей задаче. Поэтому, если у вас есть 3 задачи, это обеспечит выполнение задачи 1 на всех ваших хостах, затем выполняется задача 2, затем запускается задача 3. Подробнее об этом см. этот раздел документов Ansible.

Ответ 2

Как упоминалось ранее: По умолчанию Ansible будет пытаться запускаться на всех хостах параллельно, но задача после Task (serial).

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

1. Группы

Если у вас уже есть разные группы, вы можете запустить один экземпляр для каждой группы:

shell-1 #> ansible-playbook site.yml --limit webservers
shell-2 #> ansible-playbook site.yml --limit dbservers
shell-3 #> ansible-playbook site.yml --limit load_balancers

2. Несколько оболочек

Playbooks

Если ваши пьесы работают автономно, вы можете это сделать:

shell-1 #> ansible-playbook load_balancers.yml
shell-2 #> ansible-playbook webservers.yml
shell-3 #> ansible-playbook dbservers.yml

Limit

Если нет, вы можете позволить ansible сделать фрагментацию. Когда у вас есть 6 хостов и вы хотите запустить 3 экземпляра с двумя хостами, вы можете сделать что-то вроде этого:

shell-1 #> ansible-playbook site.yml --limit all[0-2]
shell-2 #> ansible-playbook site.yml --limit all[2-4]
shell-3 #> ansible-playbook site.yml --limit all[4-6]

3. Фон

Конечно, вы можете использовать одну оболочку и ставить задачи в фоновом режиме, простой пример:

shell-1 #> ansible-playbook site.yml --limit all[0-2] &
shell-1 #> ansible-playbook site.yml --limit all[2-4] &
shell-1 #> ansible-playbook site.yml --limit all[4-6] &

С помощью этого метода вы получаете весь вывод, смешанный вместе в одном терминале. Чтобы избежать этого, вы можете записать вывод в разные файлы.

ansible-playbook site.yml --limit all[0-2] > log1 &
ansible-playbook site.yml --limit all[2-4] > log2 &
ansible-playbook site.yml --limit all[4-6] > log3 &

4. Лучшие решения

Может быть, лучше использовать такой инструмент, как tmux/screen, чтобы запускать экземпляры в виртуальных оболочках.

Или посмотрите "режим огненного шара": http://jpmens.net/2012/10/01/dramatically-speeding-up-ansible-runs/

Если вы хотите узнать больше о лимитах, посмотрите здесь: https://docs.ansible.com/playbooks_best_practices.html#what-this-organization-enables-examples

Ответ 3

Как и в случае с Ansible 2.0, в playbook есть опция, называемая strategy. При настройке стратегии на free, playbook воспроизводит задания на каждом хосте, не дожидаясь остальных. См. http://docs.ansible.com/ansible/playbooks_strategies.html.

Это выглядит примерно так (взято из приведенной выше ссылки):

- hosts: all
  strategy: free
  tasks:
  ...

Обратите внимание, что я не проверял это, и я очень новичок в Ansible. Мне было просто любопытно, как вы описали себя, и, как оказалось, приступили к этой стратегии.

EDIT:

Кажется, это не совсем то, что вы пытаетесь сделать. Возможно, "асинхронные задачи" более уместны, как описано здесь: http://docs.ansible.com/ansible/playbooks_async.html.

Это включает указание async и poll на задание. Из второй ссылки, о которой я упоминал, взято следующее:

- name: simulate long running op, allow to run for 45 sec, fire and forget
  command: /bin/sleep 15
  async: 45
  poll: 0

Я думаю, вы можете указать более длинные async раз, если ваша задача длительная. Вероятно, вы можете определить свою три параллельные задачи таким образом.

Ответ 4

В моем случае мне нужно, чтобы этап конфигурации блокировался в целом, но выполнял каждую роль параллельно. Я решил эту проблему, используя следующий код:

echo webserver loadbalancer database | tr ' ' '\n' \
| xargs -I % -P 3 bash -c 'ansible-playbook $1.yml' -- %

аргумент -P 3 в xargs гарантирует, что все команды выполняются параллельно, каждая команда выполняет соответствующую игру, а команда в целом блокирует, пока все части не будут завершены.