首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ansible 2.4检查输出中是否有匹配的"word“

Ansible 2.4检查输出中是否有匹配的"word“
EN

Stack Overflow用户
提问于 2019-01-28 17:59:42
回答 2查看 1.1K关注 0票数 0

我想使用ansible来检查命令的输出中是否存在包名。如果不存在,则做些什么。

例如:我正在查找包"zip“,但问题是它返回"gzip”"zip“"unzip”,而我只查找"zip“,如何在when条件下执行此操作

如何使用正则表达式精确匹配{{ item.name }},而不是包含部分{{ item.name }}的单词

代码语言:javascript
复制
 - 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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-28 21:30:32

我只能部分地测试,因为在我面前没有一个基于Debian的机器。

您没有更新Q以显示输出的确切格式,因此我不确定该命令是在一行中输出所有包,还是在每行中输出一个包。

如果每行一个,请尝试如下所示:

代码语言:javascript
复制
- 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

如果所有内容都在同一行上,请尝试执行以下操作:

代码语言:javascript
复制
- 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,以获得精确匹配。

票数 0
EN

Stack Overflow用户

发布于 2019-01-28 19:00:20

尝试如下所示修改您的正则表达式

代码语言:javascript
复制
 when: not (?<![\w\d]){{item.name}}(?![\w\d]) in is_installed.stdout
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54399449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档