Переменные#
Переменной может быть, например:
информация об устройстве, которая собрана как факт, а затем используется в шаблоне.
в переменные можно записывать полученный вывод команды.
переменная может быть указана вручную в playbook
Имена переменных#
В Ansible есть определенные ограничения по формату имен переменных:
Переменные могут состоять из букв, чисел и символа
_
Переменные должны начинаться с буквы
Кроме того, можно создавать словари с переменными (в формате YAML):
R1:
IP: 10.1.1.1/24
DG: 10.1.1.100
Обращаться к переменным в словаре можно двумя вариантами:
R1['IP']
R1.IP
Правда, при использовании второго варианта могут быть проблемы, если название ключа совпадает с зарезервированным словом (методом или атрибутом) в Python или Ansible.
Где можно определять переменные#
Переменные можно создавать:
в инвентарном файле
в playbook
в специальных файлах для группы/устройства
в отдельных файлах, которые добавляются в playbook через include (как в Jinja2)
в ролях, которыезатем используются
можно даже передавать переменные при вызове playbook
Также можно использовать факты, которые были собраны про устройство, как переменные.
Переменные в инвентарном файле#
В инвентарном файле можно указывать переменные для группы:
[cisco_routers]
192.168.100.1
192.168.100.2
192.168.100.3
[cisco_switches]
192.168.100.100
[cisco_routers:vars]
ntp_server=192.168.255.100
log_server=10.255.100.1
Переменные ntp_server и log_server относятся к группе cisco_routers и могут использоваться, например, при генерации конфигурации на основе шаблона.
Переменные в playbook#
Переменные можно задавать прямо в playbook. Это может быть удобно тем, что переменные находятся там же, где все действия.
Например, можно задать переменную interfaces в playbook таким образом:
---
- name: Run show commands on routers
hosts: cisco_routers
gather_facts: false
vars:
interfaces: sh ip int br
tasks:
- name: run sh ip int br
ios_command:
commands: "{{interfaces}}"
- name: run sh ip arp
ios_command:
commands: sh ip arp
Переменные в специальных файлах для группы/устройства#
Ansible позволяет хранить переменные для группы/устройства в специальных файлах:
Для групп устройств, переменные должны находиться в каталоге group_vars, в файлах, которые называются, как имя группы. Кроме того, можно создавать в каталоге group_vars файл all, в котором будут находиться переменные, которые относятся ко всем группам.
Для конкретных устройств, переменные должны находиться в каталоге host_vars, в файлах, которые соответствуют имени или адресу хоста.
*Все файлы с переменными должны быть в формате YAML. Расширение файла может быть таким: yml, yaml, json или без расширения
каталоги group_vars и host_vars должны находиться в том же каталоге, что и playbook, или могут находиться внутри каталога inventory (первый вариант более распространенный). Если каталоги и файлы названы правильно и расположены в указанных каталогах, Ansible сам распознает файлы и будет использовать переменные.
Например, если инвентарный файл myhosts.ini выглядит так:
[cisco_routers]
192.168.100.1
192.168.100.2
192.168.100.3
[cisco_switches]
192.168.100.100
Можно создать такую структуру каталогов:
├── group_vars _
│ ├── all.yml |
│ ├── cisco_routers.yml | Каталог с переменными для групп устройств
│ └── cisco_switches.yml _|
|
├── host_vars _
│ ├── 192.168.100.1 |
│ ├── 192.168.100.2 |
│ ├── 192.168.100.3 | Каталог с переменными для устройств
│ └── 192.168.100.100 _|
|
└── myhosts.ini | Инвентарный файл
Ниже пример содержимого файлов переменных для групп устройств и для отдельных хостов.
group_vars/all.yml (в этом файле указываются значения по умолчанию, которые относятся ко всем устройствам):
---
ansible_connection: network_cli
ansible_network_os: ios
ansible_user: cisco
ansible_password: cisco
ansible_become: yes
ansible_become_method: enable
ansible_become_pass: cisco
В данном случае указываются переменные, которые предопределены самим Ansible.
group_vars/cisco_routers.yml
---
log_server: 10.255.100.1
ntp_server: 10.255.100.1
users:
user1: pass1
user2: pass2
user3: pass3
В файле group_vars/cisco_routers.yml находятся переменные, которые указывают IP-адреса Log и NTP серверов и нескольких пользователей. Эти переменные могут использоваться, например, в шаблонах конфигурации.
group_vars/cisco_switches.yml
---
vlans:
- 10
- 20
- 30
В файле group_vars/cisco_switches.yml указана переменная vlans со списком VLANов.
Файлы с переменными для хостов однотипны, и в них меняются только адреса и имена:
Файл host_vars/192.168.100.1.yml
---
hostname: london_r1
mgmnt_loopback: 100
mgmnt_ip: 10.0.0.1
ospf_ints:
- 192.168.100.1
- 10.0.0.1
- 10.255.1.1
Приоритет переменных#
Примечание
В этом разделе не рассматривается размещение переменных:
в отдельных файлах, которые добавляются в playbook через include (как в Jinja2)
в ролях, которые затем используются
передача переменных при вызове playbook
Чаще всего, переменная с определенным именем только одна, но иногда может понадобиться создать переменную в разных местах, и тогда нужно понимать, в каком порядке Ansible перезаписывает переменные.
Приоритет переменных (последние значения переписывают предыдущие):
переменные в инвентарном файле
переменные для группы хостов в инвентарном файле
переменные для хостов в инвентарном файле
переменные в каталоге group_vars
переменные в каталоге host_vars
факты хоста
переменные сценария (play)
переменные, полученные через параметр register
переменные, которые передаются при вызове playbook через параметр –extra-vars (всегда наиболее приоритетные)