速云科技

SaltStack数据系统之Pillar

1.1.1   什么是Pillar?

和Grains一样,Pillar也是SaltStack非常重要的一个组件,Salt在0.9.8版本中引入了Pillar。它用于给特定的Minion定义任何你需要的数据,这些数据也是可以被Salt的其他组件所使用的。从这个概念看,Pillar和Grains似乎是一样的。其实它们是不同的设计,同时也应用于不同的场景。

默认系统内置了一些Pillar。可以通过以下命令查看:

[root@master ~]# salt ‘*’ pillar.items

minion.example.com:

———-

master:

———-

auth_mode:

1

auto_accept:

False

cachedir:

/var/cache/salt/master

client_acl:

———-

client_acl_blacklist:

———-

cluster_masters:

cluster_mode:

paranoid

conf_file:

/etc/salt/master

(省略后面输出…)

通过上面的输出,我们看到Pillar在解析完成后,是一个嵌套的dict结构。最上层的key是Minion ID,其value是该Minion所拥有的Pillar数据;每一个value也都是key/value这样的数据结构。

Pillar应用场景

Pillar数据是与特定Minion相对应的,也就是说每一个Minion都只能看到自己的数据,所以Pillar可以用来传递敏感数据,所以Pillar主要应用于以下场景:

  • 敏感数据

例如一些配置文件中的用户名和密码,比如MySQL的用户名和密码等,由于Pillar使用独立的加密session,可以确保这些敏感数据不被其他minion看到。

  • 变量

可以在Pillar中处理平台差异性,比如使用Grains获取操作系统版本,然后针对不同的操作系统设置软件包的名字(比如Apache在CentOS中是httpd),然后在State中引用。

  • 其他任何数据

可以在Pillar中添加任何需要用到的数据。比如定义用户和UID的对应关系,Minion的角色等。

  • 用在匹配Minion

和Grains一样,Pillar可以用来选择minion,使用-I选项。

1.1.2   定义Pillar数据

Pillar的使用Grains不同,需要手动设置。配置方法与State管理。需要先在master配置文件中定义pillar_roots.

同时,默认情况下,master配置文件中的所有数据都添加到Pillar中,且对所有minion可用。如果要禁用这一默认值,可以在master配置文件中添加如下数据,重启服务后生效:

pillar_opts: False

第一步:定义pillar_roots:

Pillar使用与State相似的SLS文件。Pillar文件放在master配置文件中pillar_roots定义的目录下。

[root@master ~]# vim /etc/salt/master

pillar_roots:

base:

– /etc/salt/pillar

这段代码定义了base环境下的Pillar文件保存在/etc/salt/pillar/目录下。创建该目录

[root@master ~]# mkdir /etc/salt/pillar

第二步:定义Top File

与State相似,Pillar也有top file,也使用相同的匹配方式将数据应用到minion上。示例如下:

[root@master ~]# vim /etc/salt/pillar/top.sls

base:

‘*’:

– apache

上面这个SLS指定了base环境中所有的Minion都具有apache定义的数据。Pillar采用与file server相同的文件映射方式,上面的例子会把apache映射到文件/etc/salt/pillar/apache.sls。

除了上面普通的映射方法外,Pillar还可以使用其他的匹配方式来选择Minion,下面的例子中,rsyslog只应用到操作系统是CentOS-6的机器,因为从CentOS6开始。Syslog变成了Rsyslog:

base:

‘ osfinger: CentOS-6’:

– match: grains

– rsyslog

第三步:编写Pillar SLS

[root@master ~]# vim /etc/salt/pillar/apache.sls

{% if grains[‘os’] == ‘RedHat’ %}

apache: httpd

{% elif grains[‘os’] == ‘Debian’ %}

apache: apache2

{% endif %}

这个是使用Jiajia模板定义的Pillar。同时使用了Grains来进行条件判断。Jinjia相关的知识在讲解配置管理State的时候会详解讲解。现在需要注意key与value之间需要用冒号加空格分隔,没有空格的话将解析失败。

第四步:刷新Pillar数据

在日常使用的过程中,如果我们在Master上修改Pillar文件后,需要用以下命令刷新minion上的数据:

[root@master ~]# salt ‘*’ saltutil.refresh_pillar

所以说如果定义好的pillar不生效,可以刷新一下试试。

1.1.3   Pillar常用操作

查看目前Minion上的Pillar

[root@master ~]# salt ‘*’ pillar.raw

使用pillar.raw查看的是目前正在使用的。也就是目前正存在于Minion端的Pillar数据。而使用pillar.items会刷新后重新加载的Pillar。所以你如果添加了Pillar,可以使用该方法查询。

[root@master ~]# salt ‘*’ pillar.items

1.1.4   Pillar使用案例

匹配Minion

使用-I选项表示使用Pillar来匹配Minion.。

salt -I ‘role:nginx’ test.ping

在Pillar中使用列表

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文件中使用:

或get方法(pillar.get(‘users’, {}))。

 

/srv/salt/users/init.sls:

{% for user, uid in pillar.get(‘users’, {}).items() %}

{{user}}:

user.present:

– uid: {{uid}}

{% endfor %}

处理平台差异

在我们的企业生产环境中,可能存在着不同的操作系统,比如CentOS和Ubuntu。那么不同的操作系统不仅管理的方式不同,同时软件包的名字、配置文件的路径也有一些是不一样的。

我们可以根据Grains中相关信息的来处理,但是如果这些条件判断如果都写在State文件中,但会使得State文件比较杂乱,而且逻辑也会不清晰,所以可以将这些判断逻辑写在Pillar中。

就像上面提到的Pillar的基本使用案例中,在不同的操作上安装对应的软件包,但state file完全一样

/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:

Pillar解析后是dict对象,直接使用Python语法,可以用索引(pillar[‘pkgs’][‘apache’])

 

apache:

pkg.installed:

– name: {{ salt[‘pillar.get’](‘pkgs:apache’, ‘httpd’) }}

欢迎留言