Ansible 2.4检查输出中是否匹配“单词”

时间:2019-01-28 09:59:42

标签: regex ansible

我想使用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

2 个答案:

答案 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>