Ansible Playbook: Как запустить Play в зависимости от условий? - PullRequest
0 голосов
/ 24 марта 2020

У меня есть книга с несколькими пьесами. Вот как это выглядит:

- name: Play A
  hosts: localhost
  roles:
    - do task to get either B or C

- name: Play B
  hosts: Host B
  roles:
    - do necessary task

- name: Play C
  hosts: Host C
  roles:
    - do necessary task

- name: Play D
  host: localhost
  roles:
    - create_logs

Всякий раз, когда воспроизводится книга воспроизведения, она сначала запускает первую игру, чтобы получить результат B или C.

Результатом является определение атрибута хоста для запуска воспроизведения, такого как IP-адрес и ОС хоста.

После этого на основе результата, например, если результат B, я буду запускать Play B и пропустить игру C.

В противном случае, если получится C, я пропущу игру B и начну игру C.

Воспроизведение D будет запускаться как последнее Воспроизведение независимо от результата предыдущих проигрываний.

Как я могу это сделать? Я пытался использовать условие «когда», но он сказал, что это не атрибут Play.

Ответы [ 4 ]

1 голос
/ 25 марта 2020

Вы можете разделить пьесы на разные файлы Playbook, добавить задачу в Play A, которая использует модуль include для условного включения Play B или Play C. Затем добавьте задачу «include play D» после задач «include Play B / C».

1 голос
/ 25 марта 2020

Я не пробовал, но вы можете установить хост в первой игре / роли с помощью модуля set_fact. Таким образом, вы можете использовать эту переменную для назначения хоста в следующих играх.

Или вместо этого использовать динамические c группы: https://docs.ansible.com/ansible/latest/modules/group_by_module.html

1 голос
/ 24 марта 2020

Вы можете добавить условие when к своей роли.

- name: Play B
  hosts: Host B
  roles:
    - role: my_b_role
      when: my_condition | bool

Недостатком является то, что вам нужно добавить условие к любой роли или задаче в вашей игре.

0 голосов
/ 26 марта 2020

Я нашел другой способ, как это сделать. Разница между хостом B и хостом C заключается только в IP-адресе и типе ОС.

Следовательно, я редактирую файл инвентаризации / хостов и refresh_inventory после того, как воспроизведение завершило необходимое задание, когда воспроизводится книга воспроизведения, затем, прежде чем завершить последнее задание, я редактирую обратно файл инвентаризации / хостов в его значение по умолчанию, которое У меня есть настройки.

родительская пьеса:

- name: Play A
  hosts: localhost
  roles:
    - do task to get either B or C
    - edit/replace ip address & host type for the targeted hosts in inventory/hosts file with using when condition
    - refresh_inventory

- name: Play B_C
  hosts: switches_host
  roles:
    - do necessary task

- name: Play D
  host: localhost
  roles:
    - create_logs
    - - edit/replace back to initial value

инвентарь:

switches_host:
      ansible_host: s.s.s.s
      ansible_user: user
      ansible_ssh_pass: pswd
      ansible_network_os: xo.sx

...