¿Cómo examinar la producción de Jinja en Saltstack?

16

Tengo una plantilla SLSen Salt que estoy tratando de construir, pero emite una sintaxis no válida, lo que produce errores como:

my-minion-id:
    - State 'system' in SLS 'network' is not formed as a list

En principio, debería ser posible, de alguna manera , examinar el resultado de la plantilla Jinja antes de que intente analizar el resultado como un SLSarchivo. Existe un módulo de Python para el renderizador Jinja salt.renderers.jinja, pero si intento ejecutarlo en la CLI, aparece un error:

# salt my-minion-id salt.renderers.jinja.render /srv/salt/network/init.sls
my-minion-id:
    'salt.renderers.jinja.render' is not available.
ERROR: Minions returned with non-zero exit code
# salt my-minion-id renderers.jinja.render /srv/salt/network/init.sls
my-minion-id:
    'renderers.jinja.render' is not available.
ERROR: Minions returned with non-zero exit code

¿Cómo puedo ver el resultado de mi plantilla? Parece absurdo que deba ser tan difícil de depurar.

Michael Mol
fuente

Respuestas:

11

Echa un vistazo al módulo slsutil.renderer .

Esto debería hacer lo que quieras

salt my-minion-id slsutil.renderer /srv/salt/network/init.sls 'jinja'

Este módulo solo llama a la función compile_template directamente por usted.

Editar: /srv/salt/network/init.sls es el camino en el minion, si no está apuntando al maestro como su minion, probablemente tendrá que hacer lo siguiente.

salt minion-id cp.cache_file salt://network/init.sls
salt minion-id slsutil.renderer /var/cache/salt/minion/files/base/network/init.sls

o señale cualquier archivo que escupe cache_file.

Si está en 2018.3 o más reciente, solo puede especificar salt://network/init.sls

gtmanfred
fuente
Pero, ¿qué camino es / srv / salt / network? ¿Es el camino en el maestro? El minion?
Mrten
Es un camino en el minion. Puede hacer salt minion-id cp.cache_file salt://network/init.slsy luego ejecutar slsutil.renderer contra el archivo que escupe después de ser almacenado en caché en el minion, o a partir de 2018.3, puede especificarsalt://network/init.sls
gtmanfred
8

Dado el tiempo que pasé hace semanas luchando con un problema estrechamente relacionado, desearía haberlo resuelto antes.

La solución parece ser usar salt.modules.cp.get_templatepara que Salt Minion recupere el archivo, lo entregue a través del motor de plantillas y lo coloque en un lugar legible:

# salt my-minion-id cp.get_template salt://network/init.sls /root/network.sls template=jinja
my-minion-id:
    /root/network.sls

Desde allí, se conecta al my-minion-idhost y examina el archivo en el que colocó /root/network.sls.

Esto tiene sentido; salt.renderers.jinjaestá en el salt.renderersespacio de nombres, mientras que los módulos a los que tiene acceso desde la CLI están en el salt.modulesespacio de nombres.

También tiene sentido desde el punto de vista de la visibilidad de datos; la representación de plantillas ocurre en el minion , donde los granos y demás están disponibles, y aún no he visto un módulo que ejecute el código minion que devuelva resultados arbitrarios al maestro (para ver en la CLI, por ejemplo); los datos devueltos son invariablemente bien estructurados y concisos. (Puede haber un módulo de este tipo, pero no sé qué es. Sería una solución preferible para colocar archivos de prueba en un minion).

editar: la respuesta de @ gtmanfred es mucho mejor y más directa, y he aceptado esa. Dejo este aquí con fines informativos. No es la mejor solución, pero aún funciona.

Michael Mol
fuente