我应该始终使用 pillar.get 而不是 pillar['foo'] 吗?

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

我在支柱文档中看到有两种方法可以在 SLS 中引用支柱数据。

{{ pillar['foo'] }}

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

pillar.get 方法可以更好地处理嵌套的支柱数据,并允许在支柱中找不到数据时指定默认值。但是打字有点多,我发现第一种方法更容易阅读。

那么,始终使用 pillar.get 方法还是使用 pillar['foo'] 是可以接受的最佳实践,尤其是在处理非嵌套 pillar 数据时。

我怀疑总是使用 pillar.get 方法是最好的,因为在处理嵌套的支柱数据或您想设置默认值时使用它是有意义的。最好始终只使用一种方法。但是我想知道别人的想法。

我同意更短的语法看起来更好。

在我构建的状态中,当我引用一个值时,我倾向于使用 {{ pillar['foo'] }} 语法,该值绝对必须存在才能使我的状态正常工作。在那种情况下,我确实希望失败发生。

然后我需要遍历嵌套数据的其他值,或者如果我想使用默认值,我使用更长的语法。

归根结底,这主要是个人喜好。 None 个比另一个更正确。

你想使用 pillar.get 的原因是你可以指定一个默认值,以防支柱无法获得任何东西。

salt['pillar.get']('element', 'default')

我使用 pillar['foo'] 作为 "required" 选项,正如 Utah_Dave 所建议的那样。我将 salt['pillar.get']('foo', 'default') 用于具有合理默认值的选项。还有其他一些有趣的变体。

一个是 salt['defaults.get']('foo'),它允许您将州的默认值保存在一个单独的文件中。如果您有很多可能的支柱变量,并且其中大部分或全部都有默认值,则非常有用。 (注意:自从我写这篇文章后 defaults.get 的行为发生了变化,请参阅 了解其他选项)

第二个是可以为 salt['pillar.get'](以及同类的其他函数)设置别名,这样它们在输入和阅读时就不那么麻烦了:

{%- 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.

特别是最后一个变体 (dget) 在高度可定制的状态下的可读性创造了奇迹。

您还可以为第一个变体指定默认值:

{{ pillar['foo'] | default('bar') }}

你可以简单地做 {{ pillar.foo }}.

对于默认值,{{ pillar.foo|default('your default') }}