Создайте свой инвентарь
Запуск книги сценариев без инвентаря требует нескольких флагов командной строки. Кроме того, запуск книги сценариев на одном устройстве не обеспечивает значительной экономии эффективности по сравнению с ручным внесением тех же изменений. Следующим шагом для использования всех возможностей 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–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.10/network/getting_started/first_inventory.html