Поиск значения в списке dict в Ansible - PullRequest
0 голосов
/ 24 января 2019

Прежде всего, я знаю, что это своего рода дублирующий вопрос: я нашел похожие темы здесь: Поиск ключа в списке диктов в Ansible , Поиск значений Ansible из сложной структуры?

Я не знаю, должен ли я задавать свой вопрос непосредственно в этих темах или нет, если да, я искренне извиняюсь.

В любом случае, в Ansible мне нужно извлечьконкретный идентификатор в запросе API из веб-приложения.У меня есть этот код:

- name: API query
  uri:
    method: GET
    url: "{{ apiquery }}"
    headers:
      Content-Type: application/json
      App-Token: "{{ appToken }}"
      Session-Token: "{{ currentSessionToken.json.session_token }}"
  register: wantedState

- name: DEBUG | wantedState output
  debug:
    msg: "{{ wantedState }}"

Сообщение следующее:

ok: [localhost] => {
    "msg": {
        "accept_range": "State 1000",
        "access_control_expose_headers": "content-type, content-range, accept-range",
        "cache_control": "no-store, no-cache, must-revalidate",
        "changed": false,
        "connection": "close",
        "content_length": "138",
        "content_range": "0-1/2",
        "content_type": "application/json; charset=UTF-8",
        "cookies": {},
        "cookies_string": "",
        "date": "Thu, 24 Jan 2019 11:51:42 GMT",
        "expires": "Mon, 26 Jul 1997 05:00:00 GMT",
        "failed": false,
        "json": {
            "content-range": "0-1/2",
            "count": 2,
            "data": [
                {
                    "1": "state1",
                    "2": 12
                },
                {
                    "1": "state11",
                    "2": 10
                }
            ],
            "order": "ASC",
            "sort": 1,
            "totalcount": 2
        },
        "msg": "OK (138 bytes)",
        "pragma": "no-cache",
        "redirected": false,
        "server": "Apache/2.4.18 (Ubuntu)",
        "status": 200,
        "url": "..."
    }
}

Мне нужно получить правильный идентификатор, связанный с переменной stateName.

Iследовал советам, данным в двух других темах, и мой синтаксис такой:

- name: DEBUG | Displaying ID
  debug:
    msg: "{{ (wantedState.json.data | selectattr('1', 'equalto', stateName) | list | first).2 }}"

Я получил следующее сообщение об ошибке:

"msg": "The task includes an option with an undefined variable. The error was: dict object has no element 1"

Я не знаю, почему мой запросне работает должным образом, чтобы быть честным ...

Заранее спасибо,

Симон

1 Ответ

0 голосов
/ 24 января 2019

Jinja2 преобразует целочисленные строки в числа под капотом.
Так что '1' и '2' используются для ссылки на первый и второй элементы списка.
Я не знаю, какчтобы отключить это поведение в Jinja2.

У вас правильный синтаксис в целом.Если ваши элементы данных имеют ключи a и b, а не 1 и 2, все будет в порядке.

В вашем случае вы можете использовать JMESPath для фильтрации элементов:

- name: DEBUG | Displaying ID
  debug:
    msg: "{{ (wantedState.json.data | json_query('[?\"1\"==`'+stateName+'`]') | first)['2'] }}"

Обратите внимание, что:

  • двойные кавычки вокруг 1 экранированы, потому что мы находимся внутри строки в кавычках YAML msg: "..."
  • , есть буквальные кавычки JMESPath (обратная кавычка)) вокруг значения stateName
  • результирующее значение доступно через ['2'] (строка), а не .2 (int)
...