Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Should I always use pillar.get instead of pillar['foo']?

Tags:

salt-stack

I see in the pillar documentation that there are two ways to reference pillar data in an SLS.

{{ pillar['foo'] }}

and

{{ salt['pillar.get']('foo') }}

The pillar.get method handles nested pillar data better and allows to specify a default if the data isn't found in the pillar. But it's a bit more typing and I find the first method easier to read.

So, is it considered best practice to always use the pillar.get method or is using the pillar['foo'] acceptable, especially when dealing with non-nested pillar data.

I suspect always using the pillar.get method is best since it make sense to use it when dealing with nested pillar data or you want to set a default. And it's best to just you one method consistently. But I wanted to get other people's thoughts.

like image 304
NimbusScale Avatar asked Jun 07 '15 19:06

NimbusScale


People also ask

What are SaltStack pillars?

Salt Pillar Explained Salt pillar is a system that lets you define secure data that are 'assigned' to one or more minions using targets. Salt pillar data stores values such as ports, file paths, configuration parameters, and passwords.


2 Answers

I use pillar['foo'] for "required" options, as Utah_Dave suggests. I use salt['pillar.get']('foo', 'default') for options that have a sane default. There are a couple other variations that are interesting.

One is salt['defaults.get']('foo'), which allows you to keep your state's default values in a separate file. Very useful if you have a lot of possible pillar variables, most or all of which have default values. (NOTE: the behavior of defaults.get has changed since I wrote this, see this answer for other options)

A second is that it is possible to alias salt['pillar.get'] (and other functions of the same sort) so that they are less of a nuisance to type and read:

{%- set pget = salt['pillar.get'] %}
{%- set dget = salt['defaults.get'] %}
{%- set mget = salt['mine.get'] %}
{{ pget("foo1", "default1") }}
{{ pget("foo2", "default2") }}
{{ dget("foo3") }}
{{ dget("foo4") }}
...and so on.

That last variation in particular (dget) works wonders for readability in heavily-customizable states.

like image 132
Andrew Avatar answered Sep 18 '22 18:09

Andrew


I agree that the shorter syntax looks nicer.

In states that I build, I tend to use the {{ pillar['foo'] }} syntax when I'm referencing a value that ABSOLUTELY must be there for my state to work correctly. In that case, I do want a failure to happen.

Then with other values where I need to traverse nested data, or if I want to use a default value, I use the longer syntax.

In the end, it's mostly personal preference. None of them is more correct than another.

like image 37
Utah_Dave Avatar answered Sep 18 '22 18:09

Utah_Dave