Создайте свой инвентарь
Запуск плейбука без инвентаря требует нескольких флагов командной строки. Кроме того, запуск плейбука по отношению к одному устройству не обеспечивает значительного повышения эффективности по сравнению с ручным внесением тех же изменений. Следующим шагом для использования всей мощи 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-адрес в файл инвентаря. Если вы получаете доступ к своим сетевым устройствам с помощью имен хостов, 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.
Проверка инвентаря
Вы можете использовать команду CLI ansible-inventory для отображения инвентаря в виде, в котором его видит Ansible.
$ 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'
и введите пароль vault для my_user.
Флаг --vault-id позволяет использовать разные пароли vault для разных пользователей или разных уровней доступа. Вывод включает имя пользователя 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 не поддерживает встроенные vault:
...
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
Или с запросом вместо файла пароля vault:
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"
}
Предупреждение
Контент Vault может быть расшифрован только с помощью пароля, который использовался для его шифрования. Если вы хотите перестать использовать один пароль и перейти к новому, вы можете обновить и зашифровать существующий контент vault с помощью ansible-vault rekey myfile, а затем ввести старый пароль и новый пароль. Копии контента vault, который все еще зашифрован старым паролем, все еще могут быть расшифрованы старым паролем.
Для получения более подробной информации о создании файлов инвентаря см. введение в инвентарь; для получения дополнительной информации об ansible-vault см. полную документацию по Ansible Vault.
Теперь, когда вы понимаете основы команд, плейбуков и инвентаря, пришло время изучить более сложные примеры Ansible для сети.
© 2012–2018 Michael DeHaan
© 2018–2024 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/latest/network/getting_started/first_inventory.html