Saltstack_使用指南12_配置管理-jinja模板 4.1. 部署架构4.2. 本章涉及的 pillar 的信息4.3. 配置文件 httpd.conf 修改
时间:2022-07-26
本文章向大家介绍Saltstack_使用指南12_配置管理-jinja模板
4.1. 部署架构4.2. 本章涉及的 pillar 的信息4.3. 配置文件 httpd.conf 修改,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1. 说明
下文的案例是根据上一篇文章进行的修改。因此请优先读取上一章博文内容《Saltstack_使用指南11_配置管理-状态之间依赖关系》
2. 主机规划
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. 部署架构
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 # 对应的截图
对应 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
- 【Hibernate那点事儿】—— Hibernate应该了解的知识
- 【Hibernate那点事儿】—— Hibernate应该了解的知识
- Java魔法堂:以Windows服务的形式运行Java程序
- 【Hibernate那点事儿】—— Hibernate知识总结
- java获取网页源代码
- Java魔法堂:注解用法详解——@SuppressWarnings
- 日志那点事儿——slf4j源码剖析
- 给Dreamweaver插上Svn的翅膀
- MyBatis魔法堂:ResultMap详解
- 腾讯海量监控体系经验分享
- 【Spring开发】—— Spring Core
- Java魔法堂:找外援的利器——Runtime.exec详解
- win10的80端口被system占用的问题
- 【Spring开发】—— AOP之方法级拦截
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 微信小程序开发实战(19):页面导航
- Kotlin:02-函数的声明
- 「MoreThanJava」Day 5:面向对象进阶—继承详解
- 要点1:指针、数组和复合字面量
- akka-typed(9) - 业务分片、整合,谈谈lagom, 需要吗?
- com-IFileDlg 进行文件的 打开或者保存
- 哆啦A梦?不好记!安利一下Prometheus这款开源的企业监控报警平台
- Kotlin:03-变量、常量、数据类型
- nginx工程师,需要上承天命,下召九幽
- 新版视频流媒体平台EasyNVR如何在前端显示当前页面所在位置?
- Kotlin:04-基本数据类型详细介绍
- Kotlin:05-控制流 if、when、for、while
- android: API24 及以上版本调用系统相机时报:FileUriExposedException 的解决
- Typora 完美结合 PicGo,写作体验更佳!
- 视频流媒体服务器EasyNVR在CentOS6.5上编译报 No such file or directory错误