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

Rob*_*ert 56 shell dpkg ansible ansible-playbook

我正在使用Ansible来部署我的项目,我试图检查是否安装了指定的包,但是我的任务有问题,这是任务:

- name: Check if python-apt is installed
  command: dpkg -l | grep python-apt
  register: python_apt_installed
  ignore_errors: True
Run Code Online (Sandbox Code Playgroud)

这是问题所在:

$ 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 
Run Code Online (Sandbox Code Playgroud)

为什么非法这个字符'|' .

Syl*_*oux 108

来自doc:

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

命令模块接受命令名称,后跟空格分隔的参数列表.给定的命令将在所有选定的节点上执行.它不会通过shell处理,因此诸如$ HOME之类的变量和诸如"<",">","|"和"&"之类的操作将不起作用(如果需要这些功能,请使用shell模块).

shell - 在节点中执行命令

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

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

  • 我的错误是使用命令而不是shell.我还必须在第一次忽略错误,然后在安装python-apt软件包时,检查任务不会失败.谢谢. (3认同)

ted*_*r42 38

阅读Ansible文档中命令模块:

它不会通过shell处理,所以.."<",">","|"和"&"之类的操作将不起作用

正如它所建议的那样,使用shell模块:

- name: Check if python-apt is installed
  shell: dpkg -l | grep python-apt
  register: python_apt_installed
  ignore_errors: True
Run Code Online (Sandbox Code Playgroud)

为了它的价值,您可以使用以下apt命令在debian环境中检查/确认安装:

- name: ensure python-apt is installed
  apt: name=python-apt state=present
Run Code Online (Sandbox Code Playgroud)

  • 是的,但是从文档中可以看到第一个注释:**需要python-apt**.然后第一个任务是安装python-apt然后我可以用它来安装其他包. (2认同)