首页 > 解决方案 > 将字典的ansible列表转换为具有不同结构的json

问题描述

我对如何将字典列表转换为需要作为变量发送到另一个模块的 json 结构有点不知所措

首先,我有一个 dict 列表,其中描述了有关我正在创建的“团队”的所有信息(在 awx / Tower 中)。此列表详细介绍了有关我的团队的大量信息。对于我需要做的下一次更新,并非所有内容都需要转换为 JSON 结构。

awxTeamsDefinition:
  - { teamname: Team1, ldapgroupname: tower-team-1, description: This is tower team 1, organization: orgA }
  - { teamname: Team2, ldapgroupname: tower-team-2, description: This is tower team 2, organization: orgA }
  - { teamname: Team3, ldapgroupname: tower-team-3, description: This is tower team 3, organization: orgB }  
  - { teamname: Team4, ldapgroupname: tower-team-4, description: This is tower team 4, organization: orgB }

接下来,我需要提取一些信息并将其粘贴到如下所示的 JSON 结构中:

{
 "Team1": {
  "remove": true,
  "organization": "orgA",
  "users": "cn=tower-team-1,cn=groups,cn=accounts,dc=domain,dc=com"
 },
 "Team2": {
  "remove": true,
  "organization": "orgA",
  "users": "cn=tower-team-2,cn=groups,cn=accounts,dc=domain,dc=com"
 },
 "Team3": {
  "remove": true,
  "organization": "orgB",
  "users": "cn=tower-team-3,cn=groups,cn=accounts,dc=domain,dc=com"
 },
 "Team4": {
  "remove": true,
  "organization": "orgB",
  "users": "cn=tower-team-4,cn=groups,cn=accounts,dc=domain,dc=com"
 }
}

我需要一个变量中的这个 JSON 结构,我可以将它传递给另一个模块。

这简直超出了我的 ansible / jinja 诡计能力。我不知道如何从 dict 中提取并提升每个 json 条目的索引(在本例中为“teamname”),去掉“description”,并使用“ldapgroupname”替换为 cn 结构. 任何帮助,将不胜感激。谢谢!

标签: jsonansibleyamljinja2

解决方案


下面的任务

   - set_fact:
        data1: "{{ data1|default({})|
                   combine({item.teamname:
                             {'remove': true,
                              'organization': item.organization,
                              'users': 'cn=' ~ item.ldapgroupname ~ users_append}}) }}"
      loop: "{{ awxTeamsDefinition }}"
      vars:
        users_append: ",cn=groups,cn=accounts,dc=domain,dc=com"
    - debug:
        var: data1|to_nice_json

  data1|to_nice_json: |-
    {
        "Team1": {
            "organization": "orgA",
            "remove": true,
            "users": "cn=tower-team-1,cn=groups,cn=accounts,dc=domain,dc=com"
        },
        "Team2": {
            "organization": "orgA",
            "remove": true,
            "users": "cn=tower-team-2,cn=groups,cn=accounts,dc=domain,dc=com"
        },
        "Team3": {
            "organization": "orgB",
            "remove": true,
            "users": "cn=tower-team-3,cn=groups,cn=accounts,dc=domain,dc=com"
        },
        "Team4": {
            "organization": "orgB",
            "remove": true,
            "users": "cn=tower-team-4,cn=groups,cn=accounts,dc=domain,dc=com"
        }
    }

推荐阅读