【问题标题】:Ansible lists from json file来自 json 文件的 Ansible 列表
【发布时间】:2019-11-15 10:47:05
【问题描述】:

通过 ansible 我需要解析一个 JSON 文件并根据内容在 linux 系统上运行某种命令。 我努力管理除磁盘部分之外的所有内容,但我仍然坚持。这是 JSON(我分享了几行)

[
    {
        "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"
            }
        ]
    }
]

这是我在剧本中写的:

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


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


    - debug:
        msg: "disklen length is {{ disklen }}"

    - name: Collecting mapped disks
      set_fact:
        localdisks: "{{ ansible_devices.keys() | select('match','sd+') | list }}"



    - debug:
        var: localdisks

我需要: 1) 在ansible_devices.<disk>.links.ids.scsi-<id> 上查找 Disk.ID。例如,从 ansible_devices 获取 sdb 磁盘:

"sdb": {
            "holders": [], 
            "host": "Serial Attached SCSI controller: VMware PVSCSI SCSI Controller (rev 02)", 
            "links": {
                "ids": [
                    "scsi-36000c293b2abdd05935792f86fa53bb9", 
                    "wwn-0x6000c293b2abdd05935792f86fa53bb9"
                ], 
                "labels": [], 
                "masters": [], 
                "uuids": []
            }, 
            "model": "Virtual disk", 
            "partitions": {
                "sdb1": {
                    "holders": [
                        "vgvar-lvvar"
                    ], 
                    "links": {
                        "ids": [
                            "lvm-pv-uuid-lOyio6-WTDV-vcQx-CE2h-TbZk-zsH0-HuMqIc", 
                            "scsi-36000c293b2abdd05935792f86fa53bb9-part1", 
                            "wwn-0x6000c293b2abdd05935792f86fa53bb9-part1"
                        ], 
                        "labels": [], 
                        "masters": [
                            "dm-3"
                        ], 
                        "uuids": []
                    }, 
                    "sectors": "20971519", 
                    "sectorsize": 512, 
                    "size": "10.00 GB", 
                    "start": "1", 
                    "uuid": null
                }
            }

我应该查看 json 文件中的一个 ID 是否与 ansible_devices.sdb.links.ids.scsi-36000c293b2abdd05935792f86fa53bb9 匹配,但它们是 2 个循环,一个来自 ID,一个来自 ansible_devices。 你有什么建议来比较这些元素吗? 谢谢!!

【问题讨论】:

    标签: json ansible


    【解决方案1】:

    下面的任务可能完成了这项工作(假设 JSON 数据存储在 hw_info 中)。

    - debug:
        msg: "{{ item.0.dev }} mounted to device {{ item.1.dev }}"
      loop: "{{ hw_info.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
    

    要调试过滤器,请查看product 过滤器中使用的列表。

    - debug:
        var: item
      loop: "{{ hw_info.0.Disk|
                json_query('[].{dev: DiskFs, id: ID}') }}"
    
    - debug:
        var: item
      loop: "{{ ansible_facts.devices|dict2items|
                json_query('[].{dev: key, ids: value.links.ids}') }}"
    

    问:我应该只在范围为“新”时执行此操作

    A:将scope 项添加到字典中,并在when 条件中使用。例如

    - debug:
        msg: "{{ item.0.dev }} mounted to device {{ item.1.dev }}"
      loop: "{{ hw_info.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"
    

    【讨论】:

    • 您好弗拉基米尔,再次感谢您抽出宝贵时间!它有效,但我必须深入了解如何,因为我并不懒惰。
    • 您对“新”范围有什么建议吗?我应该仅在范围为“新”时执行此操作。我不认为要更改循环,而是在何时添加条件。产品过滤器很棒,但有点帅
    • 当然。这很简单。我已经添加了示例。
    • 所以关键还是item.0,很厉害!!
    • 对不起,但它失败了.. ehehe,我正在寻找的范围来自 json 文件,如果你看到 Disk [] 有一个名为 Scope 的元素。它应该类似于 Disk[i].Scope == "New" 但它应该是一个新循环?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多