[英]Ansible: count hosts based on specific fact
我正在使用 Ansible 2.9.13 來管理大約 250 個 ubuntu 客戶端。 如果我列出一個客戶的所有事實,其中一行是:
"distribution_release": "bionic",
我現在想做的是計算機器的數量,它們是仿生的、焦點的,以及它可能找到的任何其他版本。 所以,像這樣:
bionic: 180
focal: 42
precise: 2
這是可能的,如果是,如何?
您可以使用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) }}"
第一個 play 基於{{ ansible_distribution_release }}
創建動態組,所有組都以前綴dist_
。
在第二場比賽中,動態組將僅用於創建組和組內主機數量的相當丑陋但有效的統計數據。
如果您願意,您可以使用 Jinja2 模板創建一個不錯的文件輸出。
在單個任務中從主機變量創建字典
- 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_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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.