Переменные#

Ansible использует переменные для управления различиями между системами. С помощью Ansible можно выполнять задачи в разных системах с помощью одной команды.

Переменной может быть, например:

  • информация об устройстве, которая собрана как факт, а затем используется в шаблоне.

  • в переменные можно записывать полученный вывод команды.

  • переменная может быть указана вручную в playbook

Имена переменных#

В Ansible есть определенные ограничения по формату имен переменных:

  • Переменные могут состоять из букв, чисел и символа _

  • Переменные должны начинаться с буквы

Где можно определять переменные#

Переменные можно создавать:

  • в инвентарном файле

  • в playbook

  • в специальных файлах для группы/устройства

  • в отдельных файлах, которые добавляются в playbook через include (как в Jinja2)

  • можно передавать переменные при вызове playbook

Также можно использовать факты, которые были собраны про устройство, как переменные.

Переменные в инвентарном файле#

В инвентарном файле можно указывать переменные для группы:

[br_net]
192.168.0.1
192.168.0.10

[br_net:vars]
dns = 10.10.10.10
log_server = 192.168.0.2

Переменные dns и log_server можно применять в playbooks для всех устройств из группы br_net

Имена переменных в playbook заключаются в двойные фигурные скобки {{dns}}

Пример:#

Создать playbook для добавления dns сервера c IP адресом 10.10.10.10 на устройствах в сети br_net

- name: Set DNS-server
  hosts: br_net

  tasks:
    - name: insert line into resolv.conf
      ansible.builtin.lineinfile:
          path: /etc/resolv.conf
          line: nameserver {{dns}}
          state: present

В данном случае в файл /etc/resolv.conf будет добавлена строка nameserver 10.10.10.10. То есть вместо {{dns}} будет взято значение этой переменной, которые было описано в инвентарном файле.

Переменные в playbook#

Самый простой способ использования переменных - это определить переменную, используя одно значение в файле playbook YAML.

Пример playbook, который выводит сообщение в стандартный вывод.

Определение переменной начинается с блока vars, за которым следует имя переменной и соответствующее ей значение. В этом примере greetings - это имя переменной, а Hello everyone! - присвоенное ей значение.

Чтобы ссылаться на значение переменной, необходимо заключить переменную в двойные фигурные скобки как таковую {{ greetings }}.

Когда playbook выполняется, осуществляется доступ к значению переменной и оно выводится в стандартный вывод, за которым следует остальная часть строки.

Переменные Ansible с массивами#

Как и в языках программирования, где массивы используются для хранения набора элементов одного типа данных, в Ansible массивы используются для определения переменных с несколькими значениями.

Массивы определяются с использованием приведенного синтаксиса.

Как и в языках программирования, для перебора элементов массива или многомерного массива используются циклы. Они используются для упрощения выполнения повторяющихся задач, которые могут быть утомительными и отнимать много времени.

В Ansible используются циклы loop

Пример:

Установить на все хосты пакеты NetworkManager-tui, bind-utils

Директива loop выполняет итерацию по всему списку имен, определенных в цикле, и сохраняет каждое имя в переменной с именем item. Переменная ссылается на каждый из элементов в цикле. Таким образом, playbook устанавливает пакеты с меньшим количеством строк кода и позволяет избежать повторяющихся блоков кода.

Переменные в отдельных yaml-файлах#

Для достижения гибкости в работе ansible можно размещать переменные в отдельных файлах и покдключать к playbook по мере необходимости.

Подключение файла с переменными вы полняется в playbook следующим образом:

- name: Example External Variables file
  hosts: all
  vars_files:
     - variables.yml

Пример:

Заполнить файл /etc/hosts на всех узлах сведениями о некоторых IP адресах устройств сетевой инфраструктуры:

  • BR-RTR: 192.168.0.1

  • BR-SRV: 192.168.0.2

  • BR-CLI: 192.168.0.10

  1. Подготовка файла с переменными.

    1. Создать файл variables.yaml для хранения словаря с именами хостов и IP адресами.

    2. Заполнить его следующим образом:

В данном случае создан словарь insert_etc_host, содержащий список из трех словарей, в каждом из которых в качестве ключа представлен параметр, заносимый в /etc/host и его значение

  1. Создать playbook insert_etc_hosts.yaml следующего содержания:

Переменные в специальных файлах для группы/устройства#

Ansible позволяет хранить переменные для группы/устройства в специальных файлах:

  • Для групп устройств, переменные должны находиться в каталоге group_vars, в файлах, которые называются, как имя группы. Кроме того, можно создавать в каталоге group_vars файл all, в котором будут находиться переменные, которые относятся ко всем группам.

  • Для конкретных устройств, переменные должны находиться в каталоге host_vars, в файлах, которые соответствуют имени или адресу хоста.

*Все файлы с переменными должны быть в формате YAML. Расширение файла может быть таким: yml, yaml, json или без расширения

  • каталоги group_vars и host_vars должны находиться в том же каталоге, что и playbook, или могут находиться внутри каталога inventory (первый вариант более распространенный). Если каталоги и файлы названы правильно и расположены в указанных каталогах, Ansible сам распознает файлы и будет использовать переменные.

Например, если инвентарный файл myhosts.ini выглядит так:

[br_net]
192.168.0.1
192.168.0.2
192.168.0.10

[web_servers]
192.168.0.100

Можно создать такую структуру каталогов:

├── group_vars                 _
│   ├── all.yml                 |
│   ├── br_net.yml              |  Каталог с переменными для групп устройств
│   └── web_servers.yml        _|
|
├── host_vars                  _
│   ├── 192.168.0.1             |
│   ├── 192.168.0.2             |
│   ├── 192.168.0.10            |  Каталог с переменными для устройств
│   └── 192.168.0.100          _|
|
└── myhosts.ini                 |  Инвентарный файл

Ниже пример содержимого файлов переменных для групп устройств и для отдельных хостов.

group_vars/all.yml (в этом файле указываются значения по умолчанию, которые относятся ко всем устройствам):

---

    dns: 192.168.0.2

В данном случае указываются переменные, которые предопределены самим Ansible.

group_vars/br_net.yml

---

log_server: 172.16.0.2
ntp_server: 172.16.0.2
users:
  sshuser: P@ssw0rd
  net_admin: P@ssw0rd

В файле group_vars/br_net.yml находятся переменные, которые указывают IP-адреса Log и NTP серверов и нескольких пользователей. Эти переменные могут использоваться, например, в шаблонах конфигурации.

Файл host_vars/192.168.0.1.yml

---

hostname: BR-RTR

Приоритет переменных#

Чаще всего, переменная с определенным именем только одна, но иногда может понадобиться создать переменную в разных местах, и тогда нужно понимать, в каком порядке Ansible перезаписывает переменные.

Приоритет переменных (последние значения переписывают предыдущие):

  • переменные в инвентарном файле

  • переменные для группы хостов в инвентарном файле

  • переменные для хостов в инвентарном файле

  • переменные в каталоге group_vars

  • переменные в каталоге host_vars

  • факты хоста

  • переменные сценария (play)

  • переменные, полученные через параметр register

  • переменные, которые передаются при вызове playbook через параметр –extra-vars (всегда наиболее приоритетные)

Дополнительные примеры и опсания находятся в документации