Ansible:根据特定事实计算主机数

2024-09-26 22:51:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Ansible 2.9.13管理大约250个ubuntu客户端。 如果我列出一个客户的所有事实,其中一行是:

"distribution_release": "bionic",

我现在想做的是计算机器的数量,这些机器是仿生的、聚焦的,以及它可能找到的任何其他版本。 比如说:

bionic:  180
focal:   42
precise: 2

这可能吗?如果可能,如何实现


Tags: 版本机器客户端数量release客户ubuntu计算机
2条回答

在单个任务中从hostvars创建字典

- hosts: all
  tasks:
    - set_fact:
        distros: "{{ distros|default({})|
                     combine({ item.0: item.1|length }) }}"
      loop: "{{ hostvars|dict2items|
                groupby('value.ansible_distribution_release') }}"
      run_once: true

当使用json\u query时,可以不迭代地创建相同的字典

- hosts: all
  tasks:
    - set_fact:
        distros: "{{ dict(keys|zip(vals)) }}"
      vars:
        dist: "{{ hostvars|dict2items|
                  json_query('[].{distro: value.ansible_distribution_release}')|
                  groupby('distro') }}"
        keys: "{{ dist|map('first')|list }}"
        vals: "{{ dist|map('last')|map('length')|list }}"
      run_once: true

下一个选项是在自定义过滤器的帮助下创建字典

shell> cat filter_plugins/count.py
def count(l):
    d = {}
    for i in set(l):
        d[i] = l.count(i)
    return d

class FilterModule(object):

        def filters(self):
            return {
                'count': count,
                }
- hosts: all
  tasks:
    - set_fact:
        distros: "{{ hostvars|
                     json_query('*.ansible_distribution_release')|
                     count}}"
      run_once: true

您可以使用group_by动态创建新的动态组

 -
 - name: Count hosts based on ansible_distribution_release
   hosts: "{{ target|default('all') }}"
   gather_facts: true

   tasks:
    - name: Create dynamic groups
      group_by:
        key: dist_release_{{ ansible_distribution_release }}

 - name: Make the statistics
   hosts: localhost
   gather_facts: false

   tasks:
     - name: Sample output
       debug:
         msg: "Group {{ item }} has {{ groups[item] | length }} hosts."
       when: item.startswith('dist_release_')
       loop: "{{ groups|flatten(levels=1) }}"

第一个剧本基于{{ ansible_distribution_release }}创建动态组,所有组都以前缀dist_开头

在第二个重头戏中,动态组将用于创建组和组内主机数量的一个相当丑陋但有效的统计数据

如果您愿意,您可以使用Jinja2模板创建一个漂亮的文件输出

相关问题 更多 >

    热门问题