首页 > 解决方案 > 如何动态选择要在 Ansible 任务中使用的 json 对象?

问题描述

是否可以根据一些动态标准选择要使用的 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>返回一个包含 1 个或 2 个项目的 json 数组:

样本来自foo/get_data/bar1

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

样本来自foo/get_data/bar2

[{“id”:1,“类型”:“x”}]

在“使用数据”任务中,有没有办法根据对象是否存在item或大小item等来指定要使用数组中的哪个 json 对象?现在它硬编码到第一个对象item.json[0]

例如,如果item包含“y”类型的对象,则使用该对象,否则使用item“x”类型。

或者如果大小item> 1,则使用item类型“x”。

编辑:

或者甚至是一个单独的 ansible 任务来修剪已注册的 app_out?

标签: ansible

解决方案


问:“如果项目包含“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"
    }
]

推荐阅读