Переменные#
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
Подготовка файла с переменными.
Создать файл variables.yaml для хранения словаря с именами хостов и IP адресами.
Заполнить его следующим образом:
В данном случае создан словарь insert_etc_host, содержащий список из трех словарей, в каждом из которых в качестве ключа представлен параметр, заносимый в /etc/host и его значение
Создать 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 (всегда наиболее приоритетные)
Дополнительные примеры и опсания находятся в документации