首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >条件set_fact只有选择?

条件set_fact只有选择?
EN

Stack Overflow用户
提问于 2020-04-03 21:13:19
回答 2查看 1K关注 0票数 1

我试图使用set_fact,但只在定义了项时才使用。我想不出该怎么做。

剧本:

代码语言:javascript
复制
---
  - 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":“任务包含一个带有未定义变量的选项。错误是:没有第一项,序列为空。

我试过几种不同的条件,但我不太清楚如何构造它。

代码语言:javascript
复制
      when: (apps | selectattr('name', 'match', app_name)) is undefined

此条件总是计算为False - skipping: [localhost] => {"changed": false, "skip_reason": "Conditional result was False"}

EN

回答 2

Stack Overflow用户

发布于 2020-04-03 22:53:19

我试过这个:

代码语言:javascript
复制
when: "{{ apps | selectattr('name', 'match', app_name) | list }}"

如果没有list过滤器,返回生成器对象的selectattr似乎不允许转换为用于测试计算的布尔值。不过,我不能百分之百地肯定这种解释。

请注意,无论是否拥有is defined,都不会改变任何事情,这将是完全等效的。

票数 1
EN

Stack Overflow用户

发布于 2020-04-04 03:10:49

试一试

代码语言:javascript
复制
      - set_fact:
          app: "{{ mylist|first }}"
        vars:
          mylist: "{{ apps|selectattr('name', 'match', app_name)|list }}"
        when: mylist|length > 0

下一个选项是json_query而不是selectattr

代码语言:javascript
复制
      - set_fact:
          app: "{{ mylist|first }}"
        vars:
          query: "[?name=='{{ app_name }}']"
          mylist: "{{ apps|json_query(query) }}"
        when: mylist|length > 0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61020483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档