Ansible Command module mówi, że ' / ' jest nielegalnym znakiem

Używam Ansible do wdrożenia mojego projektu i próbuję sprawdzić, czy dany pakiet jest zainstalowany, ale mam problem z zadaniem it, oto zadanie:

- 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 ten znak jest nielegalny '|' .

Author: Robert, 2014-07-10

2 answers

Z doc:

Command - wykonuje polecenie na zdalnym węźle

Moduł polecenia przyjmuje nazwę polecenia, po której następuje lista argumenty rozdzielone spacjami. Podane polecenie zostanie wykonane na wszystkich wybrane węzły. Nie będzie przetwarzany przez powłokę, więc zmienne takie jak $HOME i operacje takie jak "", "|", and " & " will nie działa (użyj modułu powłoki, jeśli potrzebujesz tych funkcji).

Shell - wykonuje polecenie w węzły

Moduł powłoki pobiera nazwę polecenia, po której następuje lista argumentów rozdzielonych spacjami. Jest prawie dokładnie jak moduł command, ale uruchamia polecenie poprzez powłokę (/bin / sh) na zdalnym węźle.

Dlatego musisz użyć shell: dpkg -l | grep python-apt.

 133
Author: Sylvain Leroux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-30 10:58:22

Przeczytaj o module poleceń w dokumentacji Ansible :

Nie będzie przetwarzany przez powłokę, więc .. operacje takie jak "", "|", and " & " will not work

Zgodnie z zaleceniami, użyj modułu powłoki :

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

Jeśli to coś warte, możesz sprawdzić / potwierdzić instalację w środowisku Debiana używając apt komendy:

- name: ensure python-apt is installed
  apt: name=python-apt state=present
 39
Author: tedder42,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-11 16:48:33