我正在尝试通过以下任务安装VirtualBox:
- name: Install VirtualBox RPM from "{{ virtualbox_url }}"
dnf:
name: "{{ virtualbox_url }}"
state: present
when: "'VirtualBox-6.0' not in ansible_facts.packages"
tags: vagrant
这有效,但是我想将我的when:子句更改为不使用版本的'VirtualBox'。经过几次测试后,when:子句中的字符串需要完全匹配:
>>> list = ["Foo-6.0"]
>>> if "Foo" in list:
... print("Yay")
...
>>> if "Foo-6.0" in list:
... print("Yay")
...
Yay
Ansible是否可以将列表成员与正则表达式进行匹配?类似于以下内容?
import re
[f for f in ansible_facts.packages if re.search("VirtualBox",f)]
我通读了过滤器和测试文档,但似乎找不到解决方案。这似乎是一个常见问题,因此我必须搜索错误的内容(正在搜索“带有正则表达式的列表中的可匹配字符串”)。如果有人对此有建议或食谱链接,那么如果您能分享的话,我将不胜感激。
答案 0 :(得分:1)
in
运算符可用于列表或字符串
第一种形式:
'string' in ['elem1', 'elem2']
如果列表中的一个元素正好是string
,则将匹配
第二种形式:
'substring' in 'string'
如果substring
包含在string
中,则将匹配
解决您的软件包列表问题的一种简单方法是在整个串联列表中搜索子字符串:
when: "'VirtualBox' not in ansible_facts.packages | join"
如果需要,此技术也可以与正则表达式配合使用...
when: ansible_facts.packages | join is match('.*VirtualBox.*')
...或通过search
测试
when: ansible_facts.packages | join is search('VirtualBox')