盐态不能与 pillardata 结合使用

Salt state not working in combination with pillardata

我有以下盐状态:

freeradius:
  pkg.installed

radiusgroup:
  group.present:
    - name: radiusadm
    - gid: 666

{% for user, args in pillar['users'].items() %}
  {% if ( user not in pillar['absents'] ) and ( 'radiuspassword' in args ) %}
  shadow_hash_{{ user }}:
    user.present:
      - name: {{ user }}
      - password: {{ args['radiuspassword'] }}
  {% endif %}  
{% endfor %}

并拥有以下支柱

groups:
  radiusd:
    gid: 95

users:
  user1:
    radiuspassword: 'password1'
  user2:
    radiuspassword: 'password2'

absents:
  a2user1:
  a2user2:

我想让这段代码工作,我收到消息:

Data failed to compile:

State 'radiusgroup' in SLS 'radiusd' is not formed as a list

请告诉我如何从这里开始,提前谢谢你。

我认为问题出在 pillar 的声明中。 forif 块中的状态文件缩进也可能会导致问题。该错误指出 radiusgroup 未形成为列表。所以我们应该形成一个列表 groups.

示例支柱:

groups:
  - name: radiusd
    gid: 95

users:
  - name: user1
    radiuspassword: password1
  - name: user2
    radiuspassword: password2

absents:
  - a2user1
  - a2user2

请注意,我也对用户列表使用了类似的结构。然后我们可以将状态文件设为:

{% for group in pillar['groups'] %}
radiusgroup_{{ group.name }}:
  group.present:
    - name: {{ group.name }}
    - gid: {{ group.gid }}
{% endfor %}

{% for user in pillar['users'] %}
{% if (user.radiuspassword is defined) and (user.name not in pillar['absents']) %}
shadow_hash_{{ user.name }}:
  user.present:
    - name: {{ user.name }}
    - password: {{ user.radiuspassword }}
{% endif %}
{% endfor %}

如果 pillar 在您的控制之下,最好 完全 定义它。这样您就可以避免在状态文件中使用复杂的 Jinja 表达式。