Создание своего инвентаря
Полностью функциональный файл инвентаризации может служить источником истины для вашей сети. Используя файл инвентаризации, один плейбук может управлять сотнями сетевых устройств одной командой. Эта страница показывает, как пошагово создать файл инвентаризации.
- Базовый инвентарь
- Добавление переменных в инвентарь
- Группирование переменных в инвентаре
- Синтаксис переменных
- Группировка инвентаря по платформам
- Защита конфиденциальных переменных с помощью
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
Это пример с использованием фрагмента 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_ssh_pass: !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_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.6/network/getting_started/first_inventory.html