Saltstack load pillar in a for loop

11,640

Your loop should also look like:

{% for user, args in pillar.get('ftpusers', {}).items() %}

Also, contents argument for a file.managed doesn't support templating. What you need to do is move /srv/herma-ftp/.ftpusers state outside of the loop, and make the loop inside the file template. The final layout of your state should look like:

/srv/herma-ftp/.ftpusers
  file.managed:
    source: salt://ftpserver/dot.ftpusers
    template: jinja
    ...
    ...

{% for user, args in pillar.get('ftpusers', {}).items() %}

/srv/herma-ftp/{{user}}:
  file.managed:
    ...

{% endfor %}

And your ftpserver/dot.ftpusers would look like:

{% for user, args in pillar.get('ftpusers', {}).items() %}
{{ user }}:{{ args['passhash'] }}:{{args['uuid'] }}:{{ args['guid'] }}::{{ args['home'] }}:{{ args['shel'] }}
{% endfor %}
Share:
11,640
feb992
Author by

feb992

Updated on June 08, 2022

Comments

  • feb992
    feb992 almost 2 years

    I am developing a automatic proftd installation whit Salt, i wont to get the ftp users from a template but I cant get work the pillar, i initialized the pillar whit the users data and call it into a for loop, but you don't get the pillar user data in the loop.

    When i make salt-call pillar.get ftpusers in the minion, the response is:

    local:

    This is my pillar ftpusers.sls:

    ftp-server.ftpusers:
      user:
        - user: user
        - passhash: j2k3hk134123l1234ljh!"·$ser
        - uuid: 1001
        - guid: 1001
        - home: /srv/ftp/user
        - shel: /bin/false
    

    And this is the for loop:

    {% for users in pillar.get('ftpusers', {}).items() %}
    
      /srv/herma-ftp/.ftpusers:
        file.managed:
          - user: root
          - group: root
          - mode: 444
          - contents:'{{ user }}:{{ args['passhash'] }}:{{args['uuid'] }}:{{ args['guid'] }}::{{ args['home'] }}:{{ args['shel'] }}'
          - require:
            - file: /srv/herma-ftp
    
      /srv/herma-ftp/{{user}}:
        file.directory:
          - user: nobody
          - group: nobody
          - dir_mode: 775
          - makedirs: True
          - require:
            - file: /srv/herma-ftp
          - watch:
            - file: /srv/herma-ftp
        module.run:
          - name: file.set_selinux_context
          - path: {{ args['home']}}
          - type: public_content_t
          - unless:
            - stat -c %C {{ args['home'] }} |grep -q public_content_t
    
    {% endfor %}
    

    When I make in the minion

    salt-call -l debug state.sls herma-ftp-server saltenv=My-enviroment test=True
    

    Don't expect this for because don't can get the pillar data.