Ansible Command module says that '|' is illegal character

ShellAnsibleDpkgAnsible Playbook

Shell Problem Overview


I am using Ansible to deploy my project and I trying to check if an specified package is installed, but I have a problem with it task, here is the task:

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

And here is the problem:

$ 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 

Why is illegal this character '|' .

Shell Solutions


Solution 1 - Shell

From the doc:

> > command - Executes a command on a remote node > > The command module takes the command name followed by a list of > space-delimited arguments. The given command will be executed on all > selected nodes. It will not be processed through the shell, so > variables like $HOME and operations like "<", ">", "|", and "&" will > not work (use the shell module if you need these features). > > shell - Executes a commands in nodes > > The shell module takes the command name followed by a list of space-delimited arguments. > It is almost exactly like the command module but runs the command > through a shell (/bin/sh) on the remote node.

Therefore you have to use shell: dpkg -l | grep python-apt.

Solution 2 - Shell

read about the command module in the Ansible documentation:

> It will not be processed through the shell, so .. operations like "<", ">", "|", and "&" will not work

As it recommends, use the shell module:

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

For what it's worth, you can check/confirm the installation in a debian environment using the apt command:

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRobertView Question on Stackoverflow
Solution 1 - ShellSylvain LerouxView Answer on Stackoverflow
Solution 2 - Shelltedder42View Answer on Stackoverflow