Ansible-从字​​典中获取列表值(Regsiter变量)

时间:2020-10-30 16:42:39

标签: ansible

因此,我正在使用Ansible对我们支持的许多服务器进行一些审核。在大多数情况下,我不得不使用shell模块来获取所需的数据,然后根据通过/失败情况写入一些文件。在许多情况下,这是处理输出数据的更简单方法。首先,我意识到这不一定是Ansible的长处。我想在某个时候它已经向公司推荐可以很容易地做到这一点,并且我同意-在很多方面,它比编写自定义python / BASH脚本要容易得多。所以-我确实意识到我在这里将Ansible的概念用于报告而不是配置/状态管理。然而;我喜欢该工具,并希望向公司展示我们可以从中获得很多价值。

尽管我可以使用shell模块轻松完成本节,但我想更好地学习Ansible。所以以为我会发布这个问题。

我正在使用Yum模块在目标主机上进行重新抛光。但是我一直对如何提取嵌套在输出字典中的列表值感到困惑。我已经对类型进行了一些检查,据我所知-'results'变量是一个字典,输出在列表中。我要做的是从列表中获取键/值,然后根据该输出执行其他一些任务。但是为了我的一生-我不知道该怎么做!

理想情况下-我想基于输出使用某些“何时”模块语句(例如,当回购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"
            }
        ]
    }
}

我怀疑这对外面的人来说可能很容易。我一直在尝试,这已经有一段时间了,终于到了我以为我会问的地方:)

2 个答案:

答案 0 :(得分:2)

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 }}"

答案 1 :(得分:1)

Q:从列表中获取键/值。

A:还有更多选择。鉴于下面的简化数据

    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

  • 使用 map selectattr 创建一个启用的存储库列表。例如
    - 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