Ansible - 从字典中获取列表值(寄存器变量)

Ove*_*ast 5 ansible

因此,我正在使用 Ansible 对我们支持的许多服务器进行一些审核点。在大多数情况下,我必须使用 shell 模块来获取我想要的数据,然后根据通过/失败情况编写一些文件。在很多情况下,这是处理输出数据的更简单的方法。首先,我意识到这不一定是 Ansible 的强项。我想在某个时候,有人向公司推销说它可以很容易地做到这一点,我同意——它在很多方面都比仅仅编写一个自定义的 python/BASH 脚本来完成同样的事情更容易。所以 - 我确实意识到我在这里稍微弯曲了 Ansible 的概念来进行报告,而不是配置/状态管理。然而; 我喜欢这个工具,并想向公司展示我们可以从中获得很多价值。

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

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

理想情况下 - 我想使用一些基于输出的“when”模块语句(例如,当存储库 ID 是.. 执行此操作.. 时),或者至少能够将它们存储在变量中以处理数据。因此,从这个输出中,我只想获取 reoid 以及它是否已启用。如何从嵌套列表中获取这些值?

简单的剧本:

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

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

  - name: Debug
    debug:
      var: section1_1
Run Code Online (Sandbox Code Playgroud)

这是本剧本中调试任务的输出:

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"
            }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

我怀疑这对于外面的人来说可能很容易。我已经尝试了很长一段时间了,终于达到了我想我只想问的地步:)

ses*_*i_c 3

由于注册的输出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
Run Code Online (Sandbox Code Playgroud)

同样,我们可以通过编号访问其他元素。

或者我们可以循环遍历数组的每个元素:

- 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 }}"
Run Code Online (Sandbox Code Playgroud)