including grain data when querying pillar in salts

2019-09-07 03:22发布

问题:

I have a state using file.managed, which generates a config file via a jinja for loop from a key in pillar.

My pillar looks like this:

configuration:
  server01:
    key1: value1
    key2: value2
  server02:
    key03: value03
    key04: value04

and the managed file:

{% set kv = pillar['configuration']['server01'] %}
{% for key, value in kv.iteritems() %}
{{ key }}:{ value }};
{% endfor %}

The way I differentiate between different servers right now in my state file is

config:
  file.managed:
    - name: /etc/config.conf
    - source: salt://files/{{ grains['id'] }}.conf.jinja
    - template: jinja

but this is less than ideal, since I have to create an almost identical file for every server.

Is there a way to dynamically replace server01 with the ID of the actual server, something like

{% set kv = pillar['configuration']['{{ grains[id''] }}'] %}

The goal is to generally limit the necessary changes only to the corresponding pillar file, when adding a new server, so other suggestions are also welcome too.

回答1:

i think you should use pillar info in your state file.
your state file like bellow :

{% if grains['id'] in pillar['configuration'] %}
{% set nodeinfo = pillar['configuration'][grains['id']] %}
config:
  file.managed:
    - name: /etc/config.conf
    - source: salt://conf.jinja
    - template: jinja
    - defaults :
      nodeinfo: {{nodeinfo}}
{% endif %}

then, conf.jinja:

{% for key, value in nodeinfo.iteritems() -%}
{{ key }}:{{ value }};
{% endfor -%}

i hope that will solve your problem, thanks.