簡體   English   中英

Ansible - 從字典中獲取列表值(注冊變量)

[英]Ansible - Getting List Values from within a Dictionary (Regsiter Variable)

所以我正在使用 Ansible 為我們支持的許多服務器處理一些審計點。 在大多數情況下,我不得不使用 shell 模塊來獲取我想要的數據,然后根據通過/失敗情況編寫一些文件。 在很多情況下,這是處理輸出數據的更簡單的方法。 首先,我意識到這不一定是 Ansible 的強項。 我想在某個時候它向公司推銷它可以很容易地做到這一點,我同意 - 在很多方面比僅僅編寫一個自定義的 python/BASH 腳本來做同樣的事情更容易。 所以 - 我確實意識到我在這里稍微彎曲了 Ansible 的概念以進行報告,而不是配置/狀態管理。 然而; 我喜歡這個工具,想向公司展示我們可以從中獲得很多價值。

雖然我可以使用 shell 模塊輕松完成本節,但我想更好地學習 Ansible。 所以想我會發布這個問題。

我正在使用 Yum 模塊來獲取目標主機上的 repolist。 但是我一直對如何提取嵌套在輸出字典中的列表值感到困惑。 我已經對類型進行了一些檢查,據我所知 - 'results' 變量是一個字典,輸出在一個列表中。 我想要做的是從列表中獲取鍵/值,然后根據該輸出執行一些其他任務。 但是對於我的生活 - 我不知道如何做到這一點!

理想情況下 - 我想要么使用一些基於輸出的 'when' 模塊語句(例如,當 repo ID 是.. 這樣做..),或者至少能夠將它們存儲在一個變量中以處理數據。 因此,從這個輸出中,我只想獲取 repoid 以及它是否已啟用。 如何從嵌套列表中獲取這些值?

簡單的劇本:

---
- hosts: localhost
  become: yes
  tasks:

  - name: Section 1.1 - Check Yum Repos
    yum:
      list: repos
    register: section1_1

  - name: Debug
    debug:
      var: section1_1

這是我在此劇本中調試任務的輸出:

TASK [Debug] ****************************************************************************************************************************************************
ok: [localhost] => {
    "section1_1": {
        "changed": false,
        "failed": false,
        "results": [
            {
                "repoid": "ansible",
                "state": "enabled"
            },
            {
                "repoid": "epel",
                "state": "enabled"
            },
            {
                "repoid": "ol7_UEKR6",
                "state": "enabled"
            },
            {
                "repoid": "ol7_latest",
                "state": "enabled"
            }
        ]
    }
}

我懷疑這對外面的人來說可能很容易。 我一直在嘗試這個,現在已經有一段時間了,終於到了我想我只會問的地步:)

由於在section1_1中注冊的輸出是字典列表。 我們可以遍歷每個項目,以獲取字典鍵。

例子:

- name: Get the first repo's repoid and state
  debug:
    msg: "Repo ID: {{ results[0]['repoid'] }}, is {{ results[0]['state'] }}"
# This will show -- Repo ID: ansible, is enabled

同樣,我們可以使用它們的編號訪問其他元素。

或者我們可以循環遍歷數組的每個元素:

- name: loop through array and conditionally do something
  debug:
    msg: "Repo ID is {{ item.repoid }}, so I am going to write a playbook."
  when: item.repoid == 'ansible'
  loop: "{{ results }}"

問: 從列表中獲取鍵/值。

答:有更多的選擇。 鑒於下面的簡化數據

    section1_1:
      changed: false,
      failed: false,
      results:
        - {repoid: ansible, state: enabled}
        - {repoid: epel, state: enabled}
        - {repoid: test9, state: disabled}
  • 使用map創建所有存儲庫的列表。 例如
    - set_fact:
        keys_all: "{{ section1_1.results|
                      map(attribute='repoid')|
                      list }}"
    - debug:
        var: keys_all

  keys_all:
  - ansible
  - epel
  - test9

  • 使用mapselectattr創建已啟用存儲庫的列表。 例如
    - set_fact:
        keys_ena: "{{ section1_1.results|
                      selectattr('state', 'eq', 'enabled')|
                      map(attribute='repoid')|
                      list }}"
    - debug:
        var: keys_ena

  keys_ena:
  - ansible
  - epel

使用items2dict創建字典。 例如

    - set_fact:
        dict: "{{ section1_1.results|
                  items2dict(key_name='repoid', value_name='state') }}"
    - debug:
        var: dict

  dict:
    ansible: enabled
    epel: enabled
    test9: disabled

暫無
暫無

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

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