我怎样才能让 Ansible 根据 Ansible 事实对主机进行分组?

How can I get Ansible to group hosts based on Ansible facts?

我想生成一份报告(可能使用模板),根据有关主机的事实对主机进行分组。

假设我的 /etc/ansible/hosts 中有以下服务器(括号中指定的 ansible_distributionansible_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') 然后遍历它在我的 jinja2 模板中使用 groupby 的新变量来生成报告。

B) 在 ansible 任务中对它们进行排序,然后将预先分组的数组交给模板,并对其进行格式化。

...我也不知道该怎么做。

我会使用动态清单脚本或 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}}"