pillar的介绍
pillar是一个用于管理可以分发到minion端的全局数据的接口。它管理数据的方式和grains类似,同样要一个topfile文件,topfile文件里面的结构也是和grains一样。既然是分发给minion嘛,那就说明数据是放在master上的。既然是分发嘛,那肯定可以指定哪些minion有,那些没有,这样就使得一些敏感数据不会乱发给不必要的minion上去,也只有指定的minion可以访问被pillar允许它访问的那些数据信息。
我们按照步骤的形式把pillar走一遍,同时会告知一些注意事项;
第一步,master启用pillar
在默认情况下pillar是没有被启用的,启用方式和grains的启用方式类似。在配置文件配置内容如下(默认配置文件会带有这些内容,只不过被注释了,取消注释即可)
pillar_roots:
base:
- /srv/pillar
注:这个结构很熟悉吧,和grains的启用结构类似,我简要解释一下:
启用pillar接口功能,新建一个名为base的环境,环境关联的目录有:/srv/pillar。
注: 它可以关联多个目录,但是注意所有相关目录综合的文件中只能有一个topfile文件。
注: base是一个我定义的环境名称,可以定义多个,但是官方建议一个就够了,除非有啥
幺蛾子的情况非得要多个环境,否则一个就够;grains也一样,不要虐自己。
注意:官方警告: pillar指定的base环境的目录不能是grains启用后grains目录下的子目录。
第二步,新建并查看topfile文件
你会发现和grains的topfile几乎一样!!内容和文件名如下:
vi /srv/pillar/top.sls
base:
'*':
- packages
解释:
第一行就是打开文件的命令,我就不多说了,没目录没文件自己新建。
base 指的就是base环境,我在启用pillar的时候不就定义了一个base环境嘛,这里就开始用这个环境名了。
'*' 指的就是匹配所有minion
- packages 指的就是一个名为packages.sls文件,它在哪里?这是由启用pillar时定义base这个环境的时候所指定的目录决定的,只要它在指定的目录里就可以了。
整句解读:所有的minion都可以在package.sls文件中得到数据。
第三步:pillar的topfile的运用简介:
第一种:可以和grains连用:
base:
'os:Debian':
- match: grain
- servers
解释:
base 指明是一个名为base的环境
'os:Debian' 指明os的value要是Debian
- match: grain 上面说的os这个key来源哪里,就是这里说的,要从grains这个模块里面拿os这个键值对。注意最后没有s
- servers 上面(above)说过了我就不解释了
注意:从安全角度上将,使用grains中的key来匹配minion是不安全的,因为它可以被认为改变,如果一定要用grains的key的话。官方建议对于敏感数据或者敏感动作,最好使用grians的ID,这个ID就是标记minion的。如果ID发生变化,那么minion对master来讲是不可信任的,要重新使master信任minion。
第二种: 忽略没有的sls文件
base:
'*':
- servers
- systems
- ignore_missing: True
解释:
- ignore_missing: True 这个就是表示ignore_missing的值为True,默认是false;
干嘛用呢?如果上面指定的servers.sls或者systems.sls不存在,pillar运行的时候会跳过去,并且在_errors这个key中不过有任何提示。如果不指定,默认是false的话,pillar会在_errors中有提示,就会说某个sls不可用。
注:这个_errors这个key会在pillar使用的时候出现。
第四步:注意事项
pillar的键值对不能放在topfile中,建议每一个minion对应一个pillar的文件。
如果在多个pillar的sls中存在多个同名的键值对,那么同名键值对的值被取到的是哪个,就要看同名所在的sls在topfile中的陈列方式。只有处于最后一个陈列的同名key所在的文件中的这个key的value才会被取用。
举个例子:
cat top.sls
base:
'*':
- packages
- services
cat psckages.sls
bind: bind9
cat services.sls
bind: named
解释:services在packages的后面,所以bind的值就是named,而不是bind9;所以最后minion拿到的bind这个key的值就是named了。
第五步: pillar数据的使用
取数据操作
pillar.get pillar.item pillar.raw
手动刷新数据
saltutil.refresh_pillar
运行states 或者使用pillar.items的时候会触发pillar数据的重新编译。但是get,item,raw不会看到最新的数据,它们只会看到内存中的数据,只有states可以看到。之后运行手动刷新数据的指令后,get,item,raw才会看到最新的数据。