Создание своего инвентаря
Полностью функциональный файл инвентаря может служить источником истины для вашей сети. Используя файл инвентаря, один плейбук может поддерживать сотни сетевых устройств одной командой. Эта страница показывает, как пошагово создать файл инвентаря.
- Базовый инвентарь
- Добавление переменных в инвентарь
- Группирование переменных в инвентаре
- Синтаксис переменных
- Группировка инвентаря по платформам
- Защита конфиденциальных переменных с помощью
ansible-vault
Базовый инвентарь
Сначала логически сгруппируйте свой инвентарь. Лучшей практикой является группировка серверов и сетевых устройств по их назначению (приложение, стек или микросервис), расположению (дата-центр или регион) и стадии разработки (этап разработки):
- Что: db, web, leaf, spine
- Где: east, west, floor_19, building_A
- Когда: dev, test, staging, prod
Избегайте пробелов, дефисов и цифр в начале имён групп (используйте floor_19, а не 19th_floor). Имена групп чувствительны к регистру.
Этот крошечный пример дата-центра иллюстрирует базовую структуру групп. Вы можете группировать группы, используя синтаксис [metagroupname:children] и перечислять группы в качестве членов метагруппы. Здесь группа network включает все листы и все спины; группа 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_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: network_cli
ansible_network_os: 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 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.8/network/getting_started/first_inventory.html