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

Ansible-从字典中获取列表值(Regsiter变量),ansible,Ansible,因此,我正在为我们支持的许多服务器使用Ansible处理一些审计点。在大多数情况下,我不得不使用shell模块获取所需的数据,然后根据通过/失败案例编写一些文件。在很多情况下,这是处理输出数据的更简单的方法。首先,我意识到这不一定是Ansible的强项。我想在某个时候,有人向该公司推荐,它可以很容易地做到这一点,我也同意这一点——在许多方面,这比编写自定义python/BASH脚本来实现这一点要容易得多。因此,我意识到我在这里将Ansible的概念弯曲了一点,用于报告,而不是配置/状态管理。然而

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

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

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

理想情况下-我希望基于输出使用一些“when”模块语句(例如,当repo ID为..do this..时),或者至少能够将它们存储在变量中以处理数据。因此,从这个输出中,我只想得到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"
            }
        ]
    }
}

我怀疑这对外面的人来说可能很容易。我一直在尝试这一点,这已经有一段时间了,最后我想我会问:)

,因为registed in
section 1_1
的输出是一个字典列表。我们可以循环遍历每个项目,以获取字典键

例如:

-name:获取第一个回购的repoid和状态
调试:
msg:“Repo ID:{{results[0]['repoid']}},是{{results[0]['state']}”
#这将显示--Repo ID:ansible已启用
类似地,我们可以使用其他元素的编号来访问它们

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

-name:循环数组并有条件地执行某些操作
调试:
msg:“Repo ID是{{item.repoid}},所以我要写一本剧本。”
时间:item.repoid==“ansible”
循环:“{{results}}”
Q:从列表中获取键/值。

答:还有更多的选择。根据下面的简化数据

第1节\u 1:
更改为:false,
失败:false,
结果:
-{repoid:ansible,state:enabled}
-{repoid:epel,state:enabled}
-{repoid:test9,state:disabled}
  • 使用map创建所有回购协议的列表。比如说
-设置事实:
所有键:{{section1_1.results|
映射(属性='repoid')|
列表}”
-调试:
var:keys\u all
给予

keys\u all:
-安西布尔
-埃佩尔
-测试9

  • 使用map并选择attr创建已启用回购的列表。比如说
-设置事实:
键:{{section1\u 1.results|
选择属性('state','eq','enabled')|
映射(属性='repoid')|
列表}”
-调试:
var:keys_ena
给予

keys\u ena:
-安西布尔
-埃佩尔

使用items2dict创建字典。比如说

-设置事实:
格言:“{{section1_1.results|
items2dict(key_name='repoid',value_name='state')}”
-调试:
var:dict
给予

dict:
ansible:启用
epel:已启用
测试9:禁用

太棒了,我想这正是我需要的。我确实发现我可以使用[index]来访问项目,现在我可以看到如何在循环中处理它。我必须使用寄存器中的“variable.results”使其正常工作(section1_1.results)。但这就成功了!循环:“{{section1_1.results}}”我想我现在明白了-谢谢!)我喜欢用更多的方式做事。现在你给了我几个小时的逻辑让我继续玩。谢谢弗拉达米尔。不用说,我偶然发现了你对其他相关主题的一些评论(顺便说一句,总是很有帮助的)。我发现在Ansible中,我经常需要改变构建逻辑的方式,例如,与Python相反。这将是一个巨大的帮助!