Spec-Zone.ru › Ansible 2.11

Создайте свой инвентарь

Запуск книги сценариев без инвентаря требует нескольких флагов командной строки. Кроме того, запуск книги сценариев на одном устройстве не обеспечивает значительной экономии эффективности по сравнению с ручным внесением тех же изменений. Следующим шагом для использования всех возможностей 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), когда вы запускаете свои книги сценариев. Вот простой пример.

  1. Создайте файл и запишите в него свой пароль для ansible-vault:
echo "my-ansible-vault-pw" > ~/my-ansible-vault-pw-file
  1. Создайте зашифрованный пароль 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

Spec-Zone.ru

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