Estou tentando criar um estado fictício no Salt para extrair dependências de uma lista derivada de um pilar.
No meu top.sls
arquivo, eu tenho:
base:
'*':
- components
Então, em components.sls
, eu tenho:
{% if 'components' in pillar.items() %}
include:
{% for component in pillar.get('components',[]) %}
- {{ component }}
{% endfor %}
{% endif %}
{% if 'components' in pillar.items() %}
components:
require:
{% for component in pillar.get('components',[]) %}
- {{ component }}
{% endfor %}
{% endif %}
Quando verifico o conteúdo do pilar, vejo:
$ salt my-minion-id pillar.items
my-minion-id:
----------
components:
- a-dependency-name
Mas quando tento ver o conjunto de estados, vejo:
$ salt my-minion-id state.show_sls components
my-minion-id:
----------
...e é isso.
Meu objetivo final, aqui, é tratar o servo como hostil, por isso estou tentando puxar detalhes papel de pilares em vez de atribuir papéis em meus file_root
's top.sls
. Entendo que todo minion tem acesso total ao conteúdo do file_root, e não quero que um minion host conheça o firewall ou serviços específicos de qualquer nó não relacionado.
Editar:
Descobri que minha estrutura de pilar não suportava a fusão de pilares, pois usava listas, então mudei para uma estrutura de pilar que usava ditados sem valor:
my-minion-id:
----------
components:
----------
a-dependency-name:
None
fonte
Respostas:
Este arquivo SLS modelado funciona esplendidamente:
No entanto, é necessário alterar minha estrutura de chaves do pilar. Na pergunta original, você vê a estrutura como:
Em vez disso, ele precisa ser:
Observe que
a-dependency-name
agora é um ditado e tem uma única chave / valorNone
,. Assim, o arquivo SLS do pilar precisa mudar depara
Embora você possa evitar o uso de dicionários sem valor (e, assim, livrar-se do
.keys()
modelo), use as listas. Se você fizer isso, não poderá mesclar oscomponents
vários pilares; cada pilar que o Salt aplicar substituirá acomponents
chave do anterior e a última leitura do pilar vencerá. Se você deseja mesclar pilares (aqui estamos falando sobre atribuição baseada em funções), isso parece ser a construção necessária.Com isso, a saída de
salt my-minion-id state.show_sls components
fica correta:pillar.items()
nos modelos Jinja acaba não sendo bem equivalente asalt.pillar.items()
; se você tentar usarpillar.ls()
, por exemplo, poderá ver o seguinte erro:Se isso significa evitar um
salt.
atalho de prefixo implícito que Jinja fornece, ou usar uma construção como{% if pillar['components'] is defined %}
(obrigado, @brousch, pelo conselho), não posso dizer.fonte
Você também pode fazê-lo como:
fonte