Получение значения из массива json, где атрибут равен переменной с Ansible - PullRequest
1 голос
/ 02 октября 2019

Я пытаюсь получить значение атрибута в массиве json с помощью Ansible. Пример данных:

"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}}.

Ответы [ 2 ]

1 голос
/ 03 октября 2019

Запрос не может работать, поскольку в словаре нет атрибута 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 возвращает список.
  • используйте фильтр first , чтобы получить первый элемент списка msg: "{{ domains.json.data|json_query(query)|first }}"
1 голос
/ 03 октября 2019

Вы можете использовать selectattr для фильтрации и map для получения значения идентификатора. Ниже приведен пример, который вы можете попробовать.

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

Поскольку карта возвращает список, я использовал join для преобразования в строку.

Я установил значение server_domain для myotherdomain.net для тестирования.

Ниже приведен вывод команды

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

EDIT: равно быловведенный в v2.8 из jinja2. Если вы получите TemplateRuntimeError: нет теста с именем «equalto», обновите jinja2.

Для проверки версии используйте pip list | grep Jinja2. Для обновления используйте следующую команду pip install --upgrade Jinja2.

...