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