Should I always use pillar.get instead of pillar['foo']?
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.
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.