Это для набора хостов, где не более одного хоста со службой могут быть отключены одновременно, а настройка хоста может быть сложной процедурой. Я уже пробовал serial: 1
(это непрерывное обновление в терминах Ansible), --limit $host
, --fork 1
. Все они работают нежелательным образом: все еще выполняется игра за игрой, а не хост за хостом.
Вот текущие свойства и желаемые для решения (это вопрос предмета, и есть возможность переписать решение с нуля):
Ищете, как:
Посоветуйте, пожалуйста: как этого добиться?
Ниже представлены упрощенные части набора пьес. Он был создан и в целом работает.
Моя игра высшего уровня site.yaml
---
- name: Site set up
hosts:
- masters
- replicas
serial: 1
roles:
- role: do-01
- role: do-02
- import_playbook: play-do-11.yaml
- import_playbook: play-do-12.yaml
У меня есть игровые книжки: play-do-11.yaml
, play-do-12.yaml
как это:
---
- name: play-do-11
hosts: satellites
serial: 1
roles:
- role: actor
Я запускаю Ansible playbook таким образом:
for single_host in host-a host-b host-c ; do
ansible-playbook \
--forks 1 \
--limit "$single_host" \
--inventory inventory.json \
"site.yaml"
done
P.S. Это выходит за рамки, но добавляет гибкости решению, которое я ищу. Фактически у меня есть динамический инвентарь. Его можно запустить перед запуском любых других предметов. Есть автоматически добавляемая группа с простым списком всех хостов в инвентаре. Таким образом, я могу создать предварительно сгенерированный Json, и перед запуском у меня все имена хостов представлены в виде простых строк. Он используется в пусковой установке Shell следующим образом:
for host in $( cat inventory.json | jq -r ".\"group-with-all\".hosts | keys[]" ) ; do
ansible-playbook --limit "${host}" ...
done
Этого достаточно для автоматизации: группировка хостов и свойства по-прежнему управляются в одном месте.
Q «Все игры должны проводиться на первом хосте и заканчиваться. Все игры должны проводиться на втором хосте и заканчиваться. И так далее на произвольном количестве хозяев».
A: Это невозможно. Объем серийный и стратегия это игра. Все хозяева должны завершить игру до начала следующей. Импорт сборника пьес эквивалентен началу новой пьесы.
Q: "Если хост не входит в группу для playbook, игра не должна применяться на этом хосте ».
О: Можно создать новую группу в первом воспроизведении и использовать ее в импортированных плейбуках. Например инвентарь
shell> cat hosts
[test]
test_01
test_02
test_03
[satellites]
test_03
и пьеса
shell> cat play-do-11.yml
- hosts: my_dynamic_group
tasks:
- debug:
var: inventory_hostname
импортировано из playbook
shell> cat site.yml
- hosts: test
tasks:
- add_host:
name: "{{ item }}"
groups: my_dynamic_group
loop: "{{ groups.test }}"
when: item in groups.satellites
run_once: true
- debug:
var: inventory_hostname
- import_playbook: play-do-11.yml
дает
shell> ansible-playbook site.yml
PLAY [test] ***
TASK [add_host] ***
skipping: [test_01] => (item=test_01)
skipping: [test_01] => (item=test_02)
changed: [test_01] => (item=test_03)
TASK [debug] ***
ok: [test_01] => {
"inventory_hostname": "test_01"
}
ok: [test_03] => {
"inventory_hostname": "test_03"
}
ok: [test_02] => {
"inventory_hostname": "test_02"
}
PLAY [my_dynamic_group] ***
TASK [debug] ***
ok: [test_03] => {
"inventory_hostname": "test_03"
}
PLAY RECAP ***