Управление поведением Ansible: правила приоритета
Для максимальной гибкости в управлении вашими средами Ansible предлагает множество способов управления его поведением: как он подключается к управляемым узлам и как работает после подключения. Если вы используете Ansible для управления большим количеством серверов, сетевых устройств и ресурсов облака, вы можете определить поведение Ansible в нескольких разных местах и передать эту информацию Ansible различными способами. Эта гибкость удобна, но может сработать против вас, если вы не понимаете правила приоритета.
Эти правила приоритета применяются к любому параметру, который можно определить несколькими способами (с помощью настроек конфигурации, параметров командной строки, ключевых слов playbook, переменных).
- Настройки конфигурации
- Параметры командной строки
- Ключевые слова playbook
- Использование дополнительных переменных -e в командной строке
Категории приоритета
Ansible предлагает четыре источника для управления своим поведением. В порядке приоритета от низшего (легче всего переопределяется) к высшему (переопределяет все остальные), категории следующие:
- Настройки конфигурации
- Параметры командной строки
- Ключевые слова playbook
- Переменные
Каждая категория переопределяет любую информацию из категорий с более низким приоритетом. Например, ключевое слово playbook переопределяет любую настройку конфигурации.
Внутри каждой категории приоритета применяются определенные правила. Однако, как правило, «последнее определенное» значение побеждает и переопределяет все предыдущие определения.
Настройки конфигурации
Настройки конфигурации включают значения из файла ansible.cfg и переменные окружения. В рамках этой категории значения, заданные в файлах конфигурации, имеют более низкий приоритет. Ansible использует первый найденный файл ansible.cfg, игнорируя все остальные. Ansible ищет ansible.cfg в следующих местах в указанном порядке:
-
ANSIBLE_CONFIG(переменная окружения, если задана) -
ansible.cfg(в текущем каталоге) -
~/.ansible.cfg(в домашнем каталоге) /etc/ansible/ansible.cfg
Переменные окружения имеют более высокий приоритет, чем записи в ansible.cfg. Если у вас установлены переменные окружения на управляющем узле, они переопределяют настройки в любом загружаемом Ansible ansible.cfg файле. Значение любой заданной переменной окружения соответствует стандартному приоритету оболочки: последнее заданное значение переписывает предыдущие значения.
Параметры командной строки
Любой параметр командной строки переопределяет любую настройку конфигурации.
Когда вы вводите что-либо непосредственно в командной строке, вы можете почувствовать, что ваши значения должны переопределять все остальные, но Ansible работает не так. Параметры командной строки имеют низкий приоритет — они переопределяют только конфигурацию. Они не переопределяют ключевые слова playbook, переменные из инвентаризации или переменные из playbooks.
Вы можете переопределить все остальные настройки из всех остальных источников во всех категориях приоритета в командной строке, используя использование дополнительных переменных -e в командной строке, но это не параметр командной строки, а способ передачи переменной.
В командной строке, если вы передаете несколько значений для параметра, принимающего только одно значение, последнее определенное значение побеждает. Например, эта задача ad-hoc подключится как carol, а не как mike:
ansible -u mike -m ping myhost -u carol
Некоторые параметры допускают несколько значений. В этом случае Ansible добавит все значения из хостов, перечисленных в файлах инвентаризации inventory1 и inventory2:
ansible -i /path/inventory1 -i /path/inventory2 -m ping all
Справочная информация по каждому инструменту командной строки содержит список доступных параметров для этого инструмента.
Ключевые слова playbook
Любое ключевое слово playbook переопределяет любой параметр командной строки и любую настройку конфигурации.
Внутри ключевых слов playbook приоритет определяется самим playbook; более конкретные значения переопределяют более общие:
- play (самый общий)
- блоки/включения/импорты/роли (дополнительные и могут содержать задачи и друг друга)
- задачи (самые конкретные)
Простой пример:
- hosts: all
connection: ssh
tasks:
- name: This task uses ssh.
ping:
- name: This task uses paramiko.
connection: paramiko
ping:
В этом примере ключевое слово connection установлено в значение ssh на уровне play. Первая задача наследует это значение и подключается, используя ssh. Вторая задача наследует это значение, переопределяет его и подключается, используя paramiko. Та же логика применяется и к блокам и ролям. Все задачи, блоки и роли в рамках play наследуют ключевые слова уровня play; любая задача, блок или роль могут переопределить любое ключевое слово, определив другое значение для этого ключевого слова внутри задачи, блока или роли.
Помните, что это КЛЮЧЕВЫЕ СЛОВА, а не переменные. Как playbooks, так и файлы переменных определяются в YAML, но имеют разное значение. Playbooks — это команда или структура «описания состояния» для Ansible, переменные — это данные, которые мы используем для повышения динамичности playbooks.
Переменные
Любая переменная переопределяет любое ключевое слово playbook, любой параметр командной строки и любую настройку конфигурации.
Переменные, имеющие эквивалентные ключевые слова playbook, параметры командной строки и настройки конфигурации, известны как переменные подключения. Первоначально разработанные для параметров подключения, эта категория расширилась, чтобы включать другие ключевые переменные, такие как временный каталог и интерпретатор Python.
Переменные подключения, как и все переменные, могут быть заданы различными способами и в разных местах. Вы можете определить переменные для хостов и групп в инвентаризации. Вы можете определить переменные для задач и play в vars: блоках в playbooks. Тем не менее, они по-прежнему являются переменными — это данные, а не ключевые слова или настройки конфигурации. Переменные, которые переопределяют ключевые слова playbook, параметры командной строки и настройки конфигурации, подчиняются тем же правилам приоритета переменных, что и любые другие переменные.
При установке в playbook переменные подчиняются тем же правилам наследования, что и ключевые слова playbook. Вы можете установить значение для play, а затем переопределить его в задаче, блоке или роли:
- hosts: cloud
gather_facts: false
become: yes
vars:
ansible_become_user: admin
tasks:
- name: This task uses admin as the become user.
dnf:
name: some-service
state: latest
- block:
- name: This task uses service-admin as the become user.
# a task to configure the new service
- name: This task also uses service-admin as the become user, defined in the block.
# second task to configure the service
vars:
ansible_become_user: service-admin
- name: This task (outside of the block) uses admin as the become user again.
service:
name: some-service
state: restarted
Область действия переменной: как долго значение доступно?
Значения переменных, заданные в playbook, существуют только внутри объекта playbook, который их определяет. Эти переменные «области действия объекта playbook» недоступны последующим объектам, включая другие play.
Значения переменных, непосредственно связанные с хостом или группой, включая переменные, определенные в инвентаризации, с помощью плагинов vars или с помощью модулей, таких как set_fact и include_vars, доступны всем play. Эти переменные «области действия хоста» также доступны через словарь hostvars[].
Использование дополнительных переменных -e в командной строке
Чтобы переопределить все другие настройки во всех других категориях, вы можете использовать дополнительные переменные: --extra-vars или -e в командной строке. Передаваемые значения с -e — это переменные, а не параметры командной строки, и они переопределят настройки конфигурации, параметры командной строки и ключевые слова playbook, а также переменные, заданные где-либо еще. Например, эта задача подключится как brian, а не как carol:
ansible -u carol -e 'ansible_user=brian' -a whoami all
Вы должны указать как имя переменной, так и значение с помощью --extra-vars.
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.10/reference_appendices/general_precedence.html