Ansible 2.4 проверка на совпадение «слово» в вывод - PullRequest
0 голосов
/ 28 января 2019

Я хотел бы использовать 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 голосов
/ 28 января 2019

Я могу выполнять тестирование только частично, так как передо мной нет машины на основе 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 либо вначало строки или предшествует пробел, а затем - пробел или конец строки для точного соответствия.

0 голосов
/ 28 января 2019

Попробуйте изменить свое регулярное выражение, как показано ниже

 when: not (?<![\w\d]){{item.name}}(?![\w\d]) in is_installed.stdout
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...