从Ansible中的JSON文件创建键值列表

时间:2019-08-27 07:29:39

标签: json ansible

我的数据在json文件中,如下所示:

vmdata.json

{
  "VMDetails":
  [
    {
      "name": "Owner1",
      "vms": [ "vm10", "vm11", "vm12", "vm13" ]
    },
    {
      "name": "Owner2",
      "vms": [ "vm20", "vm21", "vm22", "vm23" ]
    },
    {
      "name": "Owner3",
      "vms": [ "vm30", "vm31", "vm32", "vm33" ]
    }
  ]
}

我需要将此json数据转换为键值对列表,然后用于在vcenter上标记VM。

Owner1: vm11
Owner1: vm12
Owner1: vm13
Owner1: vm14
Owner2: vm21
Owner2: vm22
Owner2: vm23
Owner2: vm24
Owner3: vm31
Owner3: vm32
Owner3: vm33
Owner3: vm34

我已经使用以下命令将数据文件中的内容分配给了变量:

vms_tobe_tagged: "{{ lookup ('file', 'vmtags.json')| from_json}}"

我查询并使用此列表获取所有者列表,效果很好:

   - set_fact:
        Owner: "{{ vms_tobe_tagged| json_query('OwnerDetails[*].name') }}"

    - name: Test loop
      debug:
        msg: "{{ Owner }}"

是否可以使用此生成数据?

loop: "{{ ['alice', 'bob'] |product(['clientdb', 'employeedb', 'providerdb'])|list }}"

2 个答案:

答案 0 :(得分:0)

  

Q:“我需要将此json数据转换为键值对列表...”

Owner1: vm11
Owner1: vm12
Owner1: vm13
Owner1: vm14
Owner2: vm21
...
  

是否可以使用“产品”过滤器生成数据?

A:是的。使用product过滤器,可以创建一个包含所有产品的列表。键值对的列表可以在下一个循环中创建。例如下面的任务

- set_fact:
    owner_list: "{{ owner_list|
                    default([]) +
                    [item.name]|product(item.vms)|list }}"
  loop: "{{ vms_tobe_tagged.VMDetails }}"

- set_fact:
    owner: "{{ owner|
               default([]) +
               [{item.0: item.1}] }}"
  loop: "{{ owner_list }}"

- debug:
    var: owner

给予

"owner": [
    {
        "Owner1": "vm10"
    }, 
    {
        "Owner1": "vm11"
    }, 
    {
        "Owner1": "vm12"
    }, 
    {
        "Owner1": "vm13"
    }, 
    {
        "Owner2": "vm20"
    ...

答案 1 :(得分:0)

这帮助了我。我使用json_query和with_subelements进行迭代。

- set_fact:
        VMOwnerdetails: "{{ vms_tobe_tagged| json_query('VMDetails[*]') }}"

    - name: Verbose updates
      with_subelements:
        - "{{VMOwnerdetails}}"
        - vms
      debug:
        msg: "{{ item.0.name }} :  {{ item.1 }}"