Construindo dependências de um pilar no Saltstack

7

Estou tentando criar um estado fictício no Salt para extrair dependências de uma lista derivada de um pilar.

No meu top.slsarquivo, 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
Michael Mol
fonte
11
Pergunta bastante avançada sobre a pilha de sal, pergunta genuína de um usuário do Chef: eu tinha entendido o sal como um modelo push, como um nó (minion?) Se registrava? (Isso é apenas por curiosidade)
Tensibai
Faça isso como uma pergunta separada e vou ver se consigo reunir uma resposta satisfatória sem bater contra o meu NDA.
Michael Mol
É justo, mas minha última inspeção da pilha de sal não atendeu aos meus requisitos (especialmente nas caixas de janelas), então vou ver se consigo fazer algo imparcial e se realmente tenho tempo. Julgado como comentário apenas no caso de eu perdi alguma coisa :) óbvio
Tensibai
Ainda não tenho representante suficiente para conversar, então isso terá que ser feito. Mas, resumindo: um salt lions rodando em um nó usará o DNS para descobrir onde está seu mestre de salt e alcançará o mestre. O Mestre colocará a chave do lacaio em uma fila pendente até que alguém a aceite.
Michael Mol
11
Tanto quanto eu sei obras de bônus de associação para bate-papo, você tem muito mais de 20, de modo que este deve funcionar para DevOps bate-papo :) Obrigado pelos asseclas ponteiro pode pedir para se registar-se, eu tinha perdido esta abordagem
Tensibai

Respostas:

4

Este arquivo SLS modelado funciona esplendidamente:

{% if 'components' in salt.pillar.items() %}

include:
{% for component in salt.pillar.get('components').keys() %}
  - {{ component }}
{% endfor %}

{% endif %}

No entanto, é necessário alterar minha estrutura de chaves do pilar. Na pergunta original, você vê a estrutura como:

my-minion-id:
    ----------
    components:
        - a-dependency-name

Em vez disso, ele precisa ser:

my-minion-id:
    ----------
    components:
        ----------
        a-dependency-name:
            None

Observe que a-dependency-nameagora é um ditado e tem uma única chave / valor None,. Assim, o arquivo SLS do pilar precisa mudar de

components:
  - a-dependency-name

para

components:
  a-dependency-name: ~

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 os componentsvários pilares; cada pilar que o Salt aplicar substituirá a componentschave 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 componentsfica correta:

$ salt my-minion-id state.show_sls components
my-minion-id:
    ----------
    a-dependency-name:
      ----------
      ...

pillar.items()nos modelos Jinja acaba não sendo bem equivalente a salt.pillar.items(); se você tentar usar pillar.ls(), por exemplo, poderá ver o seguinte erro:

Rendering SLS 'base:components' failed: Jinja variable 'salt.pillar object' has no attribute 'ls'

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.

Michael Mol
fonte
3

Você também pode fazê-lo como:

{% if pillar['components'] is defined %}
include:
{% for component in pillar['components'] %}
 - {{ component }}
{% endfor %}
{% endif %}

{% if pillar['components'] is defined %}
components:
  require:
{% for component in pillar['components'] %}
 - {{ component }}
{% endfor %}
{% endif %}
brousch
fonte