我试图使用set_fact,但只在定义了项时才使用。我想不出该怎么做。
剧本:
---
- hosts: localhost
vars:
apps:
- name: app1
role: "app1-role"
- name: app2
role: "app2-role"
- name: app4
role: "app4-role"
tasks:
- name: "Find a matching app, and print the values"
set_fact:
app: "{{ apps | selectattr('name', 'match', app_name) | first }}"当没有匹配时(例如:app_name=app3 ),该任务将失败,该消息如下:
失败!=> {"msg":“任务包含一个带有未定义变量的选项。错误是:没有第一项,序列为空。
我试过几种不同的条件,但我不太清楚如何构造它。
when: (apps | selectattr('name', 'match', app_name)) is undefined此条件总是计算为False - skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False"}。
发布于 2020-04-03 22:53:19
我试过这个:
when: "{{ apps | selectattr('name', 'match', app_name) | list }}"如果没有list过滤器,返回生成器对象的selectattr似乎不允许转换为用于测试计算的布尔值。不过,我不能百分之百地肯定这种解释。
请注意,无论是否拥有is defined,都不会改变任何事情,这将是完全等效的。
发布于 2020-04-04 03:10:49
试一试
- set_fact:
app: "{{ mylist|first }}"
vars:
mylist: "{{ apps|selectattr('name', 'match', app_name)|list }}"
when: mylist|length > 0下一个选项是json_query而不是selectattr
- set_fact:
app: "{{ mylist|first }}"
vars:
query: "[?name=='{{ app_name }}']"
mylist: "{{ apps|json_query(query) }}"
when: mylist|length > 0https://stackoverflow.com/questions/61020483
复制相似问题