Question:
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:
1 2 3 4 5 |
- 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ 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 ‘|’ .
Answer:
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
.