pillar 组件
pillar 也是 Saltstack 最重要的组件之一,其作用是定义与被控主机相关的任何数据,定义好的数据可以被其他组件使用,如模板、state、API 等。在 pillar 中定义的数据与不同业务特性的被控主机相关联,这样不同被控主机只能看到自己匹配的数据,因此 pillar 安全性很高,适用于一些比较敏感的数据,这也是区别于 grains 最关键的一点,如定义不同业务组主机的用户id、组id、读写权限、程序包等信息,定义的规范是采用 Python 字典形式,即键/值,最上层的键一般为主机的 id 或组名称。下面详细描述如何进行 pillar 的定义和使用。
pillar的定义
-
主配置文件定义
Saltstack 默认将主控端配置文件中的所有数据都定义到 pillar 中,而且对所有被控主机开放,可通过修改 /etc/salt/master 配置中的 pillar_opts: Ture 或 False 来定义是否开启或禁用这项功能,修改后执行 salt '*' pillar.data 来观察效果。图 10-12 为 pillar_opts: Ture 的返回结果,以主机 “SN2013-08-022” 为例,执行 salt 'SN2013-08-022' pillar.data。
Figure 1. 图10-12 主机所有pillar信息(部分截图) -
SLS 文件定义 pillar 支持在 sls 文件中定义数据,格式须符合 YAML 规范,与 Saltstack 的 state 组件十分相似,新人容易将两者混淆,两者文件的配置格式、入口文件 top.sls 都是一致的。下面详细介绍 pillar 使用 sls 定义的配置过程。
(1) 定义pillar的主目录
修改主配置文件 /etc/salt/master 的 pillar_roots 参数,定义 pillar 的主目录,格式如下:
pillar_roots: base: - /srv/pillar同时创建 pillar 目录,执行命令:install -d /srv/pillar。
(2) 定义入口文件top.sls
入口文件的作用一般是定义 pillar 的数据覆盖被控主机的有效域范围,“*” 代表任意主机,其中包括了一个 data.sls 文件,具体内容如下:
pillar/top.slsbase: '*': - datapillar/data.slsappname: website flow: maxconn: 30000 maxmem: 6G(3) 校验pillar
通过查看 “N2013-08-022” 主机的 pillar 数据,可以看到多出了 data.sls 数据项,原因是我们定义 top.sls 时使用 “*” 覆盖了所有主机,这样当查看 “SN2013-08-022” 的 pillar 数据时可以看到我们定义的数据,如图10-13所示,如果结果不符合预期,可以尝试刷新被控主机 pillar 数据,运行 salt '*'saltutil.refresh_pillar 即可。
Figure 2. 图10-13 返回主机pillar的信息
pillar的使用
完成 pillar 配置后,接下来介绍使用方法。我们可以在 state、模板文件中引用,模板格式为 {{ pillar变量 }},例如:
{{ pillar['appname'] }}(一级字典)
{{ pillar['flow']['maxconn'] }}(二级字典)或{{ salt['pillar.get']('flow: 'maxconn', {}) }}
Python API 格式如下:
pillar['flow']['maxconn']
pillar.get(' flow:appname', {})
-
操作目标主机
见10.5.1节,通过 -I 选项来使用 pillar 来匹配被控主机:
# salt -I 'appname:website' test.ping SN2013-08-021: True SN2013-08-022: True -
结合grains处理数据的差异性
首先通过结合 grains 的 id 信息来区分不同 id 的 maxcpu 的值,其次进行引用观察匹配的信息,延伸 “10.5.1 pillar的定义” 的例子,将 data.sls 修改成如下形式,其中,“if … else …endfi” 为 jinja2 的模板语法,更多信息请访问 jinja2 官网语法介绍,网址为 http://jinja.pocoo.org/docs/templates/ 。
appname: website
flow:
maxconn: 30000
maxmem: 6G
{% if grains['id'] == 'SN2013-08-022' %}
maxcpu: 8
{% else %}
maxcpu: 4
{% endif %}
通过查看被控主机的 pillar 数据,可以看到 maxcpu 的差异,如图10-14所示。