2014-07-10 11 views
32

ich ansible bin mit meinem Projekt zu implementieren und ich, ob ein angegebenes Paket installiert zu überprüfen versucht, aber ich habe ein Problem mit ihm Aufgabe, hier ist die Aufgabe:Ansible Command Modul sagt, dass '|' unzulässiges Zeichen ist

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

Und hier ist die 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 illegal dieses Zeichen '|'.

+0

Btw, nach https://github.com/ansible/ansible/pull/4617 'python-apt' automatisch installiert werden soll, wenn Sie' apt 'mo Du solltest es also nicht manuell booten. – Mxx

+0

Verwenden Sie 'Shell'-Modul, wenn Sie' Pipe' verwenden möchten – deepdive

Antwort

68

ich mit Ansible nicht vertraut bin, sondern aus der Fehlermeldung ist die | tatsächlich als Argument übergeben zu dpkg und nicht als Rohr zwischen Prozessen interpretiert. Wahrscheinlich führt Ansible den Befehl nicht über eine Shell aus. Sie müssen es also explizit anfordern.

Ich weiß nicht genau, wie das zu tun, von einem von diesen versuchen:

command: bash -c "dpkg -l | grep python-apt" 

oder

command: bash -c 'dpkg -l | grep python-apt' 

Wenn beide ausgefallen ist, haben Sie immer noch die Möglichkeit, die Befehle, die in ein Shell-Skript und das Skript in Ihrem Befehl ...


EDIT: Vom doc:

command - Executes a command on a remote node

Das Kommandomodul nimmt den Befehlsnamen durch eine Liste von Leerzeichen getrennte Argumente gefolgt. Der angegebene Befehl wird auf allen ausgewählten Knoten ausgeführt. Es wird nicht durch 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 - Executes a commands in nodes

Der Shell-Modul führt die Befehlsnamen durch eine Liste von Leerzeichen getrennten Argumenten folgen. Es ist fast genau wie das Befehlsmodul, aber führt den Befehl durch eine Shell (/ bin/sh) auf dem Remote-Knoten.

Sie haben wahrscheinlich shell: dpkg -l | grep python-apt

Noch frage mich, ob meine anfängliche Schätzung (bash -c "...") gearbeitet hätte verwenden ...

+2

Mein Fehler war, Befehl anstelle von Shell zu verwenden. Ich muss auch den Fehler beim ersten Mal ignorieren und dann, wenn das Python-Apt-Paket installiert ist, scheitert die Prüfaufgabe nicht. Vielen Dank. – Robert

32

die command module in the Ansible documentation lesen Sie über:

Es wird nicht durch die Schale verarbeitet, also ..Operationen wie "<", ">", "|" und "&" nicht

funktioniert Wie es empfiehlt, verwenden Sie die shell module:

- 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 überprüfen, die Installation in einer debian-Umgebung/bestätigen the apt command mit:

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

Wenn ich das Apt-Modul verwenden möchte, muss zuerst installiert werden. Ich mache die Bestätigung nur beim ersten Mal und später verwende ich apt-Modul, um Pakete zu installieren. Vielen Dank für Ihre Antwort. – Robert

+0

Ich denke, das ist ein besserer Ansatz, mit Modulen, die direkt mit Paketen interagieren. – diablinux

+0

@ rob3 warten, welche Bestätigung? Sie können "apt" sicherlich verwenden, um Module zu installieren und zu überprüfen, ob sie installiert sind. Sowohl debian als auch ubuntu haben bereits apt, und 'python-apt' hat keine manuellen Installationsschritte. – tedder42

Verwandte Themen