Spec-Zone.ru › Ansible

Управление поведением Ansible: правила приоритета

Для максимальной гибкости при управлении вашими окружениями Ansible предлагает множество способов управления его поведением: как он подключается к управляемым узлам, как он работает после подключения. Если вы используете Ansible для управления большим количеством серверов, сетевых устройств и ресурсов облака, вы можете определить поведение Ansible в нескольких разных местах и передать эту информацию Ansible несколькими разными способами. Эта гибкость удобна, но может сработать не так, как ожидалось, если вы не понимаете правил приоритета.

Эти правила приоритета применяются к любому параметру, который может быть определен несколькими способами (параметрами конфигурации, параметрами командной строки, ключевыми словами в playбуке, переменными).

  • Параметры конфигурации
  • Параметры командной строки
  • Ключевые слова playбука
  • Переменные

    • Область действия переменной: как долго доступно значение?
    • Использование дополнительных переменных -e в командной строке
  • Прямое присваивание

Категории приоритета

Ansible предоставляет четыре источника для управления своим поведением. В порядке приоритета, от низшего (легче всего переопределяемого) к высшему (переопределяет все остальные), категории следующие:

  • Параметры конфигурации
  • Параметры командной строки
  • Ключевые слова playбука
  • Переменные
  • Прямое присваивание

Каждая категория переопределяет любую информацию из всех категорий с более низким приоритетом. Например, ключевое слово playбука переопределит любой параметр конфигурации.

Внутри каждой категории приоритета применяются определенные правила. Однако, как правило, «последнее определенное» значение побеждает и переопределяет все предыдущие определения.

Параметры конфигурации

Параметры конфигурации включают значения из файла ansible.cfg и переменных окружения. В рамках этой категории значения, установленные в файлах конфигурации, имеют более низкий приоритет. Ansible использует первый найденный файл ansible.cfg, игнорируя все остальные. Ansible ищет ansible.cfg в следующих местах в указанном порядке:

  • ANSIBLE_CONFIG (переменная окружения, если установлена)
  • ansible.cfg (в текущем каталоге)
  • ~/.ansible.cfg (в домашнем каталоге)
  • /etc/ansible/ansible.cfg

Переменные окружения имеют более высокий приоритет, чем записи в файле ansible.cfg. Если у вас установлены переменные окружения на управляющем узле, они переопределяют настройки в загруженном файле ansible.cfg. Значение любой заданной переменной окружения подчиняется обычным правилам приоритета оболочки: последнее определенное значение переопределяет предыдущие значения.

Параметры командной строки

Любой параметр командной строки переопределит любой параметр конфигурации.

Когда вы вводите что-то непосредственно в командной строке, вы можете почувствовать, что ваши значения должны переопределять все остальные, но Ansible работает не так. Параметры командной строки имеют низкий приоритет — они переопределяют только конфигурацию. Они не переопределяют ключевые слова playбука, переменные из инвентаризации или переменные из playбуков.

Вы можете переопределить все другие настройки из всех других источников во всех категориях приоритета в командной строке с помощью использования дополнительных переменных -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

Справка по каждому инструменту командной строки перечисляет доступные параметры для этого инструмента.

Ключевые слова playбука

Любое ключевое слово playбука переопределит любой параметр командной строки и любой параметр конфигурации.

Внутри ключевых слов playбука приоритет определяется самим playбуком; более конкретное значение побеждает более общее:

  • 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; любая задача, блок или роль могут переопределить любое ключевое слово, определив другое значение для этого ключевого слова в рамках задачи, блока или роли.

Помните, что это КЛЮЧЕВЫЕ СЛОВА, а не переменные. И playбуки, и файлы переменных определяются в YAML, но они имеют разное значение. Playбуки — это структура команд или «описание состояния» для Ansible, переменные — это данные, которые мы используем, чтобы сделать playбуки более динамичными.

Переменные

Переменные Ansible занимают очень высокое место в стеке приоритета. Они переопределяют любые ключевые слова playбука, параметры командной строки, переменные окружения и любые настройки файлов конфигурации.

Переменные, которые имеют эквивалентные ключевые слова playбука, параметры командной строки и параметры конфигурации, называются переменными соединения. Первоначально предназначенные для параметров соединения, эта категория расширилась, чтобы включать и другие основные переменные, такие как временный каталог и интерпретатор Python.

Переменные соединения, как и все переменные, могут быть заданы несколькими способами и в разных местах. Вы можете определить переменные для узлов и групп в инвентаризации. Вы можете определить переменные для задач и play в блоках vars: в playбуках. Однако они по-прежнему являются переменными — это данные, а не ключевые слова или параметры конфигурации. Переменные, которые переопределяют ключевые слова playбука, параметры командной строки и параметры конфигурации, подчиняются тем же правилам приоритета переменных, что и любые другие переменные.

При установке в playбуке переменные следуют тем же правилам наследования, что и ключевые слова playбука. Вы можете установить значение для play, а затем переопределить его в задаче, блоке или роли:

- 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

Область действия переменной: как долго доступно значение?

Значения переменных, заданные в playбуке, существуют только внутри объекта playбука, который их определяет. Эти переменные «области действия playбука» недоступны последующим объектам, включая другие playбуки.

Значения переменных, связанные непосредственно с узлом или группой, включая переменные, определенные в инвентаризации, с помощью плагинов vars или с помощью модулей, таких как set_fact и include_vars, доступны для всех playбуков. Эти переменные «области действия узла» также доступны через словарь hostvars[].

Переменные, заданные через extra vars имеют глобальную область действия для текущего выполнения и будут присутствовать как в «переменных playбука», так и в «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, filter и test:

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–2024 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/latest/reference_appendices/general_precedence.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API