Мое требование - использовать опцию grep -E в Ansible.

Я хочу сначала использовать /usr/xpg4/bin/grep, если он присутствует на сервере, иначе переключитесь на /bin/grep

Я ищу решения POSIX, которые работают с различными оболочками и операционными системами.

Команда ниже отлично работает в командной строке:

$ ls /usr/xpg4/bin/grep 2> >(grep -v 'No such file or directory' >&2) || ls /bin/grep 2> >(grep -v 'No
> such file or directory' >&2)

Выход:

/usr/xpg4/bin/grep

Я попытался использовать указанное выше решение в Ansible, как показано ниже:

 - name: "Detect the grep on the system"
   ignore_errors: yes
   command:  "ls /usr/xpg4/bin/grep 2> >(grep -v 'No such file or directory' >&2) || ls /bin/grep 2> >(grep -v 'No     such file or directory' >&2 | head -1"
   register: grepfound

В выводе он находит и grep, и вместо получения одного предпочтительного /usr/xpg4/bin/grep {{ grepfound.stdout }} печатает оба grep, которых я никогда не хотел.

Выход:

fatal: [localhost]: FAILED! => {"changed": true, "cmd": ["ls", "/usr/xpg4/bin/grep", "2>", ">(grep", "-v", "No such file or directory", ">&2)", "||", "ls", "/bin/grep", "2>", ">(grep", "-v", "No such file or directory", ">&2"], "delta": "0:00:00.013219", "end": "2021-06-14 05:25:52.178385", "msg": "non-zero return code", "rc": 2, "start": "2021-06-14 05:25:52.165166", "stderr": "2>: No such file or directory\n>(grep: No such file or directory\n-v: No such file or directory\nNo such file or directory: No such file or directory\n>&2): No such file or directory\n||: No such file or directory\nls: No such file or directory\n2>: No such file or directory\n>(grep: No such file or directory\n-v: No such file or directory\nNo such file or directory: No such file or directory\n>&2: No such file or directory", "stderr_lines": ["2>: No such file or directory", ">(grep: No such file or directory", "-v: No such file or directory", "No such file or directory: No such file or directory", ">&2): No such file or directory", "||: No such file or directory", "ls: No such file or directory", "2>: No such file or directory", ">(grep: No such file or directory", "-v: No such file or directory", "No such file or directory: No such file or directory", ">&2: No such file or directory"], **"stdout": "/bin/grep\n/usr/xpg4/bin/grep"**, "stdout_lines": ["/bin/grep", "/usr/xpg4/bin/grep"]}
...ignoring

Я попытался использовать {{ grepfound.stdout_lines[0] }} как обходной путь, но, как вы видите, он печатает /bin/grep вместо /usr/xpg4/bin/grep. И если я использую {{ grepfound.stdout_lines[1] }}, он будет работать здесь, но потерпит неудачу, если будет найден только один grep.

0
Ashar 14 Июн 2021 в 13:47

2 ответа

Лучший ответ

Мне все еще хотелось бы, чтобы ваша помощь использовала stdout_lines вместо stdout, чтобы процессы отображались лучше отформатированными, изолированными ... каждый процесс в новой строке

Вот где в игру вступает | select - он предназначен для фильтрации элементов списка, в которых тест jinja2 оценивается как истинный

- set_fact:
   example_data:
     stdout_lines:
     - 1111 nothing here
     - 2222 this one is httpd
     - 3333 this one is tomcat
     - 4444 again nothing
- debug:
    msg: |
      the things as a list are:
      {{ example_data.stdout_lines | select('search', '(tomcat|weblogic|httpd)') | list }}

      but you can also fold them back into one str:
      {{ example_data.stdout_lines | select('search', '(tomcat|weblogic|httpd)') | join(nl) }}
  vars:
    # this silliness is to work around a quirk of jinja2 where
    # | join("\n") literally uses `"\n"` to join items :-(
    nl: "\n"

Производит

  msg: |-
    the things as a list are:
    ['2222 this one is httpd', '3333 this one is tomcat']

    but you can also fold them back into one str:
    2222 this one is httpd
    3333 this one is tomcat
1
mdaniel 16 Июн 2021 в 15:47

Разве вы не можете просто положиться на PATH?

- name: stuff
  environment:
    PATH: /usr/xpg4/bin:/usr/bin:/bin
  shell: cat something | grep stuff

Если ваш двоичный файл не существует на первом пути, он проверит следующий.

1
SYN 16 Июн 2021 в 21:16