簡體   English   中英

Ansible:根據特定事實計算主機

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM