Ansible: Как запустить один Task Host за хостом?

15

На игровом уровне мы должны serial: 1разрешить запускать всю игру по одному хосту за раз. Но я не нашел простого способа сделать это для одной задачи. Это особенно актуально, если рассматриваемая задача не выполняет надлежащую блокировку (по какой-либо причине).

Один очевидный ответ - поставить задачу в свою игру. Но это не помогает с ролями. (Необходимость поставить serial: 1пьесу с использованием роли не очень интуитивно понятна.)

Элронд
источник

Ответы:

11

Если вы не хотите какого-либо параллелизма при выполнении шагов из вашей книги игр, установите уровень разветвления на 1:

ansible-playbook --forks=1 ...

Вы также можете поместить это в свой ANSIBLE файл CFG:

[defaults]
forks=1

но если вы хотите это индивидуально, используйте параметр командной строки выше.

РЕДАКТИРОВАТЬ:

serial: 1делает что-то совершенно другое: это похоже на запуск playbook для каждого хоста по очереди, ожидание завершения завершения playbook перед тем, как перейти к следующему хосту. forks=1означает запуск первой задачи в игре на одном хосте до запуска той же задачи на следующем хосте, поэтому первая задача будет запускаться для каждого хоста до того, как будет затронута следующая задача.

Итак, вы хотите forks=1всего одну игру; к сожалению, в настоящее время это невозможно.

wurtel
источник
2
Я не хотел ставить это на всю пьесу. Это очень не гранулировано. serial: 1позвольте мне поставить его на игру по крайней мере. Но я только хочу поставить его на подпункт пьесы (какое бы правильное имя это ни было. Я думал, это было «задание», но приведенный выше комментарий, похоже, не согласен).
Элронд
3
serial: 1делает что-то совершенно другое: это похоже на запуск playbook для каждого хоста по очереди, ожидание завершения завершения playbook перед тем, как перейти к следующему хосту. forks=1означает запуск первой задачи в игре на одном хосте до запуска той же задачи на следующем хосте, поэтому первая задача будет запускаться для каждого хоста до того, как будет затронута следующая задача. Итак, вы хотите forks=1всего одну игру; к сожалению, в настоящее время это невозможно.
wurtel
Хорошая точка зрения! Не могли бы вы добавить это к ответу?
Элронд
2

Существует обходной путь для этой проблемы - можно передать список хостов (или группу) with_items, а затем использовать delegate_toс этим списком. Таким образом, задача будет выполняться хост за хостом.

Например:

- name: start and enable rabbitmq (run task host by host)
  service:
    name: "rabbitmq-server"
    state: "started"
    enabled: true
  delegate_to: "{{ item }}"
  with_items: "{{ groups['rabbitmq-cluster'] }}"
  run_once: true
Томаш Клосински
источник
Для тех, кто интересуется, почему run_once: trueтам, попробуйте вынуть его. Вам не понравится то, что происходит. (так много повторений, аааахххх)
Алменон
1

Если вы выполняете его на одной машине, то возникает проблема исключительных блокировок для более чем одного хоста. Так что вы должны выполнить один за другим для всех хостов. Для этого вам нужно --forks=1быть настроенным при вызове команды ansible playbook. Для примера: ansible-playbook webserver.yml --forks=1где webserver.yml имеет app01 и app02 внутри вашего[webserver]

Рохан Сет
источник
0

Думай что хочешь

run_once: true

user19151
источник
4
nope: «run_once: true» означает запускать задачу только для одного хоста в списке хостов. Я хочу запустить его для каждого хоста в списке, но один за другим.
Элронд,
0

Для команд, которые могут выполняться локально, используйте цикл для перебора всех хостов в игре. Это ТОЛЬКО работает, если команда может быть запущена локально. Таким образом, вы также можете запустить команду с ssh на удаленных машинах одну за другой, если ключи настроены, но это становится трудным, когда речь идет об эскалации.

НАПРИМЕР:

- name: Init New Appliances - Remove the known hosts entry for the server in case it has changed
  run_once: yes
  connection: local
  become: no
  command: "ssh-keygen -R {{ item }}"
  with_items:
  - "{{ inventory_hostname }}"
Michele
источник
1
Вы должны предоставить список хостов, а не только на именованных хостах inventory_hostname, иначе цикл не имеет смысла.
Константин Суворов