企业——saltstack自动化部署软件值JINJIA模块的使用
一.JINJA在STATES中的使用 可以用于管理文件
默认的Jinja分隔符配置如下
{% ... %}
对于声明
{{ ... }}
对于表达式打印到模板输出
{# ... #}
for Comments 不包含在模板输出中
# ... ##
对于行语句
模板变量由传递给模板的上下文字典定义。
如果应用程序传入变量,您可以使用模板中的变量。变量可能具有您可以访问的属性或元素。变量的属性很大程度上取决于提供该变量的应用程序
{{ ... }} 重要的是要知道外部双花括号不是变量的一部分,而是print语句。如果访问标记内的变量,请不要在它们周围放置大括号。
{{% ... %}} 测试可用于针对公共表达式测试变量。要测试变量或表达式,请在变量后添加 is 加上测试的名称
JINJIA的控制结构:
1.如果 if
Jinja中的 if 语句与 Python if 语句相当。在最简单的形式中,您可以使用它来测试变量是否已定义,而不是空或不是false
对于多个分支,elif 和 else 可以像Python一样使用。您也可以在那里使用更复杂的表达式。
示例下面有。
2.宏定义
宏与常规编程语言中的函数相当。它们有助于将经常使用的习语放入可重复使用的功能中,而不是重复自己(“干”)。示例是下面的saltstack用文件推nginx的服务一样。
3.作业
作业的语法示例:{% set key, value = call_something() %}
在代码块内部,您还可以为变量赋值。顶级(块,宏或循环之外)的分配从顶层宏等模板导出,并可由其他模板导入。
4.导入和导入上下文行文
二.修改 sls 文件内容,添加相应的 jinjia 模块
1.在编写好的 sls 文件中添加相应的 jinjia 模块
cd /srv/salt/apache
vim install.sls
- template: jinja
- context:
port: 8080
bind: 172.25.254.2
vim files/httpd.conf
Listen {{ bind }}:{{ port }}
salt wf2 state.sls apache.install ##通过推送的 sls 文件修改配置文件内的某些参数(或者参数的格式)
测试:
在wf2上: netstat -antlp ##端口格式被修改
vim /etc/httpd/conf/httpd.conf ##配置文件中的格式也被修改了
2.上面的方法的不足:bind信息是手动加进去的。如果有很多的服务器(意味着有很多不同的IP),不可能一个一个手动添加
改进:
vim install.sls
bind: {{ grains['fqdn_ip4']}} ##将bind处修改,通过 grains 获得某台服务器的IP,然后填入bind 中。这个在服务器很多的时候,不用一个一个手动添加
salt wf2 state.sls apache.install
测试:
在wf2上: netstat -antlp ##端口格式被修改
vim /etc/httpd/conf/httpd.conf ##配置文件中的格式也被修改了
但是显示出来的内容,却是列表的形式,需要进一步的改进。改进如下。
接着改进:
vim install.sls
bind: {{ grains['ipv4'][1] }}
测试:
在wf2上: netstat -antlp ##端口格式被修改
vim /etc/httpd/conf/httpd.conf ##配置文件中的格式也被修改了
三.利用JINJIA的控制结构实现
1.利用导入
vim files/httpd.conf ##给配置文件的最上面空白处添加以下的语句
{% from 'apache/lib.sls' import port with context%} ## 将 apache/lib.sls 文件中的端口号,填写入配置文件中。
{% from 'apache/lib.sls' import bind with context%} ## 将 apache/lib.sls 文件中的IP地址,填写入配置文件中。
cd /srv/salt/apache ##在刚才写的目录的路径下,创建相应的文件
vim lib.sls ##编辑需要填写的内容信息,set相当于开启一个容器,然后给容器赋值
{% set port = 8080 %}
{% set bind = '172.25.254.2' %}
2.利用 如果if 实现
vim /srv/pillar/web/install.sls
{% if grains['fqdn'] == 'ww2' %}
webserver: httpd
port: 80
bind: 172.24.254.2
{% elif grains['fqdn'] == 'ww3' %}
webserver: nginx
% endif %}
vim files/httpd.conf
Listen {{ pillar['bind'] }}:{{ pillar['port'] }}
3.配置 nginx 服务
cat install.sls
{% set nginx_ver = '1.15.8' %}
nginx-install:
pkg.installed:
- pkgs:
- pcre-devel
- zlib-devel
- gcc
- make
file.managed:
- name: /mnt/nginx-{{ nginx_ver }}.tar.gz
- source: salt://nginx/files/nginx-{{ nginx_ver }}.tar.gz
cmd.run:
- name: cd /mnt && tar zxf nginx-{{ nginx_ver }}.tar.gz && cd nginx-{{ nginx_ver }} && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx &> /dev/null && make &> /dev/null && make install &> /dev/null && cd .. && rm -fr nginx-{{ nginx_ver }}
- creates: /usr/local/nginx
cat service.sls
include:
- nginx.install
- users.nginx
/usr/local/nginx/conf/nginx.conf:
file.managed:
- source: salt://nginx/files/nginx.conf
- template: jinja
nginx-service:
file.managed:
- name: /etc/systemd/system/nginx.service
- source: salt://nginx/files/nginx.service
service.running:
- name: nginx
- reload: True
- watch:
- file: /usr/local/nginx/conf/nginx.conf
ls ## 在 /mnt 下
nginx-1.15.8.tar.gz
rm -fr * ##再次推送就过来了
salt server3 state.sls nginx.service
ls
nginx-1.15.8.tar.gz
四.利用数据库记录 saltstack 执行过的命令
方法一:常规方法,执行的命令会被保存在cache目录下
cd /var/cache/salt/master/jobs
salt-run jobs.list_jobs ##查看执行过的命令
方法二:利用数据库保存
在wf2上:使远程的用户可以登录数据库
yum install MySQL-python -y
cd /etc/salt
vim minion
mysql.host: '172.25.254.1'
mysql.user: 'salt'
mysql.pass: 'westos'
mysql.db: 'salt'
mysql.port: 3306
/etc/init.d/salt-minion restart
在wf1上:
yum install mysql-server -y
/etc/init.d/mysqld start
mysql < add.sql
mysql ##给用户授权
mysql> grant all on salt.* to salt@'%' identified by 'westos';
mysql> grant all on salt.* to salt@'localhost' identified by 'westos';
==================================================================================
下面是 add.sql 文件中的东西:
CREATE DATABASE `salt`
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
USE `salt`;
--
-- Table structure for table `jids`
--
DROP TABLE IF EXISTS `jids`;
CREATE TABLE `jids` (
`jid` varchar(255) NOT NULL,
`load` mediumtext NOT NULL,
UNIQUE KEY `jid` (`jid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#CREATE INDEX jid ON jids(jid) USING BTREE;
--
-- Table structure for table `salt_returns`
--
DROP TABLE IF EXISTS `salt_returns`;
CREATE TABLE `salt_returns` (
`fun` varchar(50) NOT NULL,
`jid` varchar(255) NOT NULL,
`return` mediumtext NOT NULL,
`id` varchar(255) NOT NULL,
`success` varchar(10) NOT NULL,
`full_ret` mediumtext NOT NULL,
`alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
KEY `id` (`id`),
KEY `jid` (`jid`),
KEY `fun` (`fun`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Table structure for table `salt_events`
--
DROP TABLE IF EXISTS `salt_events`;
CREATE TABLE `salt_events` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`tag` varchar(255) NOT NULL,
`data` mediumtext NOT NULL,
`alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`master_id` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `tag` (`tag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
==================================================================================
salt '*' test.ping --return mysql ##执行一条return命令
mysql
mysql> use salt;
mysql> show tables;
mysql> select * from salt_returns; ##会有刚才测试的 test.ping 的记录
在wf1上:
yum install MySQL-python -y
cd /etc/salt
vim master
master_job_cache: mysql
mysql.host: 'localhost'
mysql.user: 'salt'
mysql.pass: 'westos'
mysql.db: 'salt'
mysql.port: 3306
/etc/init.d/salt-master restart
测试:
salt wf3 cmd.run hostname ##执行一条return命令
mysql
mysql> use salt;
mysql> show tables;
mysql> select * from salt_returns; ##会有刚才测试的 test.ping 的记