Como examinar a saída Jinja no Saltstack?

16

Eu tenho um modelo SLSno Salt que estou tentando criar, mas está emitindo sintaxe inválida, o que resulta em erros como:

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

Em princípio, deve ser possível, de alguma forma , examinar a saída do modelo Jinja antes que ele tente analisar a saída como um SLSarquivo. Existe um módulo Python para o renderizador Jinja salt.renderers.jinja, mas se eu tentar executá-lo na CLI, recebo um erro:

# 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

Como posso ver a saída do meu modelo? Parece absurdo que deve ser tão difícil de depurar.

Michael Mol
fonte

Respostas:

11

Confira o módulo slsutil.renderer .

Isso deve fazer o que você quiser

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

Este módulo chama apenas a função compile_template diretamente para você.

Edit: /srv/salt/network/init.sls é o caminho do lacaio, se você não estiver mirando o mestre como seu lacaio, provavelmente precisará fazer o seguinte.

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

ou aponte para qualquer arquivo que cache_file cuspa.

Se você estiver em 2018.3 ou mais recente, você pode apenas especificar salt://network/init.sls

gtmanfred
fonte
Mas qual é o caminho / srv / salt / network? É o caminho do mestre? O servo?
Mrten
É um caminho para o lacaio. Você pode fazer salt minion-id cp.cache_file salt://network/init.slse depois slsutil.renderer corrida contra o arquivo ele cospe de volta depois de ser armazenada em cache no servo, ou a partir de 2018,3, você pode apenas especificarsalt://network/init.sls
gtmanfred
8

Dado o tempo que passei semanas atrás lutando com um problema intimamente relacionado, eu gostaria de ter descoberto isso antes.

Parece que a solução é usar salt.modules.cp.get_templateo Salt minion para recuperar o arquivo, processá-lo através do mecanismo de modelagem e colocá-lo em um local legível:

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

A partir daí, você se conecta ao my-minion-idhost e examina o arquivo em que colocou /root/network.sls.

Isso faz sentido; salt.renderers.jinjaestá no salt.renderersespaço para nome, enquanto os módulos aos quais você tem acesso a partir da CLI estão no salt.modulesespaço para nome.

Também faz sentido do ponto de vista da visibilidade de dados; a renderização do modelo ocorre no minion , onde grãos e outros estão disponíveis, e ainda não vi um módulo que executa o código do minion retornar uma saída arbitrária ao mestre (para visualização na CLI, por exemplo); os dados retornados são invariavelmente bem estruturados e concisos. (Pode haver um módulo desse tipo, mas não sei o que é. Seria uma solução preferível colocar arquivos de teste em um lacaio.)

edit: a resposta de @ gtmanfred é muito melhor e mais direta, e eu aceitei essa. Estou deixando este aqui para fins informativos. Não é a melhor solução, mas ainda funciona.

Michael Mol
fonte