Ansible Command模块说'|'是非法的人物

时间:2014-07-10 14:46:02

标签: shell ansible dpkg ansible-playbook

我正在使用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 

为什么非法此字符'|'

2 个答案:

答案 0 :(得分:97)

来自doc:

  

command - Executes a command on a remote node

     

命令模块获取命令名称,后跟列表   以空格分隔的参数。给定的命令将在所有上执行   选定的节点。它不会通过shell处理,所以   变量如$ HOME和“<”,“>”,“|”和“&”等操作将   不工作(如果你需要这些功能,请使用shell模块)。

     

shell - Executes a commands in nodes

     

shell模块获取命令名称,后跟空格分隔的参数列表。   它几乎与命令模块完全相同,但运行命令   通过远程节点上的shell(/ bin / sh)。

因此您必须使用shell: dpkg -l | grep python-apt

答案 1 :(得分:35)

了解command module in the Ansible documentation

  

它不会通过shell处理,所以...操作如“<”,“>”,“|”和“&”将无法正常工作

根据建议,使用shell module

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

对于它的价值,您可以使用the apt command在debian环境中检查/确认安装:

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