it-swarm.com.de

Ansible Command Modul sagt, dass '|' ist ein unzulässiger Charakter

Ich verwende Ansible zum Bereitstellen meines Projekts und versuche zu überprüfen, ob ein bestimmtes Paket installiert ist, aber ich habe ein Problem mit der Aufgabe. Hier ist die Aufgabe:

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

Und hier ist das 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 

Warum ist dieses Zeichen ungültig '|'.

52
Robert

Aus dem Dokument:

Befehl - Führt einen Befehl auf einem entfernten Knoten aus

Das Befehlsmodul verwendet den Befehlsnamen, gefolgt von einer Liste von durch Leerzeichen getrennten Argumenten. Der angegebene Befehl wird auf allen ausgewählten Knoten ausgeführt. Es wird nicht über die Shell verarbeitet, daher funktionieren Variablen wie $ HOME und Operationen wie "<", ">", "|" und "&" nicht (verwenden Sie das Shell-Modul, wenn Sie diese Funktionen benötigen).

Shell - Führt einen Befehl in Nodes aus

Das Shell-Modul verwendet den Befehlsnamen, gefolgt von einer Liste von durch Leerzeichen getrennten Argumenten. Es ist fast genau wie das Befehlsmodul, führt den Befehl jedoch über eine Shell (/ bin/sh) auf dem Remote-Knoten aus.

Deshalb musst du Shell: dpkg -l | grep python-apt.

103
Sylvain Leroux

lesen Sie mehr über das Befehlsmodul in der Ansible-Dokumentation :

Es wird nicht über die Shell verarbeitet, daher funktionieren Operationen wie "<", ">", "|" und "&" nicht

Verwenden Sie, wie empfohlen, das Shell-Modul :

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

Für das, was es wert ist, können Sie die Installation in einer Debian-Umgebung überprüfen/bestätigen, indem Sie den Befehl apt :

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