簡體   English   中英

從 json 數組中檢索值,其中屬性等於變量 Ansible

[英]Retrieving value from json array where attribute equals variable with Ansible

我正在嘗試使用 Ansible 獲取 json 數組中的屬性值。 示例數據:

"domains.json.data": [
        {
            "axfr_ips": [],
            "description": "",
            "domain": "mydomain.net",
            "expire_sec": 0,
            "group": "",
            "id": 687088,
        },
        {
            "axfr_ips": [],
            "description": "",
            "domain": "myotherdomain.net",
            "expire_sec": 0,
            "group": "",
            "id": 687089,
        }
    ]
}

所以我嘗試了 json 查詢:

"{{ domains.json.data | json_query(\"data[?domain=='{{ server_domain }}'].id\") }}"

或與:

- set_fact:
    domain_id: "{{ domains | json_query(query) | first }}"
  vars:
    query: "domains.json[?name=='{{ server_domain }}'].id"

還嘗試使用 selectattrib:

"{{ linode_domains.json.data | selectattr(\"domain\", \"{{ server_domain }}\") | list }}"

所以我需要的是獲取我在 {{ server_domain }} 中獲得的域的 id。

查詢無法工作,因為字典中沒有屬性name

        query: "domains.json[?name=='{{ server_domain }}'].id"

使用屬性domain 例如下面的任務

    - debug:
        msg: "{{ domains.json.data|json_query(query) }}"
      vars:
        server_domain: 'mydomain.net'
        query: "[?domain=='{{ server_domain }}'].id"

    "msg": [
        687088
    ]

筆記

  • json_query返回一個列表。
  • 首先使用過濾器獲取列表的第一個元素
        msg: "{{ domains.json.data|json_query(query)|first }}"

您可以使用selectattr進行過濾,並使用map來獲取 id 值。 以下是您可以嘗試的示例。

- name: Retrieve value from JSON array
  debug:
    msg: "{{ test.domains | selectattr('domain', 'equalto', server_domain) | map(attribute='id') | join(',') }}"

由於 map 返回列表,我已使用join轉換為字符串。

我已將server_domain 值設置為 myotherdomain.net以進行測試。

下面是命令的output

TASK [Retrieve value from JSON array] **************************
ok: [localhost] => {
    "msg": "687089"
}

編輯:equalto 是在 jinja2 的 v2.8 中引入的。 如果您收到 TemplateRuntimeError: no test named 'equalto',請更新 jinja2。

檢查版本使用pip list | grep Jinja2 pip list | grep Jinja2 要更新使用以下命令pip install --upgrade Jinja2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM