Почему Ansible не может прочитать строку Unicode как JSON? - PullRequest
1 голос
/ 18 апреля 2019

Сводка

При извлечении данных с помощью модуля uri в Ansible я не могу проанализировать его часть как JSON для получения вложенного значения.

Желаемым значением является поле ci внутри поля content.data или json.data (см. output ниже).

Шаги для воспроизведения

site.yml

--- 
- hosts: localhost 
  gather_facts: false 
  tasks: 
    - name: Get String 
      uri: 
        url: "http://localhost/get-data" 
        method: POST 
        body_format: json 
        body: "{ \"kong-jid\": \"run-sn-discovery\" }"
        return_content: yes 
      register: output 

    - set_fact:
        ci: "{{ output.json.data.ci }}"

    - debug:
        msg: "{{ ci }}"

Переменная {{output}}

{
  u'status': 200, 
  u'cookies': {}, 
  u'url': u'http://kong-demo:8000/get-data', 
  u'transfer_encoding': u'chunked', 
  u'changed': False, 
  u'connection': u'close', 
  u'server': u'kong/0.34-1-enterprise-edition', 
  u'content': 
  u'{"data":"\\"{u\'ci\': u\'3bb8d625dbac3700e4f07b6e0f96195b\'}\\""}', 
  'failed': False, 
  u'json': {u'data': u'"{u\'ci\': u\'3bb8d625dbac3700e4f07b6e0f96195b\'}"'}, 
  u'content_type': u'application/json', 
  u'date': u'Thu, 18 Apr 2019 15:50:25 GMT', 
  u'redirected': False, 
  u'msg': u'OK (unknown bytes)'
}

Результат

[user@localhost]$ ansible-playbook site.yml
 [WARNING]: Could not match supplied host pattern, ignoring: all

 [WARNING]: provided hosts list is empty, only localhost is available


PLAY [localhost] ***************************************************************************************************************

TASK [Pass Redis data to next task as output] **********************************************************************************
ok: [localhost]

TASK [set_fact] ****************************************************************************************************************
fatal: [localhost]: FAILED! => {}

MSG:

The task includes an option with an undefined variable. The error was: 'ansible.utils.unsafe_proxy.AnsibleUnsafeText object' has no attribute 'ci'

The error appears to have been in 'site.yml': line 19, column 7, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:


    - set_fact:
      ^ here

exception type: <class 'ansible.errors.AnsibleUndefinedVariable'>
exception: 'ansible.utils.unsafe_proxy.AnsibleUnsafeText object' has no attribute 'ci'

Важная информация по устранению неполадок

Похоже, основная проблема связана с интерпретируемым типом Ansible.Я хочу разобрать ci с вывода в одной задаче.

Решение двух задач, показанное ниже, работает, но это заставляет меня поверить, что это возможно в одной строке ...

Решение для двух задач

- set_fact:
    ci: "{{ output.json.data | from_json }}"

- debug:
    msg: "{{ ci['ci'] }}"

Но факт ci, установленный из {{ output.json.data | from_json }}, сообщает о другом типе, чем встроенный тип ...

Unicodeили Dict?

- debug:
    msg: "{{ output.json.data | from_json | type_debug }}" # returns unicode

- set_fact:
    ci: "{{ output.json.data | from_json }}"

- debug:
    msg: "{{ ci | type_debug }}" # returns dict

Почему {{ output.json.data | from_json | type_debug }}
не совпадает с {{ ci | type_debug }}?

1 Ответ

0 голосов
/ 18 апреля 2019

Хотя json и data являются ключами в своих соответствующих объектах, ci является просто частью более крупной строки (которая выглядит как объект JSON

Если соответствующая строка в вашей структуре данныхбыло бы:

u'json': {u'data': {'ci': u'3bb8d625dbac3700e4f07b6e0f96195b'}}, 

тогда можно было бы ожидать использовать "{{ output.json.data.ci }}", но не тогда, когда часть .ci является просто нормальной частью строки.

...