在 ansible 搜索测试中,有没有一种方法可以使用布尔 OR 运算符测试多个值?

In ansible search test is there a way to test more than one value using a boolean OR operator?

我正在 ansible 版本 2.9 中处理一个 ansible playbook 任务,我有一个与 when 条件配对的循环,我想对两个值而不是一个值进行条件测试(这对我有用) .有没有办法在 when 语句中使用 search() 测试执行布尔 OR?

这是我用过的有效方法(仅测试一个值):

- name: Test Interface Looping
  hosts: test
  vars:
    desc_search: "test"
    desc_search_c: "TEST"
  tasks:
    - name: IOS Facts
      ios_facts:
        gather_subset:
          - '!all'
          - '!min'
        gather_network_resources:
          - 'interfaces'
      register: result
    - debug: var=result
    - name: Update all descriptions
      ios_interfaces:
        config:
          - name: "{{ item.key }}"
            description: "Test Done"
        state: replaced
      loop: "{{ ansible_net_interfaces|dict2items }}"
      when: item.value.description is search(desc_search)

如果可能的话,这是我想做的(到目前为止还没有工作):

- name: Test Interface Looping
  hosts: test
  vars:
    desc_search: "test"
    desc_search_c: "TEST"
  tasks:
    - name: IOS Facts
      ios_facts:
        gather_subset:
          - '!all'
          - '!min'
        gather_network_resources:
          - 'interfaces'
      register: result
    - debug: var=result
    - name: Update all descriptions
      ios_interfaces:
        config:
          - name: "{{ item.key }}"
            description: "Test Done"
        state: replaced
      loop: "{{ ansible_net_interfaces|dict2items }}"
      when: item.value.description is search(desc_search) or search(desc_search_c)

我也尝试在 when 语句的末尾添加 | bool 但在这两种情况下我都收到错误:The conditional check 'item.value.description is search(desc_search) or search(desc_search_c)' failed. The error was: error while evaluating conditional (item.value.description is search(desc_search) or search(desc_search_c)): 'search' is undefined...

是否可以做我在这里想做的事情?对我可能使用的任何不正确的术语表示歉意。我是一名网络工程师,所以没有接受过 ansible 或 programming/scripting.

方面的正规教育

您的问题有 3 个答案,从您收到的错误开始:search 不是 jinja2“过滤器”,它是一个“测试”,这意味着它必须与 isis not 关键字(正如您在 when 的前半部分所做的那样):

      when: item.value.description is search(desc_search) or item.value.description is search(desc_search_c)

第二个答案是,由于您关心的似乎是不区分大小写的搜索,您可以通过 (?i) regex modifier, or the ignorecase=True kwarg

指定
      when: item.value.description is search(desc_search, ignorecase=True)

作为替代方案,如果您真的只想要 testTEST(这意味着我对 ignorecase 的假设是错误的),并且您确实关心这个案例,但只需要这两个字符串,您可以使用 | 正则表达式替换字符:

      when: item.value.description is search(desc_search+"|"+desc_search_c)

就像编程中的许多事情一样,有很多方法可以实现该目标,您应该选择最容易让您和您的团队在下个月查看此代码时推理的方法:-)