У меня есть 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
Наиболее распространенным способом будет использование 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, для вас будет лучше избегать антипаттернов.
Использование переменных сделает плейбук более сложным, чем требуется, вам нужно будет объявить значения по умолчанию или определить все переменные во всех ваших условиях, чтобы предотвратить ошибку 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'
.
Позвольте мне предоставить вам структуру для автоматизации варианта использования, который вы описали:
Передайте параметры --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
Вот так? ->
ansible-playbook playbook.yml -e "upgrades_role=true custom_packages_role=true"