簡體   English   中英

Ansible 如何對來自多個節點的命令輸出進行排序

[英]Ansible how to sort output of command from multiple nodes

我有一個 Ansible playbook,它在我的所有節點上運行一些命令來生成可用圖像列表。 然后在我的 ansible 控制器上,我想生成一個組合的、排序的列表,其中刪除了所有重復項。 我有一本劇本:

- hosts: kube_cluster
  tasks:
  - command: crictl images
    become: yes
    register: cri_images

  - name: save results
    delegate_to: localhost
    run_once: yes
    become: no
    copy:
      dest: cri_images.txt
      content: |
            {% for h in ansible_play_hosts %}
              {{ hostvars[h].cri_images.stdout  }}
            {% endfor %}

這確實生成了文件,但我無法對組合輸出進行排序。

對於每個節點,我會得到如下輸出:

docker.io/bitnami/contour                          1.17.1-debian-10-r0    5be5c048ac5e2       132MB
docker.io/bitnami/envoy                            1.17.3-debian-10-r62   7ff8d931d11c7       150MB
docker.io/calico/cni                               v3.19.1                5749e8b276f9b       146MB
docker.io/calico/node                              v3.19.1                c4d75af7e098e       171MB

在“stdout_lines”中可用。 某些行在某些節點上重復。

我無法調整 jinja 代碼以進行排序並刪除重復項。 可能需要某種形式的嵌套循環,或者一種將hostvars[h].cri_images.stdout展平的hostvars[h].cri_images.stdout 但我不知道該怎么做。 我得到的大多數是語法/模板錯誤。

另外,我還想:

  • 刪除輸出的標題行
  • 可以選擇僅選擇組合輸出的幾列。

在 shell 腳本中,這可以通過

cat cri_images.txt | grep -v ^IMAGES | awk '{print $1 ":" $2}' | sort | uniq

但要求是它必須在 Ansible 中運行。

有人有提示嗎? 謝謝。

問: 我所有節點上的一些命令會生成可用圖像列表……生成一個組合的排序列表,其中刪除了所有重復項。

A:為了測試,讓我們拆分主機名,而不是生成可用圖像的列表,例如

- hosts: test_11,test_12,test_13
  tasks:
    - set_fact:
        cri_images: "{{ {}|combine({'stdout_lines': 
                                    inventory_hostname.split('_')}) }}"
    - debug:
        var: cri_images.stdout_lines

ok: [test_12] => 
  cri_images.stdout_lines:
  - test
  - '12'
ok: [test_11] => 
  cri_images.stdout_lines:
  - test
  - '11'
ok: [test_13] => 
  cri_images.stdout_lines:
  - test
  - '13'

然后,生成一個合並的排序列表,刪除所有重復項

    - copy:
        dest: cri_images.txt
        content: "{{ _content | join('\n') }}"
      vars:
        _content: "{{ ansible_play_hosts|
                      map('extract', hostvars, ['cri_images', 'stdout_lines'])|
                      flatten|unique|sort }}"
      delegate_to: localhost
      run_once: true

shell> cat cri_images.txt
11
12
13
test

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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