shell - example - El módulo de Comando Ansible dice que ''|'' es un personaje ilegal
ansible shell syntax (2)
Lea sobre el módulo de comando en la documentación de Ansible :
No se procesará a través del shell, por lo que las operaciones como "<", ">", "|" y "&" no funcionarán.
Como recomienda, use el 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 lo que vale, puede verificar / confirmar la instalación en un entorno Debian usando el comando apt
:
- name: ensure python-apt is installed
apt: name=python-apt state=present
Estoy usando Ansible para implementar mi proyecto y estoy tratando de verificar si un paquete específico está instalado, pero tengo un problema con la tarea, aquí está la tarea:
- name: Check if python-apt is installed
command: dpkg -l | grep python-apt
register: python_apt_installed
ignore_errors: True
Y aquí esta el 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 qué es ilegal este personaje ''|'' .
No estoy familiarizado con Ansible
pero a partir del mensaje de error, el |
de hecho se pasa como un argumento para dpkg
y no se interpreta como un conducto entre procesos. Probablemente Ansible no ejecuta el comando a través de un shell. Entonces tienes que pedirlo explícitamente.
No sé exactamente cómo hacer eso, pruebe uno de estos:
command: bash -c "dpkg -l | grep python-apt"
o
command: bash -c ''dpkg -l | grep python-apt''
Si ambos fallaron, aún tienes la opción de poner los comandos en un script de shell y usar ese script en tu comando ...
EDITAR: Del doc:
comando - Ejecuta un comando en un nodo remoto
El módulo de comando toma el nombre del comando seguido de una lista de argumentos delimitados por espacios. El comando dado se ejecutará en todos los nodos seleccionados. No se procesará a través del shell, por lo que variables como $ HOME y operaciones como "<", ">", "|" y "&" no funcionarán (use el módulo de shell si necesita estas características).
shell - Ejecuta comandos en nodos
El módulo de shell toma el nombre del comando seguido de una lista de argumentos delimitados por espacios. Es casi exactamente como el módulo de comando, pero ejecuta el comando a través de un shell (/ bin / sh) en el nodo remoto.
Probablemente tengas que usar shell: dpkg -l | grep python-apt
shell: dpkg -l | grep python-apt
Todavía me pregunto si mi conjetura inicial ( bash -c "..."
) hubiera funcionado ...