json文件中的Ansible循环列表

json文件中的Ansible循环列表,json,parsing,ansible,Json,Parsing,Ansible,通过ansible,我需要解析一个JSON文件并基于内容,在linux系统上运行某种命令。下面是几行示例: [ { "Hostname": "cavia", "Farm": "paolo", "Cluster": "paperino", "Gateway": "10.14.35.1", "Dns": "172.26.5.110,172.26.5.111,172.26.16.11,172.26.16.12",

通过ansible,我需要解析一个JSON文件并基于内容,在linux系统上运行某种命令。下面是几行示例:

[
    {
        "Hostname": "cavia",
        "Farm": "paolo",
        "Cluster": "paperino",
        "Gateway":  "10.14.35.1",
        "Dns": "172.26.5.110,172.26.5.111,172.26.16.11,172.26.16.12",
        "Routes": "0",
        "Network": [
            {
                "MAC":"00:50:56:b6:c0:db",
                "Vlan":"107 - 10.14.8.0/24 - BE WW TF",
                "Scope": "Production",
                "IP": "10.14.35.9",
                "MASK": "255.255.255.224"
            },
            {
                "MAC":"50:56:b6:19:0c",
                "Vlan":"5 - 10.4.81.0/24 - BE WW TF",
                "Scope": "BE",
                "IP": "10.4.5.9",
                "MASK": "255.255.255.224"
            },
            {
                "MAC":"00:50:56:b6:19:aa",
                "Vlan":"4 - 0.14.81.0/24 - BE WW TF",
                "Scope": "NFS",
                "IP": "172.10.0.5",
                "MASK": "255.255.0.0"
            },
            {
                "MAC":"00:50:b6:19:0c",
                "Vlan":"10087 - 10.14.81.0/24 - BE WW TF",
                "Scope": "Backup",
                "IP": "10.4.96.28",
                "MASK": "255.255.254.0"
            }
        ],   
        "Disk": [
            {
                "ID": "36000c29ccb2f18976786181535e88772",
                "Scope": "New",
                "DiskFs": "/prova"
            },
            {
                "ID": "36000c29ccb2f18976786181535e86553",
                "Scope": "New",
                "DiskFs": "/pippo"
            }
        ]
    }
]
事实上,我能够: -从json中获取磁盘ID并在系统上查找该ID -如果前一步确实有效,playbook将创建分区、vg、lvol、文件系统并装载文件系统 -我缺少的是。。只有当json文件中的作用域为“新建”时,才能执行这些操作

我分享剧本的细节:

---
- name: "Phase 4 : Filesystem Configuration"
  hosts: just_parsed
  data: "{{ lookup('file', '../data/data.json') }}"
  gather_facts: true
  tasks:


    - set_fact:
        disklen: "{{ data[0].Disk | length }}"



#    - debug:
#        var: data[0].Disk[{{ item }}].DiskFs 
#      with_sequence: start=0 end={{ disklen|int -1 }}


    - name: Clearing any existing mountpoint 
      file:
        path: "{{ data[0].Disk[item | int() ].DiskFs }}"
        state: absent
      when: data[0].Disk[item | int() ].Scope =='New'
      with_sequence: start=0 end={{ disklen|int -1 }}
      become: true
      become_method: sudo


    - name: Creating new mountpoint
      file:
        path: "{{ data[0].Disk[item | int() ].DiskFs }}"
        state: directory
        mode: '0755'
      when: data[0].Disk[item | int() ].Scope =='New'
      with_sequence: start=0 end={{ disklen|int -1 }}
      become: true
      become_method: sudo


- name: Creating partitions
      parted:
        device: "/dev/{{ item.1.dev }}"       
        number: 1
        flags: [ lvm ]
        label: msdos
        state: present
      become: true
      become_method: sudo
      loop: "{{ data[0].Disk|
            json_query('[].{dev: DiskFs, id: ID}')|
            product(
            ansible_facts.devices|dict2items|
            json_query('[].{dev: key, ids: value.links.ids}'))|
            list }}"
      when: item.1.ids|map('search', item.0.id) is any


    - name: Creating volume groups
      lvg:
        vg: "{{ item.0.dev | basename }}-vg"
        pvs: "/dev/{{ item.1.dev }}1"
      become: true
      become_method: sudo
      loop: "{{ data[0].Disk|
            json_query('[].{dev: DiskFs, id: ID}')|
            product(
            ansible_facts.devices|dict2items|
            json_query('[].{dev: key, ids: value.links.ids}'))|
            list }}"
       when: item.1.ids|map('search', item.0.id) is any


    - name: Creating logical volumes
      lvol:
        vg: "{{ item.0.dev | basename }}-vg"
        lv: "{{ item.0.dev | basename }}-vol"
        size: 100%FREE
      become: true
      become_method: sudo
      loop: "{{ data[0].Disk|
            json_query('[].{dev: DiskFs, id: ID}')|
            product(
            ansible_facts.devices|dict2items|
            json_query('[].{dev: key, ids: value.links.ids}'))|
            list }}"
       when: item.1.ids|map('search', item.0.id) is any


    - name: Creating filesystems
      filesystem:
        fstype: xfs
        dev: "/dev/{{ item.0.dev | basename }}-vg/{{ item.0.dev | basename }}-vol"
      become: true
      become_method: sudo
      loop: "{{ data[0].Disk|
            json_query('[].{dev: DiskFs, id: ID}')|
            product(
            ansible_facts.devices|dict2items|
            json_query('[].{dev: key, ids: value.links.ids}'))|
            list }}"
       when: item.1.ids|map('search', item.0.id) is any


    - name: Mounting filesystems
      mount:
        path: "{{ item.0.dev }}"
        src: "/dev/{{ item.0.dev | basename }}-vg/{{ item.0.dev | basename }}-vol"
        fstype: xfs
        state: mounted
      become: true
      become_method: sudo
      loop: "{{ data[0].Disk|
            json_query('[].{dev: DiskFs, id: ID}')|
            product(
            ansible_facts.devices|dict2items|
            json_query('[].{dev: key, ids: value.links.ids}'))|
            list }}"
       when: item.1.ids|map('search', item.0.id) is any
关于
数据[0]。磁盘[I]。作用域
时,如何写入条件?当磁盘ID匹配时,我只需要在该磁盘的作用域是新的情况下执行所有操作。
感谢大家进行测试,我已将此项添加到磁盘列表
数据[0]。磁盘

        {
            "ID": "5cd2e42981b06cef",
            "Scope": "New",
            "DiskFs": "/pippo2"
        }
下面的任务

- debug:
    msg: "{{ item.0.dev }} mounted to device
          {{ item.1.dev }} scope
          {{ item.0.scope }}"
  loop: "{{ data.0.Disk|
            json_query('[].{dev: DiskFs, id: ID, scope: Scope}')|
            product(
            ansible_facts.devices|dict2items|
            json_query('[].{dev: key, ids: value.links.ids}'))|
            list
            }}"
  when:
    - item.1.ids|map('search', item.0.id) is any
    - item.0.scope == "New"
给予


在细节上,剧本

- hosts: localhost
  vars:
    data: "{{ lookup('file', 'test4-data.json') }}"
  tasks:
    - set_fact:
        list_fs: "{{ data.0.Disk|
                     json_query('[].{dev: DiskFs,
                                     id: ID,
                                     scope: Scope}') }}"
    - debug:
        var: list_fs
    - set_fact:
        list_disk: "{{ ansible_facts.devices|
                       dict2items|
                       json_query('[].{dev: key,
                                       ids: value.links.ids}') }}"
    - debug:
        var: list_disk
    - debug:
        msg: "{{ item.0.dev }} mounted to device
              {{ item.1.dev }} scope
              {{ item.0.scope }}"
      loop: "{{ list_fs|product(list_disk)|list }}"
      when:
        - item.1.ids|map('search', item.0.id) is any
        - item.0.scope == "New"
给予


完美的我还将scope:scope添加到json_查询中,但我对产品过滤器感到困惑。超级的!!!
- hosts: localhost
  vars:
    data: "{{ lookup('file', 'test4-data.json') }}"
  tasks:
    - set_fact:
        list_fs: "{{ data.0.Disk|
                     json_query('[].{dev: DiskFs,
                                     id: ID,
                                     scope: Scope}') }}"
    - debug:
        var: list_fs
    - set_fact:
        list_disk: "{{ ansible_facts.devices|
                       dict2items|
                       json_query('[].{dev: key,
                                       ids: value.links.ids}') }}"
    - debug:
        var: list_disk
    - debug:
        msg: "{{ item.0.dev }} mounted to device
              {{ item.1.dev }} scope
              {{ item.0.scope }}"
      loop: "{{ list_fs|product(list_disk)|list }}"
      when:
        - item.1.ids|map('search', item.0.id) is any
        - item.0.scope == "New"
  list_fs:
  - dev: /prova
    id: 36000c29ccb2f18976786181535e88772
    scope: New
  - dev: /pippo
    id: 36000c29ccb2f18976786181535e86553
    scope: New
  - dev: /pippo2
    id: 5cd2e42981b06cef
    scope: New

  list_disk:
  - dev: mmcblk0
    ids:
    - mmc-SU16G_0x1ccbfa6f
  - dev: nvme0n1
    ids:
    - nvme-SSDPEKKF256G8_NVMe_INTEL_256GB_BTHH832111P1256B
    - nvme-eui.5cd2e42981b06cef
  - dev: loop3
    ids: []
  - dev: loop2
    ...

  msg: /pippo2 mounted to device nvme0n1 scope New