目录
5.1 列出对应 minion 上所有 Pillar 的详细信息
6.1 首先建立目录,然后为每个 minion 编写对应的 SLS 文件
三、用 Jinja2 配合 Grain 和 Pillar 扩展 SLS 配置文件
四、用 Jinja2 配合 Grains 和 Pillar 动态下发配置文件
1.4 查看 syq-snakenx-02 上下发的配置文件
1.7 查看 syq-snakenx-02 上下发的配置文件
一、Jinja2 模板语言基础
如果遇到一些更复杂的情况,比如对不同操作系统安装软件,根据主机的 CPU 数量、内存等动态生成软件的配置文件等,这一切都需要 Jinja2 以及 Grain 和 Pillar 的辅助。
Jinja2 一个强大的 Python 模板引擎,可以使用代码动态生成内容创建文件内容,其在 Flask 和 Django 框架中的使用最为知名。
Jinja2 官方文档:http://docs.jinkan.org/docs/jinja2/templates.html
1、Jinja2 变量
Jinja2 模板包含变量和表达式:变量用{{}}包围,表达式用{%%}包围。
举个栗子:
vim var.sls |
---|
|
运行查看 Jinja2 变量的输出:
# salt 'syq-snakenx-02.lehe.com' state.sls var |
---|
|
2、流程控制语句
For
遍历列表中的每一项。例如,要显示一个由 users 变量提供的用户列表:
|
变量字典:
|
与 Python 中不同,模板中的循环内不能有 bread 或 continue。但是可以在迭代中过滤序列来跳过项目。下面的例子中调过来所有影藏的用户:
|
if
Jinja2 中的 if 语句类似 Python 中的 if 语句。在最简单的形式中,可以测试一个变量是否未定义,为空或 false:
|
像在 Python 中一样,用 elif 和 else 来构建多个分支。
|
二、Grain 和 Pillar 的概念及设置
1、Grain 的概念
Grains是Saltstack最重要的组件之一,grains的作用是收集被控主机(minion)的基本信息,这些信息通常都是一些静态的数据,包括CPU、内核、操作系统、虚拟化等,在服务器端可以根据这些信息进行灵活定制,管理员可以利用这新信息对不同业务进行个性化配置。
2、Grain 相关的基本命令
master 端列出所有 minion 上的 Grains 项: |
---|
|
查询 minion 上某一具体 Grain 的值:
master 端 |
---|
|
3、设置 Grains 数据
Salt提供了很多默认的 Grains 数据,基本可以满足大多数需求,但是有些场景还是需要用户自定义 Grains 数据,以下是几种常见设置方式:
3.1 命令行方式
单个值设置 |
---|
|
多个值设置 |
---|
|
列表结构设置 |
---|
|
设置成功后通过下面的命令可进行查询:
# salt 'syq-snakenx-02.lehe.com' grains.item my_grain
syq-snakenx-02.lehe.com:
----------
my_grain:
bar
# salt 'syq-snakenx-02.lehe.com' grains.item key01
syq-snakenx-02.lehe.com:
----------
key01:
val01
# salt 'syq-snakenx-02.lehe.com' grains.item key02
syq-snakenx-02.lehe.com:
----------
key02:
val02
# salt 'syq-snakenx-02.lehe.com' grains.item my_grain_dict
syq-snakenx-02.lehe.com:
----------
my_grain_dict:
- one
- two
- three
查看对应的 minion 的 /etc/salt/grains 可以发现已经写入的 Grains 数据:
# salt 'syq-snakenx-02.lehe.com' cmd.run 'cat /etc/salt/grains'
syq-snakenx-02.lehe.com:
key01: val01
key02: val02
my_grain: bar
my_grain_dict:
- one
- two
- three
3.2 grains_module 的方式设置
首先在 master 端上建立模块对应的目录:
# mkdir -pv /srv/salt/_grains
mkdir: created directory `/srv/salt/_grains'
然后写入一个 简单的模块,和之前自定义模块的编写方法一下:
vim /srv/salt/_grains/my_grain_mod.py |
---|
|
然后同步模块到 minion:
# salt 'syq-snakenx-02.lehe.com' saltutil.sync_all
syq-snakenx-02.lehe.com:
----------
beacons:
engines:
grains:
- grains.my_grain_mod
log_handlers:
modules:
output:
proxymodules:
renderers:
returners:
sdb:
states:
utils:
重载一次模块:
# salt 'syq-snakenx-02.lehe.com' sys.reload_modules
syq-snakenx-02.lehe.com:
True
查看新设置的 Grains:
# salt 'syq-snakenx-02.lehe.com' grains.item now
syq-snakenx-02.lehe.com:
----------
now:
1560257343.479697
3.3 在 minion 端设置
vim /etc/salt/minion.d/grain.conf |
---|
|
然后重启 salt-minion 加载新配置文件:
minion 端 |
---|
|
查看 Grains:
master 端 |
---|
|
3.4 删除自定义 Grains
通过 grains.setval 设置的 Grain 可以直接通过下面的命令删除:
# salt 'syq-snakenx-02.lehe.com' cmd.run 'cat /etc/salt/grains'
syq-snakenx-02.lehe.com:
key01: val01
key02: val02
my_grain: bar
my_grain_dict:
- one
- two
- three
# salt 'syq-snakenx-02.lehe.com' grains.delval my_grain
syq-snakenx-02.lehe.com:
None
# salt 'syq-snakenx-02.lehe.com' cmd.run 'cat /etc/salt/grains'
syq-snakenx-02.lehe.com:
key01: val01
key02: val02
my_grain: null
my_grain_dict:
- one
- two
- three
# salt 'syq-snakenx-02.lehe.com' grains.delval key01
syq-snakenx-02.lehe.com:
None
# salt 'syq-snakenx-02.lehe.com' cmd.run 'cat /etc/salt/grains'
syq-snakenx-02.lehe.com:
key01: null
key02: val02
my_grain: null
my_grain_dict:
- one
- two
- three
# salt 'syq-snakenx-02.lehe.com' grains.delval key02
syq-snakenx-02.lehe.com:
None
# salt 'syq-snakenx-02.lehe.com' cmd.run 'cat /etc/salt/grains'
syq-snakenx-02.lehe.com:
key01: null
key02: null
my_grain: null
my_grain_dict:
- one
- two
- three
# salt 'syq-snakenx-02.lehe.com' grains.delval my_grain_dict
syq-snakenx-02.lehe.com:
None
# salt 'syq-snakenx-02.lehe.com' cmd.run 'cat /etc/salt/grains'
syq-snakenx-02.lehe.com:
key01: null
key02: null
my_grain: null
my_grain_dict: null
其它方式设置的 Grains 可以通过与添加过程相反的操作来删除。
4、Pillar 的概念
Grains 很强大,但缺点是这些数据相对来说是静态数据。
Pillar 数据存储在 master 端上,指定的 minion 只能查看自己的 Pillar 数据,其它的 minion 看不到任何 Pillar 数据,这一点与状态文件正好相反。所有通过认证的 minion 都可以获取状态文件,但是每个 minion 却都有自己的一套 Pillar 数据,而且每台 minion 的 Pillar 都进行了加密,所以很适合用于敏感数据。
5、Pillar 相关的基本命令
5.1 列出对应 minion 上所有 Pillar 的详细信息
# salt 'syq-snakenx-02.lehe.com' pillar.item
syq-snakenx-02.lehe.com:
----------
5.2 查询 minion 上某一具体 Grain 的值
# salt 'syq-snakenx-02.lehe.com' pillar.item foo
syq-snakenx-02.lehe.com:
----------
foo:
6、设置 Pillar 数据
6.1 首先建立目录,然后为每个 minion 编写对应的 SLS 文件
master 端 |
---|
|
6.2 建立入口文件top.sls
master 端 |
---|
|
6.3 执行命令刷新 Pillar 数据
master 端 |
---|
|
6.4 查看所有 Pillar 数据
master 端 |
---|
|
可以看到不同的 minion 获取了自己私有的字符串,这就完成了 Pillar 下发敏感数据的过程,通信加密,切 minion 之间互相不可见。
三、用 Jinja2 配合 Grain 和 Pillar 扩展 SLS 配置文件
1、扩展 apache.sls 配置文件
把 Jinja2 以及 Grain 和 Pillar 应用到状态文件 SLS 上面,让状态控制拥有逻辑能力,可以根据不同的情况作出动态的配置。
第三话中用 apache.sls 状态文件部署 Apache 软件,apache.sls 文件如下:
(CentOS)vim apache.sls |
---|
|
上面的 SLS 文件仅适用于 CentOS 系统下安装 apache,更严格一点说是适合用于 Redhat 系的 Linux 系统。那么如果 Ubuntu 系统呢?难道需要再写一个 SLS 文件?
(Ubuntu)vim apache.sls |
---|
|
上面的这种情况抽象出来就是根据 minion 的不同属性,SLS 文件需要有逻辑判断来进行不同操作。这种需求恰好有 Jinja2 和 Grains 配合可以完美解决,因为 Grains 是描述 minion 固有属性的数据,而 Jinja2 可以做流程和逻辑控制,解决方案如下:
vim apache.sls |
---|
|
测试:
# salt 'ninion-one,minion-two' state.sls apache
2、多系统 Vim 安装实例
3、Iptables 配置实例
4、通过 Pillar 扩展 SLS 配置
四、用 Jinja2 配合 Grains 和 Pillar 动态下发配置文件
1、一个简单模板下发实例
1.1 编辑状态文件:
# vim template.sls |
---|
|
1.2 编辑模板文件
vim test.j2 |
---|
|
1.3 测试模板文件下发
master 端 |
---|
|
1.4 查看 syq-snakenx-02 上下发的配置文件
master 端 |
---|
|
配置文件内容已经被替换成了对应的值。
1.5 再加入部分 Jinja2 的逻辑控制功能
vim test.j2 |
---|
|
1.6 再次测试模板文件下发
master 端 |
---|
|
1.7 查看 syq-snakenx-02 上下发的配置文件
master 端 |
---|
|