Spec-Zone.ru › Ansible 2.8

Управление поведением 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.cfg. Значение любой заданной переменной окружения подчиняется стандартному приоритету оболочки: последнее заданное значение перезаписывает предыдущие.

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

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

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

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

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

Переменные

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

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

Переменные подключения, как и все переменные, могут быть заданы несколькими способами и в нескольких местах. Вы можете определить переменные для узлов и групп в инвентаризации. Вы можете определить переменные для задач и play в блоках vars: в playbook. Однако они все еще являются переменными — это данные, а не ключевые слова или настройки конфигурации. Переменные, которые перекрывают ключевые слова 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.8/reference_appendices/general_precedence.html

Spec-Zone.ru

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