Spec-Zone.ru › Ansible

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

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

---

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.

Проверка инвентаря

Для отображения инвентаря в том виде, в каком его видит Ansible, можно использовать команду CLI ansible-inventory.

$ 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'

и введите пароль хранилища для my_user.

Флаг --vault-id позволяет использовать разные пароли хранилища для разных пользователей или уровней доступа. В выводе содержится имя пользователя 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: 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

Или используйте запрос пароля вместо файла с паролем хранилища:

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"
}

Предупреждение

Содержимое хранилища можно расшифровать только с помощью пароля, использованного для его шифрования. Если вы хотите отказаться от одного пароля и перейти на новый, можно обновить и повторно зашифровать существующее содержимое хранилища с помощью ansible-vault rekey myfile, а затем указать старый и новый пароли. Копии содержимого хранилища, по-прежнему зашифрованные старым паролем, можно расшифровать с помощью старого пароля.

Дополнительные сведения о создании файлов инвентаря см. во введении в инвентарь; дополнительные сведения об ansible-vault см. в полной документации Ansible Vault.

Теперь, когда вы освоили основы команд, плейбуков и инвентаря, можно перейти к более сложным примерам работы с Ansible Network.

© 2012–2018 Michael DeHaan
© 2018–2025 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/projects/ansible/latest/network/getting_started/first_inventory.html

Spec-Zone.ru

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