example shell ansible dpkg ansible-playbook

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 ...