web-dev-qa-db-fra.com

Le module Ansible Command dit que '|' est un personnage illégal

J'utilise Ansible pour déployer mon projet et j'essaie de vérifier si un paquet spécifié est installé, mais j'ai un problème avec cette tâche, voici la tâche:

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

Et voici le problème:

$ 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 

Pourquoi est illégal ce caractère '|'.

52
Robert

De la doc:

command - Exécute une commande sur un noeud distant

Le module de commande prend le nom de la commande suivi d'une liste d'arguments délimités par des espaces. La commande donnée sera exécutée sur tous les nœuds sélectionnés. Il ne sera pas traité par le biais du shell. Par conséquent, les variables telles que $ HOME et les opérations "<", ">", "|" et "&" ne fonctionneront pas (utilisez le module Shell si vous avez besoin de ces fonctionnalités).

Shell - Exécute une commande en nœuds

Le module Shell prend le nom de la commande suivi d'une liste d'arguments délimités par des espaces. Il est presque identique au module de commande mais exécute la commande via un shell (/ bin/sh) sur le nœud distant.

Par conséquent, vous devez utiliser Shell: dpkg -l | grep python-apt.

103
Sylvain Leroux

lire à propos de module de commande dans la documentation Ansible :

Il ne sera pas traité par le biais du shell. Les opérations telles que "<", ">", "|" et "&" ne fonctionneront pas.

Comme il est recommandé, utilisez le module Shell :

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

Pour ce que cela vaut, vous pouvez vérifier/confirmer l’installation dans un environnement Debian en utilisant la commande apt :

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