我想使用ansible
检查命令输出中是否存在程序包名称。如果不存在,那就做点什么。
例如: 我正在寻找“ zip”包,但问题是它返回“ gzip”,“ zip”,“ unzip”,并且我只想找到“ zip”,如何在时间条件下完成
如何使用正则表达式完全匹配{{ item.name }}
而不是包含{{ item.name }}
一部分的单词
- name: Check if Package is installed
shell: dpkg-query -f '${binary:Package}\n' -W
register: is_installed
- name: Install apt dependencies
apt:
name: "{{item.name}}{{item.version}}"
state: present
allow_unauthenticated: yes
force: yes
with_items:
- { name: 'python2.7', version: '' }
- { name: 'ruby', version: '' }
- { name: 'postgresql-9.5', version: '' }
- { name: 'postgresql-contrib-9.5', version: '' }
- { name: 'libpq-dev', version: '' }
- { name: 'nodejs', version: '=9.*' }
- { name: 'python-setuptools', version: '' }
- { name: 'python-pip', version: '' }
- { name: 'python-pkg-resources', version: '' }
- { name: 'sshpass', version: '' }
- { name: 'zip', version: '' }
- { name: 'mongodb-org', version: '=4.0.0' }
- { name: 'libfontconfig', version: '' }
- { name: 'ntp', version: '' }
- { name: 'fio', version: '' }
when: not "{{item.name}}" in is_installed.stdout
答案 0 :(得分:0)
尝试如下所示修改您的正则表达式
when: not (?<![\w\d]){{item.name}}(?![\w\d]) in is_installed.stdout
答案 1 :(得分:0)
由于我前面没有基于Debian的机器,所以我只能部分进行测试。
您没有更新Q来显示输出的确切格式,所以我不确定命令是在一行上输出所有软件包,还是每行输出一个软件包。
如果每行一个,请尝试以下操作:
- name: Install apt dependencies
apt:
name: "{{item.name}}{{item.version}}"
state: present
allow_unauthenticated: yes
force: yes
with_items:
- { name: 'python2.7', version: '' }
- { name: 'ruby', version: '' }
when: not (is_installed.stdout_lines| map('regex_search', '^' + item.name + '$') | select('string') | list | length)
如果多行,则is_installed.stdout_lines
将是一个列表,每个项目一个包。因此,我们在列表中搜索完全匹配,然后输出匹配总数。 > 0 = true
。
如果全部在同一行,请尝试以下操作:
- name: Install apt dependencies
apt:
name: "{{item.name}}{{item.version}}"
state: present
allow_unauthenticated: yes
force: yes
with_items:
- { name: 'python2.7', version: '' }
- { name: 'ruby', version: '' }
when: not (is_installed.stdout | search('(^| )' + item.name + '( |$)')
在这种情况下,我们需要在行的开头或空格前搜索name
,然后再在空格或行末搜索精确匹配。 / p>