Ansible: ¿Es posible "cat file" y exportar su salida a la pantalla mientras se reproduce un libro de jugadas y no como depuración?

22

Escribí un libro de jugadas que instala y configura Google Authenticator por usuario.

Quiero el último paso del libro de jugadas al catarchivo de configuración google_authenticator.

Utilizando el módulo "depurar" puedo obtener los datos que se mostrarán en la pantalla, pero solo como mensaje de depuración:

TASK: [debug var=details.stdout_lines] ****************************************
ok: [localhost] => {
    "details.stdout_lines": [
        "ZKMFTE2ADYA2OYCH",
        "\"RATE_LIMIT 3 30",
        "\" DISALLOW_REUSE",
        "\" TOTP_AUTH",
        "12920994",
        "88224784",
        "69464205",
        "38144121",
        "45634120"
    ]
}

Leí en línea que puedo hacer algo así:

  - name: Print to screen google authenticator details
    command: /bin/cat {{ google_authenticator_secret_file_location }}
    register: details
    tags: google_2fa_user

  - debug: msg="{{ details.stdout_lines }}"

Pero recibo un error cuando lo ejecuto:

TASK: [Print to screen google authenticator details] **************************
changed: [localhost]

TASK: [debug msg="{{details.stdout_lines}}"] **********************************
fatal: [localhost] => Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/ansible/runner/__init__.py", line 532, in _executor
    exec_rc = self._executor_internal(host, new_stdin)
  File "/usr/lib/python2.7/dist-packages/ansible/runner/__init__.py", line 629, in _executor_internal
    return self._executor_internal_inner(host, self.module_name, self.module_args, inject, port, complex_args=complex_args)
  File "/usr/lib/python2.7/dist-packages/ansible/runner/__init__.py", line 815, in _executor_internal_inner
    result = handler.run(conn, tmp, module_name, module_args, inject, complex_args)
  File "/usr/lib/python2.7/dist-packages/ansible/runner/action_plugins/debug.py", line 41, in run
    kv = utils.parse_kv(module_args)
  File "/usr/lib/python2.7/dist-packages/ansible/utils/__init__.py", line 526, in parse_kv
    vargs = [x.decode('utf-8') for x in shlex.split(args, posix=True)]
  File "/usr/lib/python2.7/shlex.py", line 279, in split
    return list(lex)
  File "/usr/lib/python2.7/shlex.py", line 269, in next
    token = self.get_token()
  File "/usr/lib/python2.7/shlex.py", line 96, in get_token
    raw = self.read_token()
  File "/usr/lib/python2.7/shlex.py", line 172, in read_token
    raise ValueError, "No closing quotation"
ValueError: No closing quotation


FATAL: all hosts have already failed -- aborting

PLAY RECAP ********************************************************************

El error dice: "Sin presupuesto de cierre" aunque se cita. También probé:

 - debug: msg= "{{ details.stdout_lines }}"

¿Alguna idea de cuál podría ser el problema?

Itai Ganot
fuente

Respuestas:

3

La cita del filtro Jinja debería resolver el problema de las citas . Úselo así:

  - debug: msg="{{ details.stdout_lines | quote }}"

Para la otra pregunta, no conozco un módulo para imprimir declaraciones que no sean el debugmódulo. Es posible que desee comprobar si Guardar variable registrada en el archivo es una opción. Si desea almacenar variables Ansible en el host del controlador, es posible hacer algo como esto:

- local_action: copy content={{ details.stdout_lines }} dest=/path/to/destination/file

EDITAR Necesito corregirme un poco. Eche un vistazo a esta pregunta predeterminada del servidor . Puede ajustar la salida de Ansible utilizando la callback.displayfunción. Recomiendo leer la publicación del blog vinculada .

Henrik Pingel reinstala a Monica
fuente
1

Apuesto a que el problema es que las comillas en el archivo que estás buscando no coinciden y están jugando con las comillas en el mensaje. Quizás intente:

- depuración: msg = "{{details.stdout_lines | regex_escape ()}"

o

- depuración: msg = "{{detalles.stdout_lines | regex_replace ('"', '\ "')}"

Esto debería escapar de las comillas en el mensaje para que las comillas alrededor del mensaje coincidan entre sí.

Esto no ha sido probado (no estoy en condiciones de probarlo en este momento), pero podría probarlo muy rápido y ver.

LSD
fuente
Intenté ambos ... no funcionó.
Itai Ganot
Hmm, simplemente lo ejecuté sin mis sugerencias anteriores, y obtuve el mismo resultado que tenía al principio. Sin embargo, no parece que pueda obtenerlo en un formato que no sea depuración, sin escribir su propio módulo de registro para ansible, o conectarlo a un script de shell o perl o algo así. Este enlace tenía una buena respuesta stackoverflow.com/questions/28564811/…
lsd
1

He buscado profundamente en Internet y he consultado con algunos profesionales de Ansible.

Según tengo entendido, no hay tal opción en Ansible 1.8 para redirigir la salida del comando a la pantalla como salida normal en lugar de salida de depuración.

Itai Ganot
fuente
2
En cuanto a Ansible 2.2, todavía no hay otra opción para imprimir en la pantalla que no sea el uso de depuración.
Itai Ganot
0

Ejecuté algunas pruebas en el bloque de texto que tenía arriba: lo coloqué en su lugar y limpié las comillas json agregadas mediante el uso de details.stdout_lines.

Si el texto 'incorrecto' en su archivo de autenticación es siempre un comienzo \", entonces esto (probado) simplemente funciona, produciendo casi la misma salida pero con dos puntos en lugar de esta cadena.

- debug: msg="{{ details.stdout.replace('\\"',':').split('\n') }}"

Ahora, este es un caso de uso extremadamente limitado, pero si la salida de autenticación de Google está estrictamente definida aquí (y es totalmente posible que sea así), entonces esto debería hacer lo que desee.

Sin embargo, aún sería más fácil y preferible usarlo var=details.stdout_linespara obtener el contenido aquí.

Ryder
fuente