How do I pass parameters to a salt state file?

If you really want to pass in the data on the command like you can also do it like this:

{{ pillar['name'] }}:
  group.present:
    - gid: {{ pillar['gid'] }}
    - system: True

Then on the command line you can pass in the data like this:

salt 'SaltStack-01' state.sls group pillar='{"name": "awesome", "gid": "123456"}'

You use Pillars to create "dictionaries" that you can reference into State files. I'm not sure if I'm understanding you correctly, but here's an example of what you can do:

  1. mkdir /srv/pillar/

  2. Create /srv/pillar/groups.sls and paste something like this into it:

    groups:
      first: 1234
      second: 5678
    

    These are names and GIDs of the groups you want to create.

  3. Create /srv/pillar/top.sls so you can apply this pillar to your minions. This is very similar to a salt top file, so you can either apply it to all minions ('*') or just the one ('SaltStack-01'):

    base:
      'hc01*':
        - groups
    

    To test that that has worked, you can run salt '*' pillar.items and you should find the groups pillar somewhere in the output.

  4. Now, your /srv/salt/group.sls file should look like this:

    {% for group,gid in pillar.get('groups',{}).items() %}
    {{ group }}:
      group.present:
        - gid: {{ gid }}
    {% endfor %}
    

    This is a for loop: for every group and gid in the pillar groups, do the rest. So basically, you can look at it as if the state file is running twice:

    first:
      group.present:
        - gid: 1234
    

    And then:

    second:
      group.present:
        - gid: 5678
    

This was incorporated from this guide.


if you do not want use Pillar
you can do as:

# /srv/salt/params.yaml

name: awesome
gid: 123456

and then:

# /srv/salt/groups.sls

{% import_yaml "params.yaml" as params %}

{{ params['name'] }}:
  group.present:
    - gid: {{ parmas['gid'] }}
    - system: True

more details:doc