Как динамически выбрать объект JSON для использования в задаче Ansible? - PullRequest
1 голос
/ 08 октября 2019

Можно ли выбрать, какой объект json использовать, основываясь на некоторых динамических критериях?

У меня есть файл yml:

- name: Get data
  uri:
    url: "foo/get_data/{{item.name}}"
    return_content: yes
  with_items: "{{stuff_names}}"
  register: app_out

- name: Use data
  uri:
    url: "foo/use_data/item.json[0].id"
    method: POST
  with_items: "{{ app_out.results }}"

Где вызов foo/get_data/<name> возвращает jsonмассив из 1 или 2 элементов:

Пример из foo/get_data/bar1:

[{"id": 1, "type": "x"}, {"id":2, "type": "y"}]

Пример foo/get_data/bar2:

[{"id": 1, "type": "x"}]

В задаче «Использовать данные» есть способ указать, какой объект json в массиве использовать, основываясь на том, существует ли объект в item или размер item и т. Д. ? Прямо сейчас он жестко запрограммирован на первый объект item.json[0].

Например, если item содержит объект типа "y", используйте этот объект, в противном случае используйте item типа "x".

или, если размер item> 1, используйте item типа "x".

EDIT:

Или, возможно, даже отдельное задание для удалениязарегистрированный app_out?

1 Ответ

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

Q: "если элемент содержит объект типа" y ", используйте этот объект, в противном случае используйте элемент типа" x "

A:игра ниже реализует эту логику, я думаю.

- hosts: localhost
  vars:
    results:
      - {"id": 1, "type": "x"}
      - {"id": 2, "type": "y"}
      - {"id": 3, "type": "z"}
  tasks:
    - set_fact:
        my_list: "{{ results|
                     selectattr('type', 'defined')|
                     selectattr('type', 'equalto','y')|list }}"
    - set_fact:
        my_list: "{{ results|
                     selectattr('type', 'defined')|
                     selectattr('type', 'equalto','x')|list }}"
      when: my_list|length == 0
    - name: Use type y, otherwise use type x
      debug:
        var: my_list

дает

"my_list": [
    {
        "id": 2, 
        "type": "y"
    }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...