как установить ответный факт из массива с пробелами - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь установить факты из массива json, так как ключ содержит пространство, которое я не могу разобрать, может кто-нибудь помочь мне здесь, я хочу установить факт как "имя": "IN-FG-04", когда "vdom": "vdom-shop"

Пожалуйста, смотрите мой образец записи Playbook

  - name: Iterate JSON
    set_fact:
      app_item: "{{ item['scope member'] }}"
    with_items: "{{ result.results }}"
    register: app_result

см. Вход json, и это вывод моей предыдущей задачи

{
    "msg": {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        },
        "changed": false,
        "failed": false,
        "msg": "Custom Query Success",
        "results": [
            {
                "name": "FG-04-Policy",
                "obj ver": 3,
                "oid": 1196,
                "package settings": {
                    "central-nat": "disable",
                    "fwpolicy-implicit-log": "disable",
                    "fwpolicy6-implicit-log": "disable",
                    "inspection-mode": "proxy"
                },
                "scope member": [
                    {
                        "name": "IN-FG-04",
                        "vdom": "vdom-shop"
                    }
                ],
                "type": "pkg"
            },
            {
                "name": "FG-04-DC",
                "obj ver": 23,
                "oid": 1216,
                "package settings": {
                    "central-nat": "disable",
                    "fwpolicy-implicit-log": "disable",
                    "fwpolicy6-implicit-log": "disable",
                    "inspection-mode": "proxy"
                },
                "scope member": [
                    {
                        "name": "IN-FG-04",
                        "vdom": "vdom1-dc"
                    }
                ],
                "type": "pkg"
            }
        ]
    }
}

Ответы [ 2 ]

0 голосов
/ 19 мая 2019

Фрагмент ниже

установить факт как "имя": "IN-FG-04", когда "vdom": "vdom-shop"

- name: "set fact as name: IN-FG-04 when vdom: vdom-shop"
  set_fact:
    name: "{{ result.results|json_query('[].\"scope member\"[?\"vdom\"==`\"vdom-shop\"`].name')|flatten|first }}"
- debug:
    var: name

дает:

"name": "IN-FG-04"
0 голосов
/ 19 мая 2019

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

Прежде всего вы* set_fact используется для задачи *1006*.Это не ошибка сама по себе, но представляет очень ограниченный интерес.Это будет регистрироваться, если вы правильно присвоили значение переменной, а не сами значения.Таким образом, вы никогда не получите ожидаемый результат с этим.

Что вы хотите сделать, это добавить элементы в список, пока вы зацикливаете свой json в задаче set_fact.Это делается путем инициализации вашей переменной set_fact в пустой список с фильтром default в первом цикле и добавления нового списка с вашими элементами.

Более того, так как вам нужночтобы одновременно принимать решения на нескольких уровнях вашего объекта, вам необходимо использовать цикл subelements: уровень цикла 0 для каждого результата и уровень 1 для каждого элемента списка scope member.На каждой итерации вы будете добавлять объект в список.В приведенном ниже примере я использовал фильтр ternary, чтобы решить, какое имя включить.

---
- name: SO Test
  hosts: localhost

  vars:
    result: {
      "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
      },
      "changed": false,
      "failed": false,
      "msg": "Custom Query Success",
      "results": [
        {
          "name": "FG-04-Policy",
          "obj ver": 3,
          "oid": 1196,
          "package settings": {
            "central-nat": "disable",
            "fwpolicy-implicit-log": "disable",
            "fwpolicy6-implicit-log": "disable",
            "inspection-mode": "proxy"
          },
          "scope member": [
            {
              "name": "IN-FG-04",
              "vdom": "vdom-shop"
            }
          ],
          "type": "pkg"
        },
        {
          "name": "FG-04-DC",
          "obj ver": 23,
          "oid": 1216,
          "package settings": {
            "central-nat": "disable",
            "fwpolicy-implicit-log": "disable",
            "fwpolicy6-implicit-log": "disable",
            "inspection-mode": "proxy"
          },
          "scope member": [
            {
              "name": "IN-FG-04",
              "vdom": "vdom1-dc"
            }
          ],
          "type": "pkg"
        }
      ]
    }

  tasks:
    - name: Get all names + vdom as requested in a list
      set_fact:
        app_result: >-
          {{
            app_result
            | default([])
            +
            [{
              'name': (item.1.vdom == 'vdom-shop') | ternary(item.0.name, item.1.name),
              'vdom': item.1.vdom
            }]
          }}
      loop: "{{ lookup('subelements', result.results, 'scope member') }}"

    - name: show result
      debug:
        var: app_result

Что приводит к

PLAY [SO Test] *****************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Get all names + vdom as requested in a list] *****************************
ok: [localhost] => (item=[{'name': 'FG-04-Policy', 'obj ver': 3, 'oid': 1196, 'package settings': {'central-nat': 'disable', 'fwpolicy-implicit-log': 'disable', 'fwpolicy6-implicit-log': 'disable', 'inspection-mode': 'proxy'}, 'type': 'pkg'}, {'name': 'IN-FG-04', 'vdom': 'vdom-shop'}])
ok: [localhost] => (item=[{'name': 'FG-04-DC', 'obj ver': 23, 'oid': 1216, 'package settings': {'central-nat': 'disable', 'fwpolicy-implicit-log': 'disable', 'fwpolicy6-implicit-log': 'disable', 'inspection-mode': 'proxy'}, 'type': 'pkg'}, {'name': 'IN-FG-04', 'vdom': 'vdom1-dc'}])

TASK [show result] *************************************************************
ok: [localhost] => {
    "app_result": [
        {
            "name": "FG-04-Policy",
            "vdom": "vdom-shop"
        },
        {
            "name": "IN-FG-04",
            "vdom": "vdom1-dc"
        }
    ]
}

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0
...