欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Saltstack_使用指南12_配置管理-jinja模板

程序员文章站 2022-05-20 17:05:59
1. 说明 下文的案例是根据上一篇文章进行的修改。因此请优先读取上一章博文内容《Saltstack_使用指南11_配置管理-状态之间依赖关系》 2. 主机规划 salt 版本 salt jinja 文档 Jinja2 文档 注意事项 修改了master或者minion的配置文件,那么必须重启对应的服 ......

 

1. 说明

下文的案例是根据上一篇文章进行的修改。因此请优先读取上一章博文内容《saltstack_使用指南11_配置管理-状态之间依赖关系

 

2. 主机规划

Saltstack_使用指南12_配置管理-jinja模板

 

salt 版本

1 [root@salt100 ~]# salt --version
2 salt 2018.3.3 (oxygen)
3 [root@salt100 ~]# salt-minion --version
4 salt-minion 2018.3.3 (oxygen)

 

salt jinja 文档

https://docs.saltstack.com/en/latest/topics/jinja/index.html

 

jinja2 文档

1 http://docs.jinkan.org/docs/jinja2/    
2 http://docs.jinkan.org/docs/jinja2/templates.html

 

注意事项

修改了master或者minion的配置文件,那么必须重启对应的服务。

 

3. jinja 用法

1 # 注意有空格
2 这里有两种分隔符: {% ... %} 和 {{ ... }} 。前者用于执行诸如 for 循环 或赋值的语句,后者把表达式的结果打印到模板上。
3 {# ... #} 为注释语法

 

jinja 在 状态中的使用

 1 3步走:
 2     1、告诉file模块,你要使用jinja
 3         - template: jinja
 4     2、列出参数列表
 5         - defaults:
 6             httpport: 88
 7     3、模板引用
 8         {{ httpport }}
 9 
10 模板里面支持:salt 远程执行、grains 和 pillar 进行赋值

 

4. 案例

对上一章案例内容进行改造。

添加 jinja 信息。

 

添加了 jinja 的好处:

1、  可以把 mariadb.sls 也规整到 init.sls;

2、  这样就是一个 sls 文件对外,而不是多个 sls;

3、  在执行 sls 的时候,直接整体/分批执行,而不是选定某个或某些 minion 执行;不需要指定 minion 目标,减少人为出错的可能性;

4、  后期维护方便

 

4.1. 部署架构

Saltstack_使用指南12_配置管理-jinja模板

 

4.2. 本章涉及的 pillar 的信息

可参见:《saltstack_使用指南05_数据系统-pillar

 1 [root@salt100 pillar]# pwd
 2 /srv/pillar
 3 [root@salt100 pillar]# cat top.sls 
 4 base:
 5   '*':
 6     - web_pillar.service_appoint
 7 
 8 # 下面的跟本章节无关,可以不管
 9   # 使用通配符
10   'salt0*':
11     - web_pillar.apache
12     - web_pillar.user # 引用
13   # 指定具体minion
14   'salt03':
15     - web_pillar.apache
16     - web_pillar.user # 引用
17 [root@salt100 pillar]# cat web_pillar/service_appoint.sls  # pillar 的 sls
18 {% if (grains['ip4_interfaces']['eth0'][0] == '172.16.1.11' and grains['host'] == 'salt01') 
19    or (grains['ip4_interfaces']['eth0'][0] == '172.16.1.12' and grains['host'] == 'salt02')
20    or (grains['ip4_interfaces']['eth0'][0] == '172.16.1.13' and grains['host'] == 'salt03')
21 %}
22 # 注释信息 需要顶格书写
23 service_appoint: www
24 {% elif grains['ip4_interfaces']['eth0'][0] == '172.16.1.100' %}
25 service_appoint: mariadb
26 {% endif %}

 

使 pillar 生效

 1 [root@salt100 pillar]# salt '*' saltutil.refresh_pillar  # 刷新
 2 [root@salt100 pillar]# salt '*' pillar.item service_appoint  # 查看 pillar 中 service_appoint 的信息
 3 salt03:
 4     ----------
 5     service_appoint:
 6         www
 7 salt02:
 8     ----------
 9     service_appoint:
10         www
11 salt100:
12     ----------
13     service_appoint:
14         mariadb
15 salt01:
16     ----------
17     service_appoint:
18         www

 

4.3. 配置文件 httpd.conf 修改

 1 [root@salt100 file]# pwd
 2 /srv/salt/lamp2/file
 3 [root@salt100 file]# vim httpd.conf
 4 # listen 80
 5 # 下面的是本次修改的部分 ★★★★★
 6 listen {{ httpport }}
 7 ………………
 8 # if your host doesn't have a registered dns name, enter its ip address here.
 9 #
10 #servername www.example.com:80
11 # 下面的是本次修改的部分 ★★★★★
12 # 格式  servername 本机内网ip:port
13 # 这样的话,在 apache.sls 文件中就不用写规则获取 minion的内网ip了,
14 # 因为在状态执行的时候,就会根据下文的 grains 规则得到对应 minion 的内网ip
15 # servername {{ grains['ip4_interfaces']['eth0'][0] }}:{{ httpport }}
16 
17 # 这里是一个变量,如此的话,在 apache.sls 中需要写规则获取 minion 的内网ip
18 # 优先这种写法,后期改变时,直接改 sls 文件即可。而不用改变该配置文件
19 servername {{ localinnerip }}:{{ httpport }}
20 
21 # 「#」 注释,只是针对 httpd 服务,对于 jinja 仍然是可用的 ★★★★★
22 # salt 模块 支持
23 # hw_addr_eth0={{ hwaddr_eth0 }}
24 # grains 支持
25 # ip6_interfaces_eth0={{ ip6_interface_eth0 }}
26 # pillar 支持
27 # pillar_user={{ pillar_user }}

 

4.4. apache.sls 文件修改

 1 [root@salt100 lamp2]# pwd
 2 /srv/salt/lamp2
 3 [root@salt100 lamp2]# ll
 4 total 16
 5 -rw-r--r-- 1 root root 747 jan  1 14:17 apache.sls
 6 drwxr-xr-x 2 root root  75 jan  1 14:33 file
 7 -rw-r--r-- 1 root root 209 jan  1 14:04 init.sls
 8 -rw-r--r-- 1 root root 563 dec 31 15:42 mariadb.sls
 9 -rw-r--r-- 1 root root 346 dec 31 15:31 php.sls
10 [root@salt100 lamp2]# cat apache.sls 
11 apache-service:
12   pkg.installed:
13     - name: httpd
14 
15   file.managed:
16     - name: /etc/httpd/conf/httpd.conf
17     - source: salt://lamp2/file/httpd.conf
18     - user: root
19     - gourp: root
20     - mode: 644
21     - backup: minion
22     - require:    # 我依赖谁
23       - pkg: apache-service   # 依赖 apache-service 中 pkg 的安装包
24     # 新加 jinja 内容  # 本次修改内容 ★★★★★
25     - template: jinja
26     - defaults:
27       localinnerip: {{ grains['ip4_interfaces']['eth0'][0] }}
28       httpport: 8088
29       # salt远程执行模块 支持  ★★★★★
30       hwaddr_eth0: {{ salt['network.hw_addr'] ('eth0') }}  # 注意 ] ( 之间的空格
31       # grains 支持 【其实 defaults 下的第一行就是,这里在重复一遍】
32       ip6_interface_eth0: {{ grains['ip6_interfaces']['eth0'][0] }}
33       # pillar 支持
34       pillar_user: {{ pillar['level1']['level2']['my_user'] }}
35 
36   service.running:
37     - name: httpd
38     - enable: true
39     - reload: true
40     - require:   # 我依赖谁
41       - pkg: apache-service
42     - watch:      # 我监控谁
43       # 一旦发生变化,就重加载服务
44       - file: apache-service  # 监控 apache-service 中 file 的文件

 

4.5. init.sls 文件修改

 1 [root@salt100 lamp2]# pwd
 2 /srv/salt/lamp2
 3 [root@salt100 lamp2]# ll
 4 total 16
 5 -rw-r--r-- 1 root root 747 jan  1 14:17 apache.sls
 6 drwxr-xr-x 2 root root  75 jan  1 14:33 file
 7 -rw-r--r-- 1 root root 209 jan  1 14:04 init.sls
 8 -rw-r--r-- 1 root root 563 dec 31 15:42 mariadb.sls
 9 -rw-r--r-- 1 root root 346 dec 31 15:31 php.sls
10 [root@salt100 lamp2]# cat init.sls   # 根据 pillar 来区分,哪些 minion 执行哪些 sls 文件
11 include:   # 我包含谁
12 {% if pillar['service_appoint'] == 'www' %}
13   - lamp2.apache
14   - lamp2.php
15 {% elif pillar['service_appoint'] == 'mariadb' %}
16   - lamp2.mariadb
17 {% endif %}

 

4.6. 执行 sls

1 # 测试一下,看是否可执行,有没有什么异常
2 [root@salt100 lamp2]# salt 'salt01' state.sls lamp2.init test=true  
3 # 根据 init.sls 信息,选取覆盖 if 条件中所有情况的 minion 并测试一下,看是否正常
4 [root@salt100 lamp2]# salt -l 'salt01,salt100' state.sls lamp2.init test=true  
5 # 单个执行,并查看返回情况
6 # 这时可在 salt01 机器,通过 ps -ef | grep 'httpd' 和 netstat -lntup | grep 'httpd' 查看
7 # 可见 httpd 已经重加载,并且端口从 80 改为了 8088
8 [root@salt100 lamp2]# salt 'salt01' state.sls lamp2.init 
9 [root@salt100 lamp2]# salt '*' state.sls lamp2.init  # 批量执行,并查看返回情况

 

4.7. 部分截图

[root@salt100 lamp2]# salt 'salt01' state.sls lamp2.init test=true  # 对应的截图

Saltstack_使用指南12_配置管理-jinja模板

 

对应 salt 远程执行、grains、pillar 的情况

 1 [root@salt100 ~]# salt 'salt01' network.hw_addr eth0
 2 salt01:
 3     00:0c:29:95:1b:7a
 4 [root@salt100 ~]# salt 'salt01' grains.item ip6_interfaces:eth0
 5 salt01:
 6     ----------
 7     ip6_interfaces:eth0:
 8         - fe80::20c:29ff:fe95:1b7a
 9 [root@salt100 ~]# salt 'salt01' pillar.item level1:level2:my_user
10 salt01:
11     ----------
12     level1:level2:my_user:
13         lisi

 

Saltstack_使用指南12_配置管理-jinja模板