Управление поведением Ansible: правила приоритета
Чтобы предоставить вам максимальную гибкость при управлении средами, Ansible предлагает множество способов контролировать своё поведение: устанавливать соединение с управляемыми узлами и выполнять действия после подключения. Если вы используете Ansible для управления большим количеством серверов, сетевых устройств и облачных ресурсов, вы можете задавать поведение Ansible в нескольких разных местах и передавать эту информацию Ansible несколькими разными способами. Такая гибкость удобна, но может привести к обратному результату, если вы не понимаете правила приоритета.
Эти правила приоритета применяются к любым параметрам, которые можно задать несколькими способами (с помощью параметров конфигурации, параметров командной строки, ключевых слов плейбука, переменных).
Категории приоритета
Ansible предлагает четыре источника управления своим поведением. В порядке приоритета от низшего (его проще всего переопределить) к высшему (переопределяет все остальные) эти категории располагаются так:
- Параметры конфигурации
- Параметры командной строки
- Ключевые слова плейбука
- Переменные
- Прямое назначение
Каждая категория переопределяет любые сведения из всех категорий с более низким приоритетом. Например, ключевое слово плейбука переопределит любой параметр конфигурации.
В каждой категории приоритета действуют свои правила. Однако, как правило, побеждает «последнее заданное» значение, которое переопределяет все предыдущие определения.
Параметры конфигурации
Параметры конфигурации включают значения из файла ansible.cfg и переменные среды. В этой категории значения, заданные в файлах конфигурации, имеют более низкий приоритет. Ansible использует первый найденный файл ansible.cfg и игнорирует все остальные. Ansible ищет ansible.cfg в следующих местах в указанном порядке:
-
ANSIBLE_CONFIG(переменная среды, если она задана) -
ansible.cfg(в текущем каталоге) -
~/.ansible.cfg(в домашнем каталоге) /etc/ansible/ansible.cfg
Переменные среды имеют более высокий приоритет, чем записи в ansible.cfg. Если на управляющем узле заданы переменные среды, они переопределяют параметры в том файле ansible.cfg, который загружает Ansible. Значение любой переменной среды подчиняется обычным правилам приоритета оболочки: последнее заданное значение заменяет предыдущие.
Параметры командной строки
Любой параметр командной строки переопределяет любой параметр конфигурации.
Вводя что-либо непосредственно в командной строке, вы можете полагать, что заданные вручную значения должны переопределять все остальные, но Ansible работает иначе. Параметры командной строки имеют низкий приоритет — они переопределяют только конфигурацию. Они не переопределяют ключевые слова плейбука, переменные из инвентаря или переменные из плейбуков.
В командной строке можно переопределить все остальные параметры из всех источников во всех категориях приоритета, используя дополнительные переменные -e, однако это не параметр командной строки, а способ передать переменную.
Если в командной строке указать несколько значений для параметра, который принимает только одно значение, победит последнее заданное значение. Например, эта разовая задача подключится как carol, а не как mike:
ansible -u mike -m ping myhost -u carol
Некоторые параметры допускают несколько значений. В этом случае Ansible добавит все значения из узлов, перечисленных в файлах инвентаря inventory1 и inventory2:
ansible -i /path/inventory1 -i /path/inventory2 -m ping all
В справке для каждой утилиты командной строки перечислены доступные параметры этой утилиты.
Ключевые слова плейбука
Любое ключевое слово плейбука переопределяет любой параметр командной строки и любой параметр конфигурации.
Приоритет ключевых слов плейбука зависит от его структуры: более конкретное значение имеет приоритет над более общим:
- плей (самый общий уровень)
- блоки/включения/импорты/роли (необязательные элементы, которые могут содержать задачи и друг друга)
- задачи (самый конкретный уровень)
Простой пример:
- hosts: all
connection: ssh
tasks:
- name: This task uses ssh.
ping:
- name: This task uses paramiko.
connection: paramiko
ping:
В этом примере ключевому слову connection на уровне плей задано значение ssh. Первая задача наследует это значение и подключается с помощью ssh. Вторая задача наследует это значение, переопределяет его и подключается с помощью paramiko. Та же логика применима к блокам и ролям. Все задачи, блоки и роли внутри плей наследуют ключевые слова уровня плей; любая задача, блок или роль может переопределить любое ключевое слово, задав для него другое значение в этой задаче, блоке или роли.
Помните, что это КЛЮЧЕВЫЕ СЛОВА, а не переменные. И плейбуки, и файлы переменных определяются в YAML, но имеют разное назначение. Плейбуки — это структура команд или «описание состояния» для Ansible, а переменные — данные, помогающие сделать плейбуки более динамичными.
Переменные
Переменные Ansible занимают очень высокое место в стеке приоритетов. Они переопределяют любые ключевые слова плейбука, параметры командной строки, переменные среды и параметры файлов конфигурации.
Переменные, которым соответствуют ключевые слова плейбука, параметры командной строки и параметры конфигурации, называются переменными подключения. Изначально предназначенная для параметров подключения, эта категория расширилась и теперь включает другие основные переменные, например временный каталог и интерпретатор Python.
Переменные подключения, как и все переменные, можно задавать несколькими способами и в разных местах. Вы можете определять переменные для узлов и групп в инвентаре. Вы можете определять переменные для задач и плейов в блоках vars: в плейбуках. Однако это всё равно переменные — данные, а не ключевые слова или параметры конфигурации. Переменные, переопределяющие ключевые слова плейбука, параметры командной строки и параметры конфигурации, подчиняются тем же правилам приоритета переменных, что и любые другие переменные.
В плейбуке переменные подчиняются тем же правилам наследования, что и ключевые слова плейбука. Вы можете задать значение для плейа, а затем переопределить его в задаче, блоке или роли:
- hosts: cloud
gather_facts: false
become: true
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
Область видимости переменной: как долго доступно значение?
Значения переменных, заданные в плейбуке, существуют только в пределах объекта плейбука, в котором они определены. Эти переменные «области видимости объекта плейбука» недоступны последующим объектам, в том числе другим плейам.
Значения переменных, непосредственно связанные с узлом или группой, включая переменные, определённые в инвентаре, плагинами vars или с помощью таких модулей, как set_fact и include_vars, доступны во всех плейах. Эти переменные «области видимости узла» также доступны через словарь hostvars[].
Переменные, заданные с помощью extra vars, имеют глобальную область видимости в рамках текущего запуска и будут доступны как «переменные объекта плейбука», так и «hostvars».
Использование дополнительных переменных -e в командной строке
Чтобы переопределить все остальные переменные, можно использовать дополнительные переменные: --extra-vars или -e в командной строке. Значения, переданные с помощью -e, хотя это и параметр командной строки, имеют наивысший приоритет среди переменных и, что может показаться нелогичным, более высокий приоритет, чем у большинства источников конфигурации, поскольку сами переменные имеют высокий приоритет. Например, эта задача подключится как brian, а не как carol:
ansible -u carol -e 'ansible_user=brian' -a whoami all
С помощью --extra-vars необходимо указать и имя переменной, и её значение.
Прямое назначение
Эта категория применима только к объектам, принимающим прямые параметры, как правило, к модулям и некоторым типам плагинов. У большинства модулей и плагинов действий нет других способов задавать параметры, поэтому в этом контексте вопрос приоритета возникает редко. Однако для некоторых из них это всё же возможно, и такая возможность должна быть отражена в документации.
- debug: msg='this is a direct assignment option to an action plugin'
- ping:
data: also a direct assignment
Помимо действий задач, наиболее очевидные примеры «прямого назначения» встречаются у плагинов поиска, фильтров и тестов:
lookup('plugin', direct1='value', direct2='value2')
'value_directly_assigned'|filter('another directly assigned')
'direct value' is testplugin
Хотя большинство этих плагинов нельзя настраивать другими способами, особенно тесты, плагины и фильтры могут использовать данные из других источников конфигурации, если это указано в их документации.
С плагинами инвентаря всё немного сложнее: они используют «источники инвентаря», которые иногда могут выглядеть как файл конфигурации и передаются в виде параметра командной строки, но всё равно считаются «прямым назначением». Это понятнее при использовании встроенного источника -i host1, host2, host3, чем при использовании источника-файла -i /path/to/inventory_source, однако приоритет у них одинаковый.
© 2012–2018 Michael DeHaan
© 2018–2025 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/projects/ansible/latest/reference_appendices/general_precedence.html