How to join two Salt pillar files and merge data?

Tomáš Fejfar picture Tomáš Fejfar · Jul 8, 2014 · Viewed 11.8k times · Source

Is there any way to join two pillar files?

I have a users pillar. It's something like:

users:
  joe:
    sudouser: True
  jack:
    sudouser: False

Now I need different set of users for certain servers (ie. add some users to one server). So I create new pillar file:

users:
  new_user:
    sudouser: True

And assign this topfile to the server. But because the key is the same it would overwrite the first one. If I change it I would need to update the state file (which I really don't want). How should I approach this problem? Is there any way to tell salt to "merge" the files?

Answer

uvsmtid picture uvsmtid · Nov 22, 2014

It is possible at least according to the latest Salt documentation about pillar (as of 5188d6c) which states:

With some care, the pillar namespace can merge content from multiple pillar files under a single key, so long as conflicts are avoided ...

I tested it under Salt Helium (2014.7.0) and it's working as expected.


Your Example

Pillar file user_set_a.sls:

users:
  joe:
    sudouser: True
  jack:
    sudouser: False

Pillar file user_set_b.sls:

users:
  new_user:
    sudouser: True

Run pillar.items to confirm that all users are merged under the same users key:

salt-call pillar.items
...
    users:
    ----------
    jack:
        ----------
        sudouser:
            False
    joe:
        ----------
        sudouser:
            True
    new_user:
        ----------
        sudouser:
            True
...

See also: