【问题标题】:Check if a list contains an item in Ansible检查列表是否包含 Ansible 中的项目
【发布时间】:2023-03-26 19:55:02
【问题描述】:

我正在尝试检查提供的版本是否是受支持的有效版本。我已经在一个变量中设置了可接受版本的列表,如果提供的版本不在列表中,我想退出任务。但是,我不确定该怎么做。

#/role/vars/main.yml
---
  acceptable_versions: [2, 3, 4]

#/role/tasks/main.yml
---
  - fail: 
      msg: "unsupported version"
      with_items: "{{acceptable_versions}}"
      when: "{{item}} != {{version}}"

  - name: continue with rest of tasks...

以上是我想要做的,但我无法弄清楚是否有一种方法可以为失败模块构造一个“列表包含”调用。

【问题讨论】:

    标签: yaml ansible


    【解决方案1】:

    在 when 条件下不需要{{}}。您要搜索的是:

    - fail: msg="unsupported version"
      when: version not in acceptable_versions
    

    【讨论】:

    • 这是在哪里记录的?
    • 这似乎只适用于完全匹配的字符串:(
    • 实际上这是 jinja2 的一个特性,因此在他们的文档中。见jinja.pocoo.org/docs/2.9/templates/#other-operators
    • docs.ansible.com/ansible/latest/… "[...]when 子句,其中包含一个不带双花括号[..] 的原始 Jinja2 表达式[..]"
    • 回复:这似乎只适用于精确的字符串匹配,请尝试以下情况:版本不在可接受的版本中|to_json 适用于我的子字符串匹配。
    【解决方案2】:

    Ansible 从 1.6 开始就有 version_compare 过滤器。 您可以在when 条件下执行以下操作:

    when: ansible_distribution_version | version_compare('12.04', '>=')

    这将为您提供主要和次要版本比较的支持,您可以使用以下运算符比较版本:

    <, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne

    您可以在此处找到更多信息:Ansible - Version comparison filters

    否则,如果您有非常简单的案例,您可以使用@ProfHase85 建议的内容

    【讨论】:

    • 我在研究过程中注意到了这一点,但我没有选择这个的原因是因为我希望能够支持 # 的随机列表,这可能是不连续的,即2、7、10、11,我不想构造一些疯狂的运算符组合
    猜你喜欢
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 2014-03-02
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多