На игровом уровне у нас есть serial: 1
чтобы мы могли запускать всю игру на одном хосте за раз. Но я не нашел простого способа сделать это для одной задачи. Это особенно актуально, если рассматриваемая задача не выполняет надлежащую блокировку (по какой-либо причине).
Один очевидный ответ - поставить задачу по-своему. Но с ролями это не помогает. (Нужно поставить serial: 1
в пьесе использование роли не совсем интуитивно понятно.)
Если вы не хотите параллелизма в выполнении шагов в вашей книге, установите уровень вилки на 1:
ansible-playbook --forks=1 ...
Вы также можете поместить это в свой доступный файл cfg:
[defaults]
forks=1
но если вы хотите это индивидуально, используйте указанную выше опцию командной строки.
РЕДАКТИРОВАТЬ:
serial: 1
делает что-то совершенно другое: это похоже на запуск playbook для каждого хоста по очереди, ожидание завершения playbook перед переходом к следующему хосту. forks=1
означает запуск первой задачи в игре на одном хосте перед запуском той же задачи на следующем хосте, поэтому первая задача будет запущена для каждого хоста до того, как будет затронута следующая задача.
Так ты хочешь forks=1
всего за один спектакль; к сожалению, в настоящее время это невозможно.
Есть обходной путь к этой проблеме - можно передать список хостов (или группу) в 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
Вы можете запускать одну задачу последовательно (т.е. хост за хостом), добавив throttle: 1
к нему.
Пример:
---
- hosts: all
tasks:
- name: wait in parallel
command: sleep 20
- name: wait in serial
command: sleep 30
throttle: 1
Ссылки:
Если вы выполняете его на одной машине, то проблема эксклюзивных блокировок возникает для более чем одного хоста. Поэтому вы должны выполнять его по одному для всех хостов. Для этого вам необходимо иметь --forks=1
устанавливается при вызове команды ansible playbook. Например: ansible-playbook webserver.yml --forks=1
где webserver.yml имеет app01 и app02 внутри твоего [webserver]
Для команд, которые можно запускать локально, используйте цикл для перебора всех хостов в игре. Это работает ТОЛЬКО в том случае, если команду можно запустить локально. Вы также можете запустить команду с 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 }}"
Подумайте, что вы хотите
run_once: правда