2014-07-10 11 views
32

Używam ansibl wdrożyć mojego projektu i próbuje sprawdzić, czy zainstalowany jest określony pakiet, ale mam problem z tym zadaniem, oto zadanie:Moduł Ansible Command mówi, że '|' jest nielegalny charakter

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

I tu jest 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 

Dlaczego ta postać jest nielegalna? "|".

+0

Btw, według https://github.com/ansible/ansible/pull/4617 'python-apt' powinny być instalowane automatycznie podczas korzystania' apt 'mo dule, więc nie powinieneś ręcznie ładować go. – Mxx

+0

użyj modułu 'shell' jeśli chcesz użyć' pipe' – deepdive

Odpowiedz

68

nie jestem zaznajomiony z Ansible ale z komunikatem o błędzie, | jest w rzeczywistości przekazany jako argument do dpkg a nie interpretowane jako rury między procesami. Prawdopodobnie Ansible nie wykonuje polecenia przez powłokę. Musisz więc wyraźnie o to poprosić.

Nie wiem dokładnie, jak to zrobić, że spróbować jednego z nich:

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

lub

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

Jeśli oba zawiodły, wciąż masz możliwość umieścić poleceń skrypt powłoki i użyć tego skryptu w komendzie ...


EDIT: Od doc:

command - Executes a command on a remote node

Moduł komenda bierze nazwę polecenia, po którym następuje lista spacjami argumentów. Podane polecenie zostanie wykonane na wszystkich wybranych węzłach . Nie będzie przetwarzane przez powłokę, więc zmienne takie jak $ HOME i operacje takie jak "<", ">", "|" i "&" nie będą działać (użyj modułu powłoki, jeśli potrzebujesz tych funkcji).

shell - Executes a commands in nodes

Moduł powłoka wykonuje nazwę polecenia następuje lista argumentów spacjami. To prawie dokładnie tak jak moduł poleceń, ale uruchamia polecenie poprzez powłokę (/ bin/sh) na zdalnym węźle.

Prawdopodobnie trzeba używać shell: dpkg -l | grep python-apt

Wciąż zastanawiam się, czy moje pierwsze przypuszczenie (bash -c "...") będzie pracował ...

+2

Mój błąd polegał na użyciu polecenia zamiast powłoki. Muszę też zignorować błąd za pierwszym razem, a następnie po zainstalowaniu pakietu python-apt, zadanie sprawdzania nie zawiedzie. Dziękuję Ci. – Robert

32

przeczytać o command module in the Ansible documentation:

To nie będzie przetwarzane przez powłokę, więc ...Operacje takie jak "<", ">", "|" i "&" nie będzie działać

Jak zaleca używać shell module:

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

Na co warto, można sprawdzić/potwierdzić instalację w środowisku za pomocą the apt command debian:

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

Jeśli chcę użyć modułu apt, konieczne jest zainstalowanie jako pierwsze. Potwierdzam tylko za pierwszym razem, a później używam apt do instalowania pakietów. Dziękuję za Twoją odpowiedź. – Robert

+0

Myślę, że jest to lepsze podejście, używając modułów, które współdziałają bezpośrednio z pakietami. – diablinux

+0

@ rob3 czekaj, jakie potwierdzenie? z pewnością możesz użyć 'apt' do instalacji modułów i sprawdzić, czy są zainstalowane. Zarówno debian, jak i ubuntu mają już apt, a 'python-apt' nie ma żadnych ręcznych czynności instalacyjnych. – tedder42

Powiązane problemy