Подтвердить что ты не робот

Модуль Ansible Command говорит, что '|' является незаконным персонажем

Я использую Ansible для развертывания моего проекта, и я пытаюсь проверить, установлен ли указанный пакет, но у меня проблема с ним, вот задача:

- name: Check if python-apt is installed
  command: dpkg -l | grep python-apt
  register: python_apt_installed
  ignore_errors: True

И вот проблема:

$ ansible-playbook -i hosts idempotent.yml

PLAY [lxc-host] *************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [10.0.3.240]

TASK: [idempotent | Check if python-apt is installed] ************************* 
failed: [10.0.3.240] => {"changed": true, "cmd": ["dpkg", "-l", "|", "grep", "python-apt"], "delta": "0:00:00.015524", "end": "2014-07-10 14:41:35.207971", "rc": 2, "start": "2014-07-10 14:41:35.192447"}
stderr: dpkg-query: error: package name in specifier '|' is illegal: must start with an alphanumeric character
...ignoring

PLAY RECAP ******************************************************************** 
10.0.3.240                 : ok=2    changed=1    unreachable=0    failed=0 

Почему этот символ не соответствует этому символу '|'.

4b9b3361

Ответ 1

Я не знаком с Ansible, но из сообщения об ошибке | фактически передается как аргумент dpkg и не интерпретируется как канал между процессами. Вероятно, Ansible не выполняет команду через оболочку. Поэтому вы должны явно запросить его.

Я точно не знаю, как это сделать, попробуйте один из них:

command: bash -c "dpkg -l | grep python-apt"

или

command: bash -c 'dpkg -l | grep python-apt'

Если оба отказали, у вас все еще есть возможность поместить команды в оболочку script и использовать эту script в вашей команде...


EDIT: Из документа:

команда - выполняет команду на удаленном node

Модуль команды принимает имя команды, за которым следует список аргументы с пространственным разделением. Данная команда будет выполнена на всех выбранных узлов. Он не будет обрабатываться через оболочку, поэтому переменные типа $HOME и операции типа "<", " > ", "|" и "&". будем не работает (используйте модули оболочки, если вам нужны эти функции).

shell - выполняет команды в узлах

Модуль оболочки принимает имя команды, за которым следует список аргументов, разделенных пробелами. Это почти так же, как командный модуль, но выполняет команду через оболочку (/bin/sh) на пульте дистанционного управления node.

Вам, вероятно, придется использовать shell: dpkg -l | grep python-apt

Все еще задаюсь вопросом, сработало бы мое первоначальное предположение (bash -c "...")...

Ответ 2

читайте о командном модуле в документации Ansible:

Он не будет обрабатываться через оболочку, поэтому... операции типа "<", " > ", "|" и "&" не будет работать

Как он рекомендует, используйте оболочный модуль:

- name: Check if python-apt is installed
  shell: dpkg -l | grep python-apt
  register: python_apt_installed
  ignore_errors: True

Для чего вы можете проверить/подтвердить установку в среде debian с помощью команды apt:

- name: ensure python-apt is installed
  apt: name=python-apt state=present