Модуль 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 

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


person Robert    schedule 10.07.2014    source источник
comment
Кстати, согласно github.com/ansible/ansible/pull/4617 python-apt должно быть автоматически устанавливается при использовании модуля apt, поэтому вам не нужно загружать его вручную.   -  person Mxx    schedule 11.07.2014
comment
используйте модуль shell, если хотите использовать pipe   -  person deepdive    schedule 23.02.2018


Ответы (2)


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

команда — выполняет команду на удаленном узел

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

shell — выполняет команды в узлах< /а>

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

Поэтому вы должны использовать shell: dpkg -l | grep python-apt.

person Sylvain Leroux    schedule 10.07.2014
comment
Моя ошибка заключалась в том, что я использовал команду, а не оболочку. Я также должен игнорировать ошибку в первый раз, а затем, когда пакет python-apt установлен, задача проверки не завершается ошибкой. Спасибо. - person Robert; 11.07.2014

прочитайте о командном модуле в документации 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
person tedder42    schedule 10.07.2014
comment
Если я хочу использовать модуль apt, его необходимо сначала установить. Я делаю подтверждение только в первый раз, а позже использую модуль apt для установки пакетов. Спасибо за ваш ответ. - person Robert; 11.07.2014
comment
Я думаю, что это лучший подход, использующий модули, которые напрямую взаимодействуют с пакетами. - person diablinux; 11.07.2014
comment
@ rob3 подождите, какое подтверждение? вы, безусловно, можете использовать apt для установки модулей и проверки их установки. И в debian, и в ubuntu уже есть apt, а python-apt не требует ручной установки. - person tedder42; 11.07.2014
comment
да, но в документации первое примечание гласит: Требуется python-apt. Затем первая задача — установить python-apt, а затем я могу использовать его для установки других пакетов. - person Robert; 11.07.2014
comment
@Rob3, кажется странным, но вы можете использовать apt для установки python-apt. - person tedder42; 11.07.2014
comment
Должен быть принятый ответ. Более прямолинейно, чем у @Sylvain. - person Charlie Dalsass; 11.04.2018