Ansible 仅使用selectattr的条件集\事实?

Ansible 仅使用selectattr的条件集\事实?,ansible,Ansible,我试图使用set_fact,但仅在定义项时使用。我不知道怎么做 剧本: --- - hosts: localhost vars: apps: - name: app1 role: "app1-role" - name: app2 role: "app2-role" - name: app4 role: "app4-role" tasks: - n

我试图使用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\u name=app3
,并显示以下消息:

失败!=>{“msg”:“该任务包含一个带有未定义变量的选项。错误为:没有第一项,序列为空

我尝试了一些不同的条件,但我不太确定如何构造它

      when: (apps | selectattr('name', 'match', app_name)) is undefined
此条件的计算结果始终为False-
跳过:[localhost]=>{“已更改”:False,“跳过原因”:“条件结果为False”}

我尝试了以下操作:

when: "{{ apps | selectattr('name', 'match', app_name) | list }}"
如果没有
列表
过滤器,
selectattr
返回生成器对象,似乎不允许转换为布尔值进行测试评估。不过,我不能100%确定这种解释

请注意,定义了
或不定义
都不会改变任何东西,这是完全等效的。

试试看

      - set_fact:
          app: "{{ mylist|first }}"
        vars:
          mylist: "{{ apps|selectattr('name', 'match', app_name)|list }}"
        when: mylist|length > 0
下一个选项是
json\u查询
,而不是
selectattr


谢谢,我仍然习惯于使用这些过滤器。我对生成器对象也有类似的想法——使用调试输出。因此,通过添加列表过滤器,我们得到了一个内在的布尔值——允许
时计算未定义或已定义的值?我在使用jinja2模板deli运行时收到警告斜接:`[警告]:当语句不应包括jinja2模板分隔符,如{{}或{%%}。找到:{apps | selectattr('name',match',app_name)| list}`。删除引号和大括号似乎是首选语法。感谢您的响应。第一个选项似乎不起作用,存在类似的问题,即从
selectattr
返回的生成器没有长度:
类型为“generator”的对象没有len()
jquery方法也很有效。我想我会使用
列表
过滤器,因为它是一个更简单的选项,但是对于另一种情况,这个jquery可能是一个方便的工具。谢谢!对。json\u查询更健壮。它总是返回一个列表。
      - set_fact:
          app: "{{ mylist|first }}"
        vars:
          query: "[?name=='{{ app_name }}']"
          mylist: "{{ apps|json_query(query) }}"
        when: mylist|length > 0