在今天我们介绍使用pillar进行参数化sls的方法,以及pillar数据结构设计的一般模式。
案例如下:
为通过saltstack部署的mariadb提供个性化配置
在salt中,主要使用pillar来存储动态信息。在sls中,在第一次渲染中提取出动态信息的值,编译成sls的执行指令进行第二道程序执行。
/srv/salt/services/mariadb/init.sls
|
|
我们把所有mariadb有关的的任务,都放在services.mariadb下面。 如果有其他额外的复杂功能,比如监控相关的,就在include下面直接链接即可。/etc/my.cnf.d/server.cnf
这个文件引用了一个jinja的模版,我们用这个jinja模版实现了动态的配置参数,如下
/srv/salt/services/mariadb/templates/server.cnf
|
|
我们在模版中,我们先从pillar中取出mariadb的嵌套数据,并根据需要的值在其中获取数据。对于每个pillar中的数据,我们都赋予一个默认值,这样在没有额外设置pillar的情况,就和静态版本的一致。
注意到innodb_buffer_pool_size这个键的值,并不是在pillar中决定的,而是取自grains。对于根据系统情况决定的参数,都可以通过grain传进来。
在这个模版做好以后,如果有变化部署的需求。我们可以将mariadb的参数的pillar赋予给对应的主机,来实现主机指定参数。
以下几个实现方案都是不错的。
- 用户通过执行salt-call state.sls services.mariadb pillar=”{‘k’: ‘v’}”的方式调用。这适用于一次性的个性化部署,无需salt管理员介入
- 假设我们为一个项目或主机部署,那么我们在这台主机的pillar中设置mariadb的子参数
- 我们可以使用pillar extension,比如基于rdbms或是etcd等的。可以单独设计UI,并和salt系统集成起来,实现paas平台
无论怎样,我们都需要预留pillar中mariadb的key的位置,保留给该任务使用。假设我们常用的有几套参数,那么我们可以在pillar中按照名称放置几个参数组,例如创建目录/srv/pillar/mariadb/
,在这个下面放置parm_group1
,parm_group2
等参数组,再把特定的参数组同主机关联起来即可实现参数组的享元。
总结
任务设计的模式,主要取决于你想如何使用这个自动化任务。
任务设计的复杂程度,取决于应用场景的复杂成都。
在今天这个场景中,该部署任务主要适用于执行半自动部署,也就是手工调用salt xx state.sls services.mariadb
或者salt-call state.sls services.mariadb
或者在其他自动化任务中通过include该任务执行部署的场景。