Может ли Ansible инвентарь включать другой? - PullRequest
1 голос
/ 01 ноября 2019

У нас есть набор серверов, совместно используемых различными экземплярами приложения, и мы хотели бы, чтобы список из них был отдельным файлом с другими - специфическими для экземпляра инвентаризациями - , включая it.

(я знаю, это можно сделать с динамическими запасами, но это код, и мы бы хотели, чтобы наши списки серверов оставались, так сказать, data .)

С INI-инвентарем это невозможно, но с YAML-ином это мучительно близко. Например, этот ответ показывает, как это можно сделать, добавив обработчик для !include в YAML-парсер Python. Затем можно написать:

all:
  group1:
    host1:
    host2:
  sharedservers: !include shared-servers.yaml

Как можно добавить эту функциональность в собственный репозиторий Ansible, предпочтительно без реализации целого нового модуля-инвентаря (хотя наследование от существующего модуля Ansible было бы в порядке)?

Ответы [ 2 ]

1 голос
/ 02 ноября 2019

Вы можете воспользоваться преимуществами того, что уже есть в Ansible:

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

  2. Вы можете использовать несколько источников ресурсов, используя:

    • несколько -i параметров в командной строке
    • переменная окружения ANSIBLE_INVENTORY и список разделенных запятыми списков путей инвентаризации (каталоги или файлы)
    • опция inventory в ansible.cfg, чтобы сделать то же самое, что и выше.

См. документы .

Я сомневаюсь, что с вышеизложенным вы не сможете удовлетворить свои потребности. Лучше немного изменить скрипты-обертки и файловую структуру вашего проекта, чем взломать pyyaml ​​и ansible. /intro_inventory.html?highlight=inventory каталог # using-множественные ресурсы-источников) для получения дополнительной информации.

1 голос
/ 01 ноября 2019

Начнем с того, что ваш пример инвентаризации в вашем вопросе не соответствует схеме для ANSI и будет отклонен при разборе.

Теперь, чтобы ответить на ваш вопрос, вы можете просто использовать несколько инвентаризаций одновременно. Вот простой пример:

Я создал 3 инвентарных файла yaml:

  • inventories/hosts.yml
---
all:
  children:
    group1:
      hosts:
        host1:
        host2:
  • inventories/otherhosts.yml
---
all:
  children:
    group2:
      hosts:
        hostA:
        hostB:
  • и, наконец, inventories/shared.yml
---
all:
  children:
    sharedservers:
      hosts:
        host3:
        host4:

Оттуда довольно легко обратиться ко всем необходимым хостам:

  • Обращайтесь ко всем хостам во всех файлах инвентаризации:
  ansible -i inventories/ all --list-hosts
  hosts (6):
    host1
    host2
    hostA
    hostB
    host3
    host4

Это эквивалентно вызову каждого файла yaml в отдельной опции -i в этом случае

ansible -i inventories/hosts.yml \
-i inventories/otherhosts.yaml -i inventories/shared.yml all --list-hosts
  • Обращайтесь только к конкретным запасам
ansible -i inventories/hosts.yml -i inventories/shared.yml all --list-hosts
hosts (4):
  host1
  host2
  host3
  host4

ansible -i inventories/otherhosts.yml -i inventories/shared.yml all --list-hosts
hosts (4):
  hostA
  hostB
  host3
  host4
...