Создание своего инвентаря
Запуск книги сценариев без инвентаря требует нескольких флагов командной строки. Кроме того, запуск книги сценариев на одном устройстве не обеспечивает существенного повышения эффективности по сравнению с ручным внесением изменений. Следующим шагом для использования всех возможностей 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] 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'
и введите пароль хранилища для 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 не поддерживает встроенные хранилища:
...
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
Или с запросом вместо файла с паролем хранилища:
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.9/network/getting_started/first_inventory.html