ansible - 如何动态选择要在 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?
解决方案
问:“如果项目包含“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"
}
]
推荐阅读
- java - “camel-activemq”与“activemq-camel”之间的区别
- python-3.x - IndexError: index 1 is out of bounds for axis 0 with size 1 //Python (jupyter notebook)
- java - Java 程序结构
- python - 如何为我的代码的每一行添加一个新数字到我的列表中?
- web-component - 点亮模板中的 vaadin-item @click 事件
- perl - Strawberry Perl 模块安装问题
- javascript - TypeError:无法读取 null 的属性(读取“addEventListener”)
- java - JNI 原生类方法获取错误的参数值
- python-3.x - 在大型嵌套字典中查找特定键
- laravel - [Route: storage_file][URL: files/{filename}] 缺少必需参数 [缺少参数:filename]