Ansible ofrece un depurador de tareas para que pueda corregir errores durante la ejecución en lugar de editar su libro de jugadas y ejecutarlo nuevamente para ver si su cambio funcionó. Tiene acceso a todas las funciones del depurador en el contexto de la tarea. Puede verificar o establecer el valor de las variables, actualizar los argumentos del módulo y volver a ejecutar la tarea con las nuevas variables y argumentos. El depurador le permite resolver la causa del error y continuar con la ejecución del libro de jugadas.

  • Habilitando el depurador

    • Habilitar el depurador con el debugger palabra clave

      • Ejemplos de uso de debugger palabra clave
    • Habilitar el depurador en la configuración o una variable de entorno
    • Habilitando el depurador como estrategia
  • Resolución de errores en el depurador
  • Comandos de depuración disponibles

    • Comando de impresión
    • Actualizar comando args
    • Actualizar comando vars
    • Actualizar comando de tarea
    • Rehacer comando
    • Continuar comando
    • Salir del comando
  • Cómo interactúa el depurador con la estrategia gratuita

Habilitando el depurador

El depurador no está habilitado de forma predeterminada. Si desea invocar el depurador durante la ejecución del libro de jugadas, primero debe habilitarlo.

Utilice uno de estos tres métodos para habilitar el depurador:

  • con la palabra clave depurador
  • en configuración o una variable de entorno, o
  • como estrategia

Habilitar el depurador con el debugger palabra clave

Nuevo en la versión 2.5.

Puedes usar el debugger palabra clave para habilitar (o deshabilitar) el depurador para una obra, función, bloqueo o tarea específicos. Esta opción es especialmente útil al desarrollar o ampliar libros de jugadas, obras de teatro y roles. Puede habilitar el depurador en tareas nuevas o actualizadas. Si fallan, puede corregir los errores de manera eficiente. los debugger palabra clave acepta cinco valores:

Valor

Resultado

siempre

Invoque siempre al depurador, independientemente del resultado

Nunca

Nunca invoque al depurador, independientemente del resultado

on_failed

Solo invoca al depurador si falla una tarea

on_unreachable

Solo invoque al depurador si no se puede acceder a un host

on_skipped

Solo invoque al depurador si se omite la tarea

Cuando usa el debugger palabra clave, el valor que especifique anula cualquier configuración global para habilitar o deshabilitar el depurador. Si tu defines debugger en múltiples niveles, como en un rol y en una tarea, Ansible respeta la definición más granular. La definición a nivel de juego o rol se aplica a todos los bloques y tareas dentro de ese juego o rol, a menos que especifiquen un valor diferente. La definición en el nivel de bloque anula la definición en el nivel de juego o rol, y se aplica a todas las tareas dentro de ese bloque, a menos que especifiquen un valor diferente. La definición a nivel de tarea siempre se aplica a la tarea; anula las definiciones a nivel de bloque, juego o rol.

Ejemplos de uso de debugger palabra clave

Ejemplo de configuración del debugger palabra clave en una tarea:

-name: Execute a command
  ansible.builtin.command:"false"debugger: on_failed

Ejemplo de configuración del debugger palabra clave en una obra de teatro:

-name: My play
  hosts: all
  debugger: on_skipped
  tasks:-name: Execute a command
      ansible.builtin.command:"true"when:False

Ejemplo de configuración del debugger palabra clave en varios niveles:

-name: Play
  hosts: all
  debugger: never
  tasks:-name: Execute a command
      ansible.builtin.command:"false"debugger: on_failed

En este ejemplo, el depurador está configurado en never en el nivel de juego y para on_failed a nivel de tarea. Si la tarea falla, Ansible invoca al depurador, porque la definición de la tarea anula la definición de su reproducción principal.

Habilitar el depurador en la configuración o una variable de entorno

Nuevo en la versión 2.5.

Puede habilitar el depurador de tareas globalmente con una configuración en ansible.cfg o con una variable de entorno. Las únicas opciones son True o False. Si establece la opción de configuración o la variable de entorno en True, Ansible ejecuta el depurador en tareas fallidas de forma predeterminada.

Para habilitar el depurador de tareas desde ansible.cfg, agregue esta configuración a la sección de valores predeterminados:

[defaults]
enable_task_debugger = True

Para habilitar el depurador de tareas con una variable de entorno, pase la variable cuando ejecute su libro de jugadas:

ANSIBLE_ENABLE_TASK_DEBUGGER=True ansible-playbook -i hosts site.yml

Cuando habilita el depurador globalmente, cada tarea fallida invoca al depurador, a menos que el rol, juego, bloqueo o tarea deshabilite explícitamente el depurador. Si necesita un control más granular sobre las condiciones que activan el depurador, utilice el debugger palabra clave.

Habilitando el depurador como estrategia

Si está ejecutando libros de jugadas o roles heredados, es posible que vea el depurador habilitado como un estrategia. Puede hacer esto en el nivel de juego, en ansible.cfg o con la variable de entorno ANSIBLE_STRATEGY=debug. Por ejemplo:

-hosts: test
  strategy: debug
  tasks:...

O en ansible.cfg:

[defaults]
strategy = debug

Nota

Este método compatible con versiones anteriores, que coincide con las versiones de Ansible anteriores a la 2.5, puede eliminarse en una versión futura.

Resolución de errores en el depurador

Después de que Ansible invoca al depurador, puede usar los siete comandos del depurador para resolver el error que encontró Ansible. Considere este ejemplo de libro de jugadas, que define el var1 variable pero usa el indefinido wrong_var variable en una tarea por error.

-hosts: test
  debugger: on_failed
  gather_facts: no
  vars:var1: value1
  tasks:-name: Use a wrong variable
      ansible.builtin.ping: data= wrong_var 

Si ejecuta este libro de jugadas, Ansible invoca al depurador cuando falla la tarea. Desde el indicador de depuración, puede cambiar los argumentos del módulo o las variables y ejecutar la tarea nuevamente.

PLAY ***************************************************************************

TASK [wrong variable] **********************************************************
fatal: [192.0.2.10]: FAILED! => "failed": true, "msg": "ERROR! 'wrong_var' is undefined"
Debugger invoked
[192.0.2.10] TASK: wrong variable (debug)> p result._result
'failed': True,
 'msg': 'The task includes an option with an undefined variable. The error '
        "was: 'wrong_var' is undefinedn"
        'n'
        'The error appears to have been in '
        "'playbooks/debugger.yml': line 7, "
        'column 7, but mayn'
        'be elsewhere in the file depending on the exact syntax problem.n'
        'n'
        'The offending line appears to be:n'
        'n'
        '  tasks:n'
        '    - name: wrong variablen'
        '      ^ heren'
[192.0.2.10] TASK: wrong variable (debug)> p task.args
u'data': u' wrong_var '
[192.0.2.10] TASK: wrong variable (debug)> task.args['data'] = ' var1 '
[192.0.2.10] TASK: wrong variable (debug)> p task.args
u'data': ' var1 '
[192.0.2.10] TASK: wrong variable (debug)> redo
ok: [192.0.2.10]

PLAY RECAP *********************************************************************
192.0.2.10               : ok=1    changed=0    unreachable=0    failed=0

Cambiar los argumentos de la tarea en el depurador para usar var1 en lugar de wrong_var hace que la tarea se ejecute correctamente.

Comandos de depuración disponibles

Puede utilizar estos siete comandos en el indicador de depuración:

Mando

Atajo

Acción

impresión

pag

Imprimir información sobre la tarea

task.args[key] = valor

sin atajo

Actualizar los argumentos del módulo

task_vars[key] = valor

sin atajo

Actualice las variables de la tarea (debe update_task Siguiente)

update_task

tu

Recrear una tarea con variables de tarea actualizadas

rehacer

r

Ejecuta la tarea nuevamente

Seguir

C

Continuar ejecutando, comenzando con la siguiente tarea

dejar

q

Salir del depurador

Para obtener más detalles, consulte las descripciones individuales y los ejemplos a continuación.

Comando de impresión

print *task/task.args/task_vars/host/result* imprime información sobre la tarea:

[192.0.2.10] TASK: install package (debug)> p task
TASK: install package
[192.0.2.10] TASK: install package (debug)> p task.args
u'name': u' pkg_name '[192.0.2.10] TASK: install package (debug)> p task_vars
u'ansible_all_ipv4_addresses':[u'192.0.2.10'],u'ansible_architecture': u'x86_64',...[192.0.2.10] TASK: install package (debug)> p task_vars['pkg_name']
u'bash'
[192.0.2.10] TASK: install package (debug)> p host
192.0.2.10
[192.0.2.10] TASK: install package (debug)> p result._result
'_ansible_no_log':False,'changed':False,u'failed':True,...u'msg': u"No package matching 'not_exist' is available"

Actualizar comando args

task.args[*key*] = *value* actualiza un argumento de módulo. Este libro de jugadas de muestra tiene un nombre de paquete no válido:

-hosts: test
  strategy: debug
  gather_facts: yes
  vars:pkg_name: not_exist
  tasks:-name: Install a package
      ansible.builtin.apt: name= pkg_name 

Cuando ejecuta el libro de jugadas, el nombre del paquete no válido desencadena un error y Ansible invoca al depurador. Puede corregir el nombre del paquete viendo y luego actualizando el argumento del módulo:

[192.0.2.10] TASK: install package (debug)> p task.args
u'name': u' pkg_name '[192.0.2.10] TASK: install package (debug)> task.args['name'] = 'bash'
[192.0.2.10] TASK: install package (debug)> p task.args
u'name':'bash'[192.0.2.10] TASK: install package (debug)> redo

Después de actualizar el argumento del módulo, use redo para ejecutar la tarea nuevamente con los nuevos argumentos.

Actualizar comando vars

task_vars[*key*] = *value* actualiza el task_vars. Puede arreglar el libro de jugadas anterior viendo y luego actualizando las variables de la tarea en lugar de los argumentos del módulo:

[192.0.2.10] TASK: install package (debug)> p task_vars['pkg_name']
u'not_exist'
[192.0.2.10] TASK: install package (debug)> task_vars['pkg_name'] = 'bash'
[192.0.2.10] TASK: install package (debug)> p task_vars['pkg_name']
'bash'
[192.0.2.10] TASK: install package (debug)> update_task
[192.0.2.10] TASK: install package (debug)> redo

Después de actualizar las variables de la tarea, debe usar update_task para cargar las nuevas variables antes de usar redo para ejecutar la tarea nuevamente.

Nota

En 2.5 esto se actualizó de vars para task_vars para evitar conflictos con el vars() función de Python.

Actualizar comando de tarea

Nuevo en la versión 2.8.

u o update_task recrea la tarea a partir de la estructura de datos de la tarea original y las plantillas con variables de tarea actualizadas. Ver la entrada Actualizar comando vars para un ejemplo de uso.

Rehacer comando

r o redo ejecuta la tarea de nuevo.

Continuar comando

c o continue continúa ejecutándose, comenzando con la siguiente tarea.

Salir del comando

q o quit cierra el depurador. Se cancela la ejecución del libro de jugadas.

Cómo interactúa el depurador con la estrategia gratuita

Con el predeterminado linear estrategia habilitada, Ansible detiene la ejecución mientras el depurador está activo y ejecuta la tarea depurada inmediatamente después de que ingrese el redo mando. Con el free Sin embargo, con la estrategia habilitada, Ansible no espera a todos los hosts y puede poner en cola tareas posteriores en un host antes de que una tarea falle en otro host. Con el free estrategia, Ansible no pone en cola ni ejecuta ninguna tarea mientras el depurador está activo. Sin embargo, todas las tareas en cola permanecen en la cola y se ejecutan tan pronto como sale del depurador. Si utiliza redo para reprogramar una tarea desde el depurador, otras tareas en cola pueden ejecutarse antes que su tarea reprogramada. Para obtener más información sobre estrategias, consulte Controlar la ejecución del libro de jugadas: estrategias y más.

Ver también

Ejecución de playbooks para solucionar problemas

Ejecutar libros de jugadas durante la depuración o la prueba

Introducción a los libros de jugadas

Introducción a los libros de jugadas

Lista de correo de usuarios

¿Tengo una pregunta? ¡Pasa por el grupo de google!

irc.freenode.net

Canal de chat de IRC #ansible