Pillar是Salt设计的一个用于分发全局赋值到所有minion的接口。

Pillar数据以类似Salt State Tree相同的方式管理


不像State Tree,pillar数据只存在于那些符合匹配类型的的目标minion。这样可以用于在特定minion上存储一些敏感数据


在Salt Master的配置文件设置Pillar

#####         Pillar settings        #####
##########################################
# Salt Pillars allow for the building of global data that can be made selectively
# available to different minions based on minion grain filtering. The Salt
# Pillar is laid out in the same fashion as the file server, with environments,
# a top file and sls files. However, pillar data does not need to be in the
# highstate format, and is generally just key/value pairs.

pillar_roots:
  base:
    - /srv/pillar

这里的pillar_roots 路径不能是file_roots的一个子目录


/srv/pillar/top.sls 

base:
  '*':
    - packages


对所有minion匹配/srv/pillar/packages.sls

{% if grains['os'] == 'Redhat' %}
apache: httpd
git: git
{% elif grains['os'] == 'Debian' %}
apache: apache2
git: git-core
{% endif %}

company: Foo Industries

这里设置了一些pillar键值对,如果操作系统是CentOS,那么apache值设为httpd

这些pillar数据可以在modules,renderers或者State SLS文件中引用

apache:
  pkg.installed:
     - name: {{ pillar['apache'] }}



需要注意的是不能再pillar的top.sls文件中列出pillar的键值信息,而是pillar的键值信息写入到pillar文件中。

例如以下:

base:
  '*':
     - common_pillar


/srv/pillar/common_pillar.sls

foo: bar
boo: baz


如果多个pillar文件中的namespace相同,那么请求这个namespace的时只会返回其中一个

如/srv/pillar/top.sls的内容

base:
  '*':
    - packages
    - services


packages.sls

bind: bind9

services.sls


bind: named


这样,如果请求名叫bind的pillar将只会返回named

所以最好写成这样

packages:
  bind: bind9


Pillar Namespace Merges

可以将多个pillar文件中的内容合并为一个pillar key

例如以上的例子


/srv/pillar/top.sls 


base:
  '*':
    - packages
    - services


/srv/pillar/packages.sls

bind:
  package-name: bind9
  version: 9.9.5


/srv/pillar/services.sls

bind:
  port: 53
  listen-on: any


$ sudo salt-call pillar.get bind
local:
    ----------
    listen-on:
        any
    package-name:
        bind9
    port:
        53
    version:
        9.9.5

这里使用salt-call直接执行pillar.get



Pillar SLS文件可以包含pillar文件,类似于State SLS文件。有两种语法格式。simple form和full include form

include:
  - users


include:
  - users:
      defaults:
          sudo: ['bob', 'paul']
      key: users


可以使用pillar.items和pillar.raw查看各个minion端的pillar数据。

$ sudo salt '*' pillar.items
jidong-fileserver:
    ----------
    apache:
        httpd
    bind:
        ----------
        listen-on:
            any
        package-name:
            bind9
        port:
            53
        version:
            9.9.5
    company:
        Foo Industries
    git:
        git
gintama-qa-server:
    ----------
    apache:
        httpd
    bind:
        ----------
        listen-on:
            any
        package-name:
            bind9
        port:
            53
        version:
            9.9.5
    company:
        Foo Industries
    git:
        git
localhost.localdomain:
    ----------
    apache:
        httpd
    bind:
        ----------
        listen-on:
            any
        package-name:
            bind9
        port:
            53
        version:
            9.9.5
    company:
        Foo Industries
    git:
        git
jialebi-qa-server:
    ----------
    apache:
        httpd
    bind:
        ----------
        listen-on:
            any
        package-name:
            bind9
        port:
            53
        version:
            9.9.5
    company:
        Foo Industries
    git:
        git





pillar.get函数

pillar.get类似python字典的get函数

In [21]: a={"foo":{"bar":{"baz": "qux"}}}

In [22]: a.get("foo").get("bar").get("baz")
Out[22]: 'qux'
foo:
  bar:
    baz: qux


{{ pillar['foo']['bar']['baz'] }}
{{ salt['pillar.get']('foo:bar:baz', 'qux') }}


刷新pillar数据

当pillar数据在Master端改变时,minion端需要在本地刷新pillar数据。

salt '*' saltutil.refresh_pillar


使用pillar数据定位目标minion

salt -I 'somekey:specialvalue' test.ping


salt -I 'foo:bar:baz*' test.ping


在命令行设置pillar数据

设置一个字典

salt '*' state.highstate pillar='{"cheese": "spam"}'





为了方便,存储在Master端配置文件中的数据在所有的minion的pillar中可用。这使得有关服务和系统的全局配置相当方便,但是对于一些敏感数据又有安全隐患

可以设置不将Master的配置添加到pillar数据中


# The pillar_opts option adds the master configuration file data to a dict in
# the pillar called "master". This is used to set simple configurations in the
# master config file that can then be used on minions.
pillar_opts: False



默认情况下,如果引用一个pillar出错,详细错误信息会被隐藏,取而代之的是:

Rendering SLS 'my.sls' failed. Please see master log for details.





参考文章:

http://docs.saltstack.com/en/latest/topics/pillar/index.html