Как я могу получить Ansible для групповых хостов на основе фактов об Ansible?

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

Скажем, у меня в /etc/ansible/hosts были следующие серверы (факты ansible_distribution и ansible_distribution_version, указанные в скобках):

mercer (RedHat, 7.2)
grocer (RedHat, 6.2)
draper (Solaris, 10)
fishmonger (RedHat, 7.2)
goldsmith (Solaris, 11)
skinner (RedHat, 7.2)

Я хочу получить файл, который выглядит примерно так:

**RedHat 6.2 Servers**
grocer

**RedHat 7.2 Servers**
mercer
fishmonger
skinner

**Solaris 10 Servers**
draper

**Solaris 11 Servers**
goldsmith

Не знаю, лучше ли попробовать:

A) цикл через play_hosts и извлечение фактов и запись в новую переменную как ('fact1', 'fact2', 'hostname'), а затем цикл по этой новой переменной с помощью groupby в моем шаблоне jinja2 для создания отчета.

Б) Сортировка их всех в недоступной задаче, а затем передача предварительно сгруппированного массива массивов в шаблон и его форматирование.

... и я тоже не могу понять, как это сделать.


person Peter Mabbott    schedule 09.12.2016    source источник


Ответы (1)


Для этого я бы использовал сценарий динамической инвентаризации или модуль инвентаризации group_by. А пока перейдем к модулю инвентаризации. Одна из проблем здесь заключается в том, что ansible_distribution_version необходимо нормализовать до правильной переменной. Я бы сделал это с помощью фильтра. Что-то вроде этого

- hosts: all
  tasks:
  - group_by:
      key: OSGROUP_{{ ansible_distribution_version | upper | regex_relace('(| |\.', '') }}

Регулярное выражение, вероятно, неверно, но идею вы поняли. Позже вы можете ссылаться на группу

- hosts: OSGROUP_REDHAT72
  tasks:
  - debug: msg="Do RedHat 7.2 stuff to {{inventory_name}}"
person Petro026    schedule 09.12.2016
comment
Звучит многообещающе, но есть ли способ перебрать OSGROUP_ *? Я бы предпочел написать одну задачу в очень обобщенном виде, а не иметь одну задачу для каждой группы ОС - если бы ничего другого, это означало бы избежать необходимости добавлять новые задачи каждый раз, когда новые типы ОС попадают в состояние. - person Peter Mabbott; 09.12.2016
comment
похоже, что ответ - использовать что-то вроде следующего: with_dict: groups when: 'OSGROUP_' в item.key, но еще не пробовал. - person Peter Mabbott; 12.12.2016
comment
Вы также можете запускать роли на основе этой группировки. См. docs.ansible.com/ansible/playbooks_roles.html#roles. Предложение when будет выглядеть примерно так, когда: inventory_hostname в группах ['OSGROUP_REDHAT72']. Затем вы можете повторить эту строку для каждого поддерживаемого вами дистрибутива. - person Petro026; 12.12.2016
comment
@PeterMabbott, у вас когда-нибудь работал цикл над хостами? Я делаю нечто подобное, где группируюсь в зоны доступности и обновляю их по одному или распределяю по ним по мере необходимости, чтобы максимизировать доступность приложения. Кажется, я не могу найти правильную комбинацию with_dict и когда работать в соответствии с вашей теорией. - person gremwell; 23.04.2021