Могу ли я использовать ansible-playbook "--extra-vars" для условного выполнения ролей

У меня есть Ansible playbook, над которым я работаю, и я пытаюсь сделать выполнение немного более динамичным. У меня есть две роли, которые не всегда нужно запускать вместе, иногда нужно запускать только одну из них. Я копался в документах Ansible, и мне интересно, могу ли я передать параметры --extra-vars только для запуска определенной роли.

На данный момент мой плейбук выглядит так:

---
- hosts: default
  become: true

  roles:
      - role: upgrades
        when: {{ upgrades_role }}

      - role: custom-packages 
        when: {{ custom_packages_role }}

Итак, цель состоит в том, чтобы иметь возможность запускать:

ansible-playbook playbook.yml -e "upgrades_role=upgrades"

И это запустит только роль upgrades и пропустит роль custom_packages.

Точно так же, если я хочу запустить обе роли на одном хосте/системе:

ansible-playbook playbook.yml -e "upgrades_role=upgrades custom_packages_role=custom-packages"

Это будет выполнять обе роли.

Основываясь на моем понимании синтаксиса Ansible и параметра --extra-vars, -e, кажется, что это должно работать. Я просто хочу быть уверен, что делаю это правильно и избегаю анти-шаблонов.

Ансибл версия: 2.14

Введение в Ansible Roles
Введение в Ansible Roles
Ansible - это отличный инструмент управления конфигурацией, который можно использовать для автоматизации настройки или развертывания на большом...
1
0
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Наиболее распространенным способом будет использование tags; обновление примера в вопросе:

---
- hosts: default
  become: true

  roles:
      - role: upgrades
        tags: upgrades

      - role: custom-packages 
        tags: packages
...

Итак, цель состоит в том, чтобы иметь возможность запускать:

# Execute all the roles
ansible-playbook playbook.yml

# Execute only the upgrade
ansible-playbook playbook.yml -t upgrades

# Execute only the setup of custom packages
ansible-playbook playbook.yml -t packages

Вот документация для тегов .

Использование переменных и when возможно, но вам нужно убедиться, что оно приведено к bool.

Вот так? -> ansible-playbook playbook.yml -e "upgrades_role=true custom_packages_role=true"

Oxth 11.02.2023 06:04

пожалуйста, избегайте использования переменных для этого, если вы начинаете использовать Ansible, для вас будет лучше избегать антипаттернов.

Carlos Monroy Nieblas 11.02.2023 08:02

Использование переменных сделает плейбук более сложным, чем требуется, вам нужно будет объявить значения по умолчанию или определить все переменные во всех ваших условиях, чтобы предотвратить ошибку The conditional check '{{ upgrades_role }}' failed. The error was: error while evaluating conditional ({{ upgrades_role }}): 'upgrades_role' is undefined\n\nThe error appears to be in 'playbook.yaml'.

Carlos Monroy Nieblas 11.02.2023 08:07

Позвольте мне предоставить вам структуру для автоматизации варианта использования, который вы описали:

Передайте параметры --extra-vars, чтобы запустить только определенную роль

Создать проект

shell> ls -1
ansible.cfg
hosts
playbook.yml.j2
roles
setup.yml
shell> cat ansible.cfg 
[defaults]
gathering = explicit
collections_path = $HOME/.local/lib/python3.9/site-packages/
inventory = $PWD/hosts
roles_path = $PWD/roles
retry_files_enabled = false
stdout_callback = yaml
shell> cat hosts 
localhost

Настройка playbook.yml

  • Получает список ролей. Подгоните переменную my_roles_dir под свои нужды.

  • Создает файл my_roles_order.yml со списком my_roles_order. Целью этого файла является создание порядка ролей.

  • Создает файл my_roles_enable.yml со словарем my_roles_enable. Целью этого файла является создание значений по умолчанию.

  • Создает файл playbook.yml из шаблона. Подгоните шаблон под свои нужды.

shell> cat setup.yml 
- hosts: localhost

  vars:

    my_roles_dir: "{{ lookup('config', 'DEFAULT_ROLES_PATH') }}"

  tasks:

    - set_fact:
        my_roles: "{{ my_roles|default([]) +
                      lookup('pipe', 'ls -1 ' ~ item).splitlines() }}"
      loop: "{{ my_roles_dir }}"

    - copy:
        dest: "{{ playbook_dir }}/my_roles_order.yml"
        content: |
          my_roles_order:
          {{ my_roles|to_nice_yaml|indent(2, true) }}
        force: "{{ my_roles_order_force|default(false) }}"
    - include_vars: my_roles_order.yml

    - copy:
        dest: "{{ playbook_dir }}/my_roles_enable.yml"
        content: |
          my_roles_enable:
          {% for role in my_roles %}
            {{ role }}: false
          {% endfor %}
        force: "{{ my_roles_enable_force|default(false) }}"
    - include_vars: my_roles_enable.yml

    - template:
        src: playbook.yml.j2
        dest: "{{ playbook_dir }}/playbook.yml"
shell> cat playbook.yml.j2
- hosts: localhost
  become: true

  vars_files:
    - my_roles_enable.yml

  roles:
{% for role in my_roles_order %}
    - role: {{ role }}
      when: {{ role }}_role|default(my_roles_enable.{{ role }})|bool
{% endfor %}

Испытайте тривиальные роли

shell> tree roles/
roles/
├── current_packages
│   └── tasks
│       └── main.yml
├── custom_packages
│   └── tasks
│       └── main.yml
├── stable_packages
│   └── tasks
│       └── main.yml
└── upgrades
    └── tasks
        └── main.yml

8 directories, 4 files
shell> cat roles/*/tasks/main.yml
- debug:
    msg: Role current_packages running ...
- debug:
    msg: Role custom_packages running ...
- debug:
    msg: Role stable_packages running ...
- debug:
    msg: Role upgrades running ...

Запустите playbook setup.yml

shell> ansible-playbook setup.yml

PLAY [localhost] ****************************************************************************************

TASK [set_fact] *****************************************************************************************
ok: [localhost] => (item=/scratch/tmp7/test-204/roles)

TASK [copy] *********************************************************************************************
changed: [localhost]

TASK [include_vars] *************************************************************************************
ok: [localhost]

TASK [copy] *********************************************************************************************
changed: [localhost]

TASK [include_vars] *************************************************************************************
ok: [localhost]

TASK [template] *****************************************************************************************
changed: [localhost]

PLAY RECAP **********************************************************************************************
localhost: ok=6    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Это создает playbook.yml

shell> cat playbook.yml
- hosts: localhost
  become: true

  vars_files:
    - my_roles_enable.yml

  roles:
    - role: current_packages
      when: current_packages_role|default(my_roles_enable.current_packages)|bool
    - role: custom_packages
      when: custom_packages_role|default(my_roles_enable.custom_packages)|bool
    - role: stable_packages
      when: stable_packages_role|default(my_roles_enable.stable_packages)|bool
    - role: upgrades
      when: upgrades_role|default(my_roles_enable.upgrades)|bool

и файлы

shell> cat my_roles_order.yml
my_roles_order:
  - current_packages
  - custom_packages
  - stable_packages
  - upgrades
shell> cat my_roles_enable.yml
my_roles_enable:
  current_packages: false
  custom_packages: false
  stable_packages: false
  upgrades: false

По умолчанию playbook ничего не запускает. Здесь вы можете «передать параметры --extra-vars, чтобы запустить только определенную роль». Например, включите обновления роли

shell> ansible-playbook playbook.yml -e upgrades_role=true

PLAY [localhost] *****************************************************************************

TASK [current_packages : debug] **************************************************************
skipping: [localhost]

TASK [custom_packages : debug] ***************************************************************
skipping: [localhost]

TASK [stable_packages : debug] ***************************************************************
skipping: [localhost]

TASK [upgrades : debug] **********************************************************************
ok: [localhost] => 
  msg: Role upgrades running ...

PLAY RECAP ***********************************************************************************
localhost: ok=1    changed=0    unreachable=0    failed=0    skipped=3    rescued=0    ignored=0

Если вы хотите изменить порядок и/или значения по умолчанию для ролей, отредактируйте файлы my_roles_order.yml и my_roles_enable.yml. Например, поставить обновление роли на первое место и включить его по умолчанию.

shell> cat my_roles_order.yml
my_roles_order:
  - upgrades
  - current_packages
  - custom_packages
  - stable_packages
shell> cat my_roles_enable.yml
my_roles_enable:
  current_packages: false
  custom_packages: false
  stable_packages: false
  upgrades: true

Обновите плейбук

shell> ansible-playbook setup.yml

Попробуй это

shell> ansible-playbook playbook.yml

PLAY [localhost] *****************************************************************************

TASK [upgrades : debug] **********************************************************************
ok: [localhost] => 
  msg: Role upgrades running ...

TASK [current_packages : debug] **************************************************************
skipping: [localhost]

TASK [custom_packages : debug] ***************************************************************
skipping: [localhost]

TASK [stable_packages : debug] ***************************************************************
skipping: [localhost]

PLAY RECAP ***********************************************************************************
localhost: ok=1    changed=0    unreachable=0    failed=0    skipped=3    rescued=0    ignored=0

Практично создать файл, если вы хотите включить/отключить несколько ролей в командной строке. Например,

shell> cat myroles.yml 
upgrades_role: false
stable_packages_role: true
custom_packages_role: true

Используйте его в командной строке

shell> ansible-playbook playbook.yml -e @myroles.yml

PLAY [localhost] *****************************************************************************

TASK [upgrades : debug] **********************************************************************
skipping: [localhost]

TASK [current_packages : debug] **************************************************************
skipping: [localhost]

TASK [custom_packages : debug] ***************************************************************
ok: [localhost] => 
  msg: Role custom_packages running ...

TASK [stable_packages : debug] ***************************************************************
ok: [localhost] => 
  msg: Role stable_packages running ...

PLAY RECAP ***********************************************************************************
localhost: ok=2    changed=0    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0

Не отображать пропущенные хосты

shell> ANSIBLE_DISPLAY_SKIPPED_HOSTS=false ansible-playbook playbook.yml -e @myroles.yml

PLAY [localhost] *****************************************************************************

TASK [custom_packages : debug] ***************************************************************
ok: [localhost] => 
  msg: Role custom_packages running ...

TASK [stable_packages : debug] ***************************************************************
ok: [localhost] => 
  msg: Role stable_packages running ...

PLAY RECAP ***********************************************************************************
localhost: ok=2    changed=0    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0

Другие вопросы по теме