Salt的网站上有两篇关于Pillar的文档(一,二),其中一篇内容不多,我以为写成一篇文章更合适。本文的逻辑结构没有参照官方文档,而是根据我本身对Pillar的理解组织内容,但愿可以把这个概念解释清楚。文中的示例代码来自官方文档。html
我只是SaltStack的初学者,若是文中有错误的地方,请不吝赐教。 在学习的过程,我作了一些实验,犯了很多错,积累了一些经验,对SaltStack的运行也有必定了解,若是有什么问题,或是不太理解的地方,很是欢迎留言交流!git
Pillar是Salt很是重要的一个组件,它用于给特定的minion定义任何你须要的数据,这些数据能够被Salt的其余组件使用。Salt在0.9.8版本中引入了Pillar。Pillar在解析完成后,是一个嵌套的dict结构;最上层的key是minion ID,其value是该minion所拥有的Pillar数据;每个value也都是key/value。apache
这里能够看出Pillar的一个特色,Pillar数据是与特定minion关联的,也就是说每个minion都只能看到本身的数据,因此Pillar能够用来传递敏感数据(在Salt的设计中,Pillar使用独立的加密session,也是为了保证敏感数据的安全性)。vim
-I
选项。默认状况下,master配置文件中的全部数据都添加到Pillar中,且对全部minion可用。若是要禁用这一默认值,能够在master配置文件中添加以下数据,重启服务后生效:安全
pillar_opts: False
Pillar使用与State类似的SLS文件。Pillar文件放在master配置文件中pillar_roots
定义的目录下。示例以下:session
pillar_roots: base: - /srv/pillar
这段代码定义了base环境下的Pillar文件保存在/srv/pillar/
目录下。与State类似,Pillar也有top file
,也使用相同的匹配方式将数据应用到minion上。示例以下:
/srv/pillar/top.sls:ssh
base: '*': - data - packages
/srv/pillar/packages.sls:学习
{% if grains['os'] == 'RedHat' %} apache: httpd git: git {% elif grains['os'] == 'Debian' %} apache: apache2 git: git-core {% endif %}
/srv/pillar/data/init.sls:网站
role: DB_master
这段代码表示,base环境中全部的minion都具备packages和data中定义的数据。Pillar采用与file server
相同的文件映射方式,在本例中,packages映射到文件/srv/pillar/packages.sls
,data映射到/srv/pillar/data/init.sls
。注意key与value要用冒号加空格分隔,没有空格的话将解析失败。ui
Pillar还可使用其余的匹配方式来选择minion,下面的例子中,servers只应用到操做系统是Debain的机器:
dev: 'os:Debian': - match: grain - servers
使用执行模块pillar。pillar模块有两个funtion:pillar.data和pillar.raw。示例以下:
# salt '*' pillar.data
在master上修改Pilla文件后,须要用如下命令刷新minion上的数据:
salt '*' saltutil.refresh_pillar
若是定义好的pillar不生效,建议刷新一下试试。
Pillar解析后是dict对象,直接使用Python语法,能够用索引(pillar['pkgs']['apache']
)或get方法(pillar.get('users', {})
)。详见下面的例子。
使用-I
选项表示使用Pillar来匹配minion.
salt -I 'role:DB*' test.ping
Pillar的key/value结构中的value能够是string,也能够是一个list。Pillar文件定义以下:
/srv/pillar/users/init.sls:
users: thatch: 1000 shouse: 1001 utahdave: 1002 redbeard: 1003
在top.sls中引用Pillar文件,对全部的minion应用users中的内容:
/srv/pillar/top.sls:
base: '*': - data - users
如今全部的minion都具备了users数据,能够在state文件中使用:
/srv/salt/users/init.sls:
{% for user, uid in pillar.get('users', {}).items() %} {{user}}: user.present: - uid: {{uid}} {% endfor %}
不一样的操做系统不只管理资源的方式不一样,软件包的名字、配置文件的路径也有有可能不同。Salt的执行模块屏蔽了系统管理资源的差别。其余的差别能够根据grains中的的os、cpuarch等信息来处理,这些条件判断能够写在State文件中,但会使得State文件的逻辑不清晰。Pillar能够很好地解决这个问题。下面的例子中,在不一样的os上安装对应的软件包,但state file彻底同样,不须要针对os做修改,灵活方便。
/srv/pillar/pkg/init.sls:
pkgs: {% if grains['os_family'] == 'RedHat' %} apache: httpd vim: vim-enhanced {% elif grains['os_family'] == 'Debian' %} apache: apache2 vim: vim {% elif grains['os'] == 'Arch' %} apache: apache vim: vim {% endif %}
/srv/pillar/top.sls:
base: '*': - data - users - pkg
/srv/salt/apache/init.sls:
apache: pkg.installed: - name: {{ pillar['pkgs']['apache'] }}
还能够在state file中设置默认值: srv/salt/apache/init.sls:
apache: pkg.installed: - name: {{ salt['pillar.get']('pkgs:apache', 'httpd') }}