Ansible Command module says that '|' is illegal character

。_饼干妹妹 提交于 2019-11-26 04:47:56

问题


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 \'|\' .


回答1:


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.




回答2:


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


来源:https://stackoverflow.com/questions/24679591/ansible-command-module-says-that-is-illegal-character

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!