Spec-Zone.ru › Ansible 2.6

Создание своего инвентаря

Полностью функциональный файл инвентаризации может служить источником истины для вашей сети. Используя файл инвентаризации, один плейбук может управлять сотнями сетевых устройств одной командой. Эта страница показывает, как пошагово создать файл инвентаризации.

  • Базовый инвентарь
  • Добавление переменных в инвентарь
  • Группирование переменных в инвентаре
  • Синтаксис переменных
  • Группировка инвентаря по платформам
  • Защита конфиденциальных переменных с помощью 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API