Spec-Zone.ru › Ansible 2.9

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

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

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

  • Настройки конфигурации
  • Параметры командной строки
  • Ключевые слова playbook
  • Переменные
    • Область действия переменной: как долго значение доступно?
  • Использование дополнительных переменных в командной строке

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

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» недоступны для последующих объектов, включая другие playbooks.

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

Использование дополнительных переменных в командной строке

Для переопределения всех остальных настроек во всех остальных категориях можно использовать дополнительные переменные: --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.9/reference_appendices/general_precedence.html

Spec-Zone.ru

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