it-swarm.com.ru

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

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

50
Robert

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

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

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

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

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

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

95
Sylvain Leroux

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

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

В соответствии с рекомендациями используйте модуль Shell :

- 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
35
tedder42