Ссылка на иерархию Ansible Inventory

Я хотел бы иметь возможность ссылаться на прямого родителя доступного хоста в качестве переменной.

Возьмите следующий пример инвентаризации:

[resourcegroup1]
host1
host2

[resourcegroup2]
host3
host4

[application:children]
[resourcegroup1]

[database:children]
[resourcegroup2]

[environoments:children]
[application]
[database]

[enivronoments]
dev
staging
prod

Я хотел бы запустить задачу цикла в игре, которая может ссылаться на родительский объект hosts. Пример:

tasks:
- name: Start Datanbase Servers
  with_items: "{{ groups['database'] }}"   
  azure_rm_virtualmachine:
    name: "{{ item }}"
    resource_group: "{{ item.parent }}"
    started: yes
    allocated: yes

{{item}} будет перебирать значения "host3" и "host4", пока я ищу то, что я мог бы поставить вместо {{item.parent}}, который был бы прямым родительским элементом hosts, в данном случае: " группа ресурсов2 ".

Есть ли способ сослаться на иерархию инвентаря?


person Drew    schedule 27.08.2018    source источник
comment
Привет, @Drew! Вполне возможно, что интересующий вас функционал не может быть встроен в Ansible. Чего вы пытаетесь достичь, зная иерархию инвентаря? Может быть, есть другой подход к тому, что вы пытаетесь сделать.   -  person Michael Ababio    schedule 29.08.2018


Ответы (1)


Проведя небольшое исследование, выяснилось, что в Ansible нет такой встроенной функциональности.

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

Ansible Tix

Ansible Tix

Вот несколько фрагментов из приведенных выше ссылок:

Было бы неплохо иметь способ воссоздать иерархию групп инвентаря внутри, то есть в шаблоне Jinja2.

@kinvaris Для этого у нас есть динамический инвентарь. Вы можете просто написать небольшой скрипт динамической инвентаризации и перевести его. Я не понимаю, почему это необходимое дополнение, оно только еще больше усложняет инструменты.

Если вам просто нужен список групп, связанных с хостом, но не интересует иерархическая структура:

'{{hostvars["host1"]}}'

Вы получите такой список:

"groups": {
            "all": [
                "host"
            ],
            "child": [
                "host1"
            ],
            "parent": [
                "host1"
            ],
            "ungrouped": []
        },
person Michael Ababio    schedule 27.08.2018
comment
Спасибо за ответ, Майкл. Я только что обратил на это внимание ok: [localhost] => (item=host1) => { "msg": "" } ok: [localhost] => (item=host2) => { "msg": "" } Кажется, наша анзиблевая башня не кэшировала никаких фактов, и playbook не извлекает никаких хостваров (а у меня в настоящее время их нет). Нет ли способа запросить инвентарь (в данном случае это инвентарь анзибельной башни) и вытащить дочерние элементы группы базы данных? Примерно так: {{inventory.database}} - person Drew; 28.08.2018
comment
Вся группа находится вверху, потому что словарь был напечатан в алфавитном порядке. Но поскольку словари не отсортированы, порядок в приведенной выше расшифровке случайный. - person techraf; 28.08.2018
comment
@techraf Вы правы! Я провел небольшое исследование, и похоже, что то, о чем спрашивает Дрю, не является функцией Ansible. Позвольте мне обновить свой ответ. - person Michael Ababio; 29.08.2018
comment
Спасибо Майклу за исследование и ответ. То, что @kinvaris заявил о динамической инвентаризации, как раз и является моей целью: динамически извлекать данные из Azure и добавлять немного метаданных для группировки групп ресурсов вместе. После этого я просто хотел бы, чтобы задачи выполнялись через все серверы метагруппы, но при этом у меня была возможность ссылаться на имя группы ресурсов, полученное через динамическую инвентаризацию. Однако, если это не функция, это не функция. Еще раз спасибо, Майкл. - person Drew; 29.08.2018