首页 > 解决方案 > 仅使用 selectattr 的条件 set_fact?

问题描述

我正在尝试使用 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"}

标签: ansible

解决方案


我试过这个:

when: "{{ apps | selectattr('name', 'match', app_name) | list }}"

似乎没有list过滤器,selectattr返回生成器对象似乎不允许转换为布尔值以进行测试评估。不过,我不是 100% 确定这种解释。

请注意,拥有is defined或不拥有不会改变任何东西,这将是完全等价的。


推荐阅读