什么是 Jinja2
Jinja2 是一个 Python 的功能齐全的模板引擎。 它有完整的 unicode 支持,一个可选的集成沙箱执行环境,被广泛使用,以 BSD 许可证授权。 Jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全。 特性: 沙箱中执行 强大的 HTML 自动转义系统保护系统免受 XSS 模板继承 即时编译最优的 Python 代码 可选提前编译模板的时间 易于调试,异常的行数直接指向模板中的对应行。 可配置的语法
Salt 使用 Jinja2 模板
SaltStack 是使用 YAML 语言来将 SLS 文件解释成它自己可以识别的内容,Jinja 是一种基于 Python 的模板引擎, 在 SLS 文件里可以直接使用 Jinja 模板来做一些操作。 比如当我们需要对多台服务器做一些 Apache 服务配置时,由于每台服务器信息不一样(比如 IP 不同), 如果为每台服务器去创建 SLS 文件就不太合理,而通过 Jinja 模板则可以用生成变量→读取变量的方式来为每个服务器设置应有的信息。
1 使用 Jinja2 模板的三步
1.告诉 file 模块,要使用 jinja
2.列出参数列表
如下:
apache-config:
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://lamp/files/httpd.conf
- user: root
- group: root
- mode: 644
- template: jinja # 1. 增加这行表示开启模板
- defaults: # 2. 下面设定变量的值
PORT: 88
3.文件中模板变量引用
模板里面支持 salt/grains/pillar 进行变量赋值
下面分别进行举例
2 Jinja2 模板的基本使用
1.首先将 source 文件中需要引用变量的内容改为,如修改 apache 配置文件中的端口信息:
将 Listen 80 修改成 Listen
2.对 SLS 文件进行编辑以定义模板并且给变量传值,在第一步中定义了几个变量就必须给几个变量传值
配置 apache-config 的状态如下:
apache-config:
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://lamp/files/httpd.conf
- user: root
- group: root
- mode: 644
- template: jinja # 增加这行表示开启模板
- defaults: # 下面设定变量的值
PORT: 88
3.执行 state.sls
输出如下:
----------
ID: apache-config
Function: file.managed
Name: /etc/httpd/conf/httpd.conf
Result: None
Comment: The file /etc/httpd/conf/httpd.conf is set to be changed
Started: 16:23:32.575140
Duration: 80.33 ms
Changes:
----------
diff:
---
+++
@@ -39,7 +39,7 @@
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
-Listen 80
+Listen 88
#
# Dynamic Shared Object (DSO) Support
----------
3 Jinja2 模板的高级使用
在基本使用中由于修改的是端口,端口信息一般是固定的,如果想要修改的信息是每个 minion 自身的 IP 就没办法设置一个通用的信息了, 这个时候需要通过其他方法来获取 minion 相关信息,这里可以使用 Grains 、Pillar 和执行模块三个方法来获取。
3.1 用 Grains 举例-设置 IP
增加的配置内容如下:
- template: jinja
- defaults:
PORT: 88
HOST:
# [fqdn_ip4]代表的是 IP,该信息需要先执行 salt '*' grains.items 查询,由于 grains
# 查询输出的是列表,会有多个值,需要加上[0]代表取第一个值
同样需要修改 httpd.conf 文件引用上面定义的模板变量,如下:
Listen :
执行 state.sls
输出如下:
----------
ID: apache-config
Function: file.managed
Name: /etc/httpd/conf/httpd.conf
Result: None
Comment: The file /etc/httpd/conf/httpd.conf is set to be changed
Started: 16:38:42.643145
Duration: 37.981 ms
Changes:
----------
diff:
---
+++
@@ -39,7 +39,7 @@
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
-Listen 88
+Listen 192.168.56.12:88
#
# Dynamic Shared Object (DSO) Support
----------
3.2 使用 Salt 远程执行模块 举例-获取网卡 MAC 地址
以下为演示(远程命令直接写在 httpd.conf 中,为注释状态)
Listen : # The MAC is:
执行 state.sls 后的输出如下(截取部分):
----------
ID: apache-config
Function: file.managed
Name: /etc/httpd/conf/httpd.conf
Result: None
Comment: The file /etc/httpd/conf/httpd.conf is set to be changed
Started: 16:47:28.887669
Duration: 51.994 ms
Changes:
----------
diff:
---
+++
@@ -39,7 +39,8 @@
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
-Listen 88
+Listen 192.168.56.12:88
+# The MAC is: 00:0c:29:bf:c0:16 # 可以看到,取到了 MAC 地址
#
# Dynamic Shared Object (DSO) Support
----------
3.3 使用 Phillar - 举例
一般用于配置用户名密码的时候
以下为演示( Phillar 配置加到 httpd.conf 中,为注释状态)
# Pillar test: User: salt Password:
pillar[‘apache’] 已在 Salt Master 上配置好,可以先在 Master 上看下:
[root@linux-node1 files]# salt '*node2*' pillar.items apache
linux-node2.example.com:
----------
apache:
httpd
执行 state.highstate 后的输出如下(截取部分):
----------
ID: apache-config
Function: file.managed
Name: /etc/httpd/conf/httpd.conf
Result: None
Comment: The file /etc/httpd/conf/httpd.conf is set to be changed
Started: 18:24:41.837882
Duration: 107.177 ms
Changes:
----------
diff:
---
+++
@@ -39,7 +39,9 @@
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
-Listen 88
+Listen 192.168.56.12:88
+# The MAC is: 00:0c:29:bf:c0:16
+# Pillar test: User: salt Password: httpd # 此处说明已经成功设置了 pillar item
#
# Dynamic Shared Object (DSO) Support
----------
Pillar 上面是写在模板文件中,还有另外一种方法,Grains/Pillar 等也可以写在 SLS 文件里面