Создание инвентаря
Для запуска плейбука без инвентаря требуется несколько флагов командной строки. Кроме того, запуск плейбука для одного устройства не дает большого выигрыша в эффективности по сравнению с выполнением тех же изменений вручную. Следующий шаг к использованию всей мощи Ansible — применение файла инвентаря для организации управляемых узлов в группы с такой информацией, как ansible_network_os и пользователь SSH. Полнофункциональный файл инвентаря может служить источником достоверной информации о вашей сети. С помощью файла инвентаря один плейбук может управлять сотнями сетевых устройств одной командой. На этой странице шаг за шагом показано, как создать файл инвентаря.
- Базовый инвентарь
- Добавление переменных в инвентарь
- Групповые переменные в инвентаре
- Синтаксис переменных
- Группировка инвентаря по платформам
- Проверка инвентаря
- Защита конфиденциальных переменных с помощью
ansible-vault
Базовый инвентарь
Сначала логически сгруппируйте инвентарь. Рекомендуется группировать серверы и сетевые устройства по признакам «Что» (приложение, стек или микросервис), «Где» (центр обработки данных или регион) и «Когда» (этап разработки):
- Что: db, web, leaf, spine
- Где: east, west, floor_19, building_A
- Когда: dev, test, staging, prod
Не используйте в именах групп пробелы, дефисы и цифры в начале (используйте floor_19, а не 19th_floor). Имена групп чувствительны к регистру.
В этом небольшом примере центра обработки данных показана базовая структура групп. Можно группировать группы с помощью синтаксиса [metagroupname:children], указывая группы в качестве элементов метагруппы. Здесь группа network включает все leaf и spine; группа datacenter включает все сетевые устройства и все веб-серверы.
---
leafs:
hosts:
leaf01:
ansible_host: 10.16.10.11
leaf02:
ansible_host: 10.16.10.12
spines:
hosts:
spine01:
ansible_host: 10.16.10.13
spine02:
ansible_host: 10.16.10.14
network:
children:
leafs:
spines:
webservers:
hosts:
webserver01:
ansible_host: 10.16.10.15
webserver02:
ansible_host: 10.16.10.16
datacenter:
children:
network:
webservers:
Этот же инвентарь можно создать и в формате INI.
[leafs] leaf01 leaf02 [spines] spine01 spine02 [network:children] leafs spines [webservers] webserver01 webserver02 [datacenter:children] network webservers
Добавление переменных в инвентарь
Затем можно задать в инвентаре значения многих переменных, необходимых для первой команды Ansible, чтобы не указывать их в команде ansible-playbook. В этом примере в инвентаре указаны IP-адрес, ОС и пользователь SSH для каждого сетевого устройства. Если доступ к сетевым устройствам возможен только по IP-адресу, его необходимо добавить в файл инвентаря. Если для доступа к сетевым устройствам используются имена узлов, IP-адрес не требуется.
---
leafs:
hosts:
leaf01:
ansible_host: 10.16.10.11
ansible_network_os: vyos.vyos.vyos
ansible_user: my_vyos_user
leaf02:
ansible_host: 10.16.10.12
ansible_network_os: vyos.vyos.vyos
ansible_user: my_vyos_user
spines:
hosts:
spine01:
ansible_host: 10.16.10.13
ansible_network_os: vyos.vyos.vyos
ansible_user: my_vyos_user
spine02:
ansible_host: 10.16.10.14
ansible_network_os: vyos.vyos.vyos
ansible_user: my_vyos_user
network:
children:
leafs:
spines:
webservers:
hosts:
webserver01:
ansible_host: 10.16.10.15
ansible_user: my_server_user
webserver02:
ansible_host: 10.16.10.16
ansible_user: my_server_user
datacenter:
children:
network:
webservers:
Групповые переменные в инвентаре
Если устройства в группе используют одинаковые значения переменных, например ОС или пользователя SSH, можно сократить дублирование и упростить обслуживание, объединив эти значения в групповые переменные:
---
leafs:
hosts:
leaf01:
ansible_host: 10.16.10.11
leaf02:
ansible_host: 10.16.10.12
vars:
ansible_network_os: vyos.vyos.vyos
ansible_user: my_vyos_user
spines:
hosts:
spine01:
ansible_host: 10.16.10.13
spine02:
ansible_host: 10.16.10.14
vars:
ansible_network_os: vyos.vyos.vyos
ansible_user: my_vyos_user
network:
children:
leafs:
spines:
webservers:
hosts:
webserver01:
ansible_host: 10.16.10.15
webserver02:
ansible_host: 10.16.10.16
vars:
ansible_user: my_server_user
datacenter:
children:
network:
webservers:
Синтаксис переменных
Синтаксис значений переменных различается в инвентаре, плейбуках и файлах group_vars, которые рассматриваются ниже. Хотя и плейбуки, и файлы group_vars написаны на YAML, в каждом из этих случаев переменные используются по-разному.
- В файле инвентаря в стиле ini для значений переменных необходимо использовать синтаксис
key=value:ansible_network_os=vyos.vyos.vyos. - В любом файле с расширением
.ymlили.yaml, включая плейбуки и файлыgroup_vars, необходимо использовать синтаксис YAML:key: value. - В файлах
group_varsуказывайте полное имяkey:ansible_network_os: vyos.vyos.vyos. - В плейбуках используйте краткое имя
keyбез префиксаansible:network_os: vyos.vyos.vyos.
Группировка инвентаря по платформам
По мере роста инвентаря может потребоваться группировать устройства по платформам. Это позволяет легко указывать переменные для конкретной платформы сразу для всех устройств на этой платформе:
---
leafs:
hosts:
leaf01:
ansible_host: 10.16.10.11
leaf02:
ansible_host: 10.16.10.12
spines:
hosts:
spine01:
ansible_host: 10.16.10.13
spine02:
ansible_host: 10.16.10.14
network:
children:
leafs:
spines:
vars:
ansible_connection: ansible.netcommon.network_cli
ansible_network_os: vyos.vyos.vyos
ansible_user: my_vyos_user
webservers:
hosts:
webserver01:
ansible_host: 10.16.10.15
webserver02:
ansible_host: 10.16.10.16
vars:
ansible_user: my_server_user
datacenter:
children:
network:
webservers:
При такой настройке для запуска first_playbook.yml достаточно двух флагов:
ansible-playbook -i inventory.yml -k first_playbook.yml
С помощью флага -k можно ввести пароль (или пароли) SSH в приглашении командной строки. Также можно безопасно хранить пароли SSH и другие секреты в файлах group_vars с помощью ansible-vault. Подробности см. в разделе Защита конфиденциальных переменных с помощью ansible-vault.
Проверка инвентаря
Для отображения инвентаря в том виде, в каком его видит Ansible, можно использовать команду CLI ansible-inventory.
$ ansible-inventory -i test.yml --list
{
"_meta": {
"hostvars": {
"leaf01": {
"ansible_connection": "ansible.netcommon.network_cli",
"ansible_host": "10.16.10.11",
"ansible_network_os": "vyos.vyos.vyos",
"ansible_user": "my_vyos_user"
},
"leaf02": {
"ansible_connection": "ansible.netcommon.network_cli",
"ansible_host": "10.16.10.12",
"ansible_network_os": "vyos.vyos.vyos",
"ansible_user": "my_vyos_user"
},
"spine01": {
"ansible_connection": "ansible.netcommon.network_cli",
"ansible_host": "10.16.10.13",
"ansible_network_os": "vyos.vyos.vyos",
"ansible_user": "my_vyos_user"
},
"spine02": {
"ansible_connection": "ansible.netcommon.network_cli",
"ansible_host": "10.16.10.14",
"ansible_network_os": "vyos.vyos.vyos",
"ansible_user": "my_vyos_user"
},
"webserver01": {
"ansible_host": "10.16.10.15",
"ansible_user": "my_server_user"
},
"webserver02": {
"ansible_host": "10.16.10.16",
"ansible_user": "my_server_user"
}
}
},
"all": {
"children": [
"datacenter",
"ungrouped"
]
},
"datacenter": {
"children": [
"network",
"webservers"
]
},
"leafs": {
"hosts": [
"leaf01",
"leaf02"
]
},
"network": {
"children": [
"leafs",
"spines"
]
},
"spines": {
"hosts": [
"spine01",
"spine02"
]
},
"webservers": {
"hosts": [
"webserver01",
"webserver02"
]
}
}
Защита конфиденциальных переменных с помощью ansible-vault
Команда ansible-vault позволяет шифровать файлы и/или отдельные переменные, например пароли. В этом руководстве показано, как зашифровать один пароль SSH. Приведенные ниже команды можно использовать для шифрования другой конфиденциальной информации, например паролей баз данных, паролей для повышения привилегий и многого другого.
Сначала необходимо создать пароль для самой утилиты ansible-vault. Он используется в качестве ключа шифрования и позволяет шифровать десятки разных паролей в проекте Ansible. Запуская плейбуки, вы можете получить доступ ко всем этим секретам (зашифрованным значениям) с помощью одного пароля — пароля ansible-vault. Вот простой пример.
- Создайте файл и запишите в него пароль для ansible-vault:
echo "my-ansible-vault-pw" > ~/my-ansible-vault-pw-file
- Создайте зашифрованный пароль SSH для сетевых устройств VyOS, используя пароль ansible-vault из только что созданного файла:
ansible-vault encrypt_string --vault-id my_user@~/my-ansible-vault-pw-file 'VyOS_SSH_password' --name 'ansible_password'
Если вы предпочитаете вводить пароль ansible-vault, а не хранить его в файле, запросите его ввод:
ansible-vault encrypt_string --vault-id my_user@prompt 'VyOS_SSH_password' --name 'ansible_password'
и введите пароль хранилища для my_user.
Флаг --vault-id позволяет использовать разные пароли хранилища для разных пользователей или уровней доступа. В выводе содержится имя пользователя my_user из команды ansible-vault, а для записи используется синтаксис YAML key: value:
ansible_password: !vault |
$ANSIBLE_VAULT;1.2;AES256;my_user
66386134653765386232383236303063623663343437643766386435663632343266393064373933
3661666132363339303639353538316662616638356631650a316338316663666439383138353032
63393934343937373637306162366265383461316334383132626462656463363630613832313562
3837646266663835640a313164343535316666653031353763613037656362613535633538386539
65656439626166666363323435613131643066353762333232326232323565376635
Encryption successful
Ниже приведен пример с фрагментом инвентаря YAML, поскольку формат INI не поддерживает встроенные хранилища:
# ...
vyos: # this is a group in yaml inventory, but you can also do under a host
vars:
ansible_connection: ansible.netcommon.network_cli
ansible_network_os: vyos.vyos.vyos
ansible_user: my_vyos_user
ansible_password: !vault |
$ANSIBLE_VAULT;1.2;AES256;my_user
66386134653765386232383236303063623663343437643766386435663632343266393064373933
3661666132363339303639353538316662616638356631650a316338316663666439383138353032
63393934343937373637306162366265383461316334383132626462656463363630613832313562
3837646266663835640a313164343535316666653031353763613037656362613535633538386539
65656439626166666363323435613131643066353762333232326232323565376635
# ...
Чтобы использовать встроенные зашифрованные переменные с инвентарем INI, необходимо сохранить их в файле ‘vars’ в формате YAML. Его можно поместить в каталог host_vars/ или group_vars/, чтобы он подхватывался автоматически, либо подключить из плейбука с помощью vars_files или include_vars.
Чтобы запустить плейбук с такой настройкой, уберите флаг -k и добавьте флаг для vault-id:
ansible-playbook -i inventory --vault-id my_user@~/my-ansible-vault-pw-file first_playbook.yml
Или используйте запрос пароля вместо файла с паролем хранилища:
ansible-playbook -i inventory --vault-id my_user@prompt first_playbook.yml
Чтобы увидеть исходное значение, можно использовать модуль debug. Обратите внимание: если в файле YAML определена переменная ansible_connection (как в нашем примере), она вступит в силу при выполнении приведенной ниже команды. Чтобы этого избежать, создайте копию файла без переменной ansible_connection.
$ cat vyos.yml | grep -v ansible_connection >> vyos_no_connection.yml
ansible localhost -m debug -a var="ansible_password" -e "@vyos_no_connection.yml" --ask-vault-pass
Vault password:
localhost | SUCCESS => {
"ansible_password": "VyOS_SSH_password"
}
Предупреждение
Содержимое хранилища можно расшифровать только с помощью пароля, использованного для его шифрования. Если вы хотите отказаться от одного пароля и перейти на новый, можно обновить и повторно зашифровать существующее содержимое хранилища с помощью ansible-vault rekey myfile, а затем указать старый и новый пароли. Копии содержимого хранилища, по-прежнему зашифрованные старым паролем, можно расшифровать с помощью старого пароля.
Дополнительные сведения о создании файлов инвентаря см. во введении в инвентарь; дополнительные сведения об ansible-vault см. в полной документации Ansible Vault.
Теперь, когда вы освоили основы команд, плейбуков и инвентаря, можно перейти к более сложным примерам работы с Ansible Network.
© 2012–2018 Michael DeHaan
© 2018–2025 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/projects/ansible/latest/network/getting_started/first_inventory.html