Создание вашего инвентаря
Полностью настроенный файл инвентаря может служить источником истины для вашей сети. Используя файл инвентаря, один и тот же плейбук может поддерживать сотни сетевых устройств одной командой. Эта страница показывает, как пошагово создать файл инвентаря.
- Базовый инвентарь
- Добавление переменных в инвентарь
- Группирование переменных в инвентаре
- Синтаксис переменных
- Группировка инвентаря по платформам
- Защита конфиденциальных переменных с помощью
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] 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] leaf01 ansible_host=10.16.10.11 ansible_network_os=vyos ansible_user=my_vyos_user leaf02 ansible_host=10.16.10.12 ansible_network_os=vyos ansible_user=my_vyos_user [spines] spine01 ansible_host=10.16.10.13 ansible_network_os=vyos ansible_user=my_vyos_user spine02 ansible_host=10.16.10.14 ansible_network_os=vyos ansible_user=my_vyos_user [network:children] leafs spines [servers] server01 ansible_host=10.16.10.15 ansible_user=my_server_user server02 ansible_host=10.16.10.16 ansible_user=my_server_user [datacenter:children] leafs spines servers
Группирование переменных в инвентаре
Когда устройства в группе разделяют одинаковые значения переменных, такие как ОС или пользователь SSH, вы можете уменьшить дублирование и упростить обслуживание, объединив их в переменные групп:
[leafs] leaf01 ansible_host=10.16.10.11 leaf02 ansible_host=10.16.10.12 [leafs:vars] ansible_network_os=vyos ansible_user=my_vyos_user [spines] spine01 ansible_host=10.16.10.13 spine02 ansible_host=10.16.10.14 [spines:vars] ansible_network_os=vyos ansible_user=my_vyos_user [network:children] leafs spines [servers] server01 ansible_host=10.16.10.15 server02 ansible_host=10.16.10.16 [datacenter:children] leafs spines servers
Синтаксис переменных
Синтаксис значений переменных отличается в инвентаре, плейбуках и файлах group_vars, которые описаны ниже. Несмотря на то, что файлы плейбука и group_vars написаны на YAML, вы используете переменные по-разному в каждом из них.
- В файле инвентаря в стиле ini вы должны использовать синтаксис
key=valueдля значений переменных:ansible_network_os=vyos. - В любом файле с расширением
.ymlили.yaml, включая плейбуки и файлыgroup_vars, вы должны использовать синтаксис YAML:key: value- В файлах
group_vars, используйте полное имяkey:ansible_network_os: vyos. - В плейбуках используйте сокращенное имя
key, которое опускает префиксansible:network_os: vyos
- В файлах
Группировка инвентаря по платформам
По мере роста вашего инвентаря вы можете сгруппировать устройства по платформам. Это позволяет легко указать платформоспецифичные переменные для всех устройств на этой платформе:
[vyos_leafs] leaf01 ansible_host=10.16.10.11 leaf02 ansible_host=10.16.10.12 [vyos_spines] spine01 ansible_host=10.16.10.13 spine02 ansible_host=10.16.10.14 [vyos:children] vyos_leafs vyos_spines [vyos:vars] ansible_connection=network_cli ansible_network_os=vyos ansible_user=my_vyos_user [network:children] vyos [servers] server01 ansible_host=10.16.10.15 server02 ansible_host=10.16.10.16 [datacenter:children] vyos servers
С этой настройкой вы можете запустить first_playbook.yml только с двумя флагами:
ansible-playbook -i inventory -k first_playbook.yml
С флагом -k, вы предоставляете пароль(и) SSH в процессе запроса. В качестве альтернативы, вы можете хранить SSH и другие секреты и пароли безопасно в файлах group_vars с помощью ansible-vault
Защита конфиденциальных переменных с помощью 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_ssh_pass'
Если вы предпочитаете ввести свой пароль ansible-vault, а не хранить его в файле, вы можете запросить ввод пароля:
ansible-vault encrypt_string --vault-id my_user@prompt 'VyOS_SSH_password' --name 'ansible_ssh_pass'
и введите пароль vault для my_user.
Флаг --vault-id позволяет использовать разные пароли vault для разных пользователей или разных уровней доступа. Вывод включает имя пользователя my_user из вашей команды ansible-vault и использует синтаксис YAML key: value:
ansible_ssh_pass: !vault |
$ANSIBLE_VAULT;1.2;AES256;my_user
66386134653765386232383236303063623663343437643766386435663632343266393064373933
3661666132363339303639353538316662616638356631650a316338316663666439383138353032
63393934343937373637306162366265383461316334383132626462656463363630613832313562
3837646266663835640a313164343535316666653031353763613037656362613535633538386539
65656439626166666363323435613131643066353762333232326232323565376635
Encryption successful
Скопируйте этот вывод в ваш файл инвентаря под [vyos:vars], который теперь выглядит так:
[vyos:vars]
ansible_connection=network_cli
ansible_network_os=vyos
ansible_user=my_vyos_user
ansible_ssh_pass= !vault |
$ANSIBLE_VAULT;1.2;AES256;my_user
66386134653765386232383236303063623663343437643766386435663632343266393064373933
3661666132363339303639353538316662616638356631650a316338316663666439383138353032
63393934343937373637306162366265383461316334383132626462656463363630613832313562
3837646266663835640a313164343535316666653031353763613037656362613535633538386539
65656439626166666363323435613131643066353762333232326232323565376635
Для запуска плейбука с этой настройкой, убрать флаг -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_ssh_pass" -e "@vyos_no_connection.yml" --ask-vault-pass
Vault password:
localhost | SUCCESS => {
"ansible_ssh_pass": "VyOS_SSH_password"
}
Предупреждение
Контент Vault может быть расшифрован только с помощью пароля, который использовался для его шифрования. Если вы хотите перестать использовать один пароль и перейти к новому, вы можете обновить и повторно зашифровать существующий контент vault с помощью ansible-vault rekey myfile, а затем указать старый и новый пароли. Копии контента vault, который все еще зашифрован старым паролем, все еще могут быть расшифрованы с помощью старого пароля.
Для получения более подробной информации о создании файлов инвентаря см. введение в инвентарь; для получения более подробной информации об ansible-vault см. полную документацию по Ansible Vault.
Теперь, когда вы понимаете основы команд, плейбуков и инвентаря, пришло время изучить более сложные примеры Ansible Network.
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.5/network/getting_started/first_inventory.html