2024-09-26 22:51:44 发布
网友
我正在使用Ansible 2.9.13管理大约250个ubuntu客户端。 如果我列出一个客户的所有事实,其中一行是:
"distribution_release": "bionic",
我现在想做的是计算机器的数量,这些机器是仿生的、聚焦的,以及它可能找到的任何其他版本。 比如说:
bionic: 180 focal: 42 precise: 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动态创建新的动态组
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_开头
{{ ansible_distribution_release }}
dist_
在第二个重头戏中,动态组将用于创建组和组内主机数量的一个相当丑陋但有效的统计数据
如果您愿意,您可以使用Jinja2模板创建一个漂亮的文件输出
在单个任务中从hostvars创建字典
当使用json\u query时,可以不迭代地创建相同的字典
下一个选项是在自定义过滤器的帮助下创建字典
您可以使用
group_by
动态创建新的动态组第一个剧本基于
{{ ansible_distribution_release }}
创建动态组,所有组都以前缀dist_
开头在第二个重头戏中,动态组将用于创建组和组内主机数量的一个相当丑陋但有效的统计数据
如果您愿意,您可以使用Jinja2模板创建一个漂亮的文件输出
相关问题 更多 >
编程相关推荐