Назад | Перейти на главную страницу

Как мне запустить все игры Ansible на первом хосте (все они), затем на втором хосте (все) и так далее - хостах один за другим?

Это для набора хостов, где не более одного хоста со службой могут быть отключены одновременно, а настройка хоста может быть сложной процедурой. Я уже пробовал 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 ***