Ansible Command模块报错:'|'是非法字符。

82

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

为什么这个字符'|'是非法的。


顺便提一下,根据 https://github.com/ansible/ansible/pull/4617 的说法,当您使用 apt 模块时,应自动安装 python-apt,因此您不需要手动引导它。 - Mxx
如果您想使用pipe,请使用shell模块。 - deepdive
2个回答

166

来自文档:

command - 在远程节点上执行命令

command模块接受命令名称,后跟用空格分隔的参数列表。给定的命令将在所有选定的节点上执行。它不会经过shell处理,因此像$HOME这样的变量和像“<”,“>”,“|”和“&”等操作都不起作用(如果您需要这些特性,请使用shell模块)。

shell - 在节点上执行命令

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

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


4
我的错误在于使用了命令而不是Shell。我还需要忽略第一次出现的错误,等安装了python-apt软件包后,检查任务就不会失败了。谢谢。 - Robert

41

阅读Ansible文档中的命令模块

它不会通过shell处理,所以像"<", ">", "|", 和 "&"等操作是无法使用的。

如建议所示,使用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

如果我想使用apt模块,必须先安装它。我只需要第一次进行确认,然后就可以使用apt模块来安装软件包了。谢谢您的回答。 - Robert
我认为这是更好的方法,使用直接与包进行交互的模块。 - diablinux
@rob3 等等,什么确认?你肯定可以使用 apt 安装模块并验证它们是否已安装。Debian 和 Ubuntu 都已经有了 apt,而 python-apt 没有任何手动安装步骤。 - tedder42
2
是的,但是从文档中的第一个注释可以看出:需要python-apt。因此,第一步是安装python-apt,然后我才能使用它来安装其他软件包。 - Robert
@Rob3 看起来很奇怪,但你可以使用apt安装python-apt。 - tedder42
应该是被接受的答案。比@Sylvain的更直接。 - Charlie Dalsass

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接