2014-07-10 22 views
32

Sto usando Ansible di distribuire il mio progetto e ho cercando di verificare se è installato un pacchetto specificato, ma ho un problema con esso compito, ecco il compito:Il modulo di comando Ansible dice che '|' è il carattere illegale

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

Ed ecco il problema:

$ 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 

Perché è illegale questo personaggio '|'.

+0

Btw, secondo https://github.com/ansible/ansible/pull/4617 'python-apt' dovrebbe essere installato automaticamente quando si utilizza' apt 'mo dule, quindi non dovresti aver bisogno di riavviarlo manualmente. – Mxx

+0

usa il modulo 'shell' se vuoi usare' pipe' – deepdive

risposta

68

io non sono a conoscenza Ansible ma dal messaggio di errore, il | è infatti passato come argomento per dpkg e non interpretato come un tubo di tra i processi. Probabilmente Ansible non esegue il comando attraverso una shell. Quindi devi richiederlo esplicitamente.

Non so esattamente come fare, per provare uno di questi:

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

o

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

Se entrambi falliti, avete ancora la possibilità di mettere i comandi uno script di shell e l'uso che lo script nel comando ...


EDIT: Dal documento:

command - Executes a command on a remote node

Il modulo di comando prende il nome del comando seguito da un elenco di argomenti spazio delimitato. Il comando specificato verrà eseguito su tutti i nodi selezionati . Non verrà elaborato tramite la shell, quindi le variabili come $ HOME e operazioni come "<", ">", "|" e "&" non funzioneranno (utilizzare il modulo della shell se sono necessarie queste funzionalità).

shell - Executes a commands in nodes

Il modulo shell prende il nome del comando seguito da un elenco di argomenti delimitati da spazi. È quasi esattamente come il modulo di comando, ma esegue il comando attraverso una shell (/ bin/sh) sul nodo remoto.

probabilmente dovete usare shell: dpkg -l | grep python-apt

chiedo ancora se la mia ipotesi iniziale (bash -c "...") avrebbe funzionato ...

+2

Il mio errore era usare il comando piuttosto che shell. Devo anche ignorare l'errore la prima volta e poi quando il pacchetto python-apt è installato, l'attività di verifica non fallisce. Grazie. – Robert

32

leggere sui command module in the Ansible documentation:

Non sarà elaborato attraverso la shell, quindi ..operazioni come "<", ">", "|", e "&" non funzionerà

Come si raccomanda, utilizzare il shell module:

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

Per quello che vale, è possibile controllare/confermare l'installazione in un ambiente Debian usando the apt command:

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

Se voglio usare il modulo apt, è necessario prima installato. Faccio la conferma solo la prima volta e successivamente uso il modulo apt per installare i pacchetti. La ringrazio per la risposta. – Robert

+0

Penso che questo sia un aproach migliore, usando moduli che interagiscono direttamente con i pacchetti. – diablinux

+0

@ rob3 wait, quale conferma? puoi certamente usare 'apt' per installare i moduli e verificare che siano installati. Sia debian che ubuntu hanno già apt, e 'python-apt' non ha passaggi di installazione manuali. – tedder42