Módulo de Comando Ansible diz que ‘|’ é um personagem ilegal

Estou usando o Ansible para implantar meu projeto e estou tentando verificar se um pacote especificado está instalado, mas tenho um problema com ele, aqui está a tarefa:

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

E aqui está o 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 

Por que é ilegal esse caractere ‘|’ .

Eu não estou familiarizado com Ansible mas a partir da mensagem de erro, o | é de fato passado como um argumento para o dpkg e não interpretado como um canal entre processos. Provavelmente Ansible não executa o comando através de um shell. Então você tem que explicitamente solicitá-lo.

Eu não sei exatamente como fazer isso, tente um destes:

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

ou

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

Se ambos falharam, você ainda tem a opção de colocar os comandos em um shell script e usar esse script em seu comando …


EDIT: do doc:

comando – Executa um comando em um nó remoto

O módulo de comando usa o nome do comando seguido por uma lista de argumentos delimitados por espaço. O comando dado será executado em todos os nós selecionados. Ele não será processado através do shell, portanto, variables ​​como $ HOME e operações como “< ", ">“, “|” e “&” não funcionarão (use o módulo shell se você precisar desses resources).

shell – Executa comandos nos nós

O módulo de shell usa o nome do comando seguido por uma lista de argumentos delimitados por espaço. É quase exatamente como o módulo de comando, mas executa o comando através de um shell (/ bin / sh) no nó remoto.

Você provavelmente terá que usar o shell: dpkg -l | grep python-apt shell: dpkg -l | grep python-apt

Ainda me pergunto se meu palpite inicial ( bash -c "..." ) teria funcionado …

leia sobre o módulo de comando na documentação do Ansible :

Ele não será processado através do shell, portanto, operações como “< ", ">“, “|” e “&” não funcionarão

Como recomendado, use o módulo de shell :

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

Por que vale a pena, você pode verificar / confirmar a instalação em um ambiente Debian usando o comando apt :

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