1.配置管理(续)
现在,在上一篇博文的基础上,继续讲一下配置管理。补充一下sls文件的知识:
Salt 状态系统的核心是SLS,或者叫SaLt State 文件。
SLS表示系统将会是什么样的一种状态,而且是以一种很简单的格式来包含这些数据,常被叫做配置管理。
sls文件命名:
sls文件以”.sls”后缀结尾,但在调用是不用写此后缀。
使用子目录来做组织是个很好的选择。
init.sls 在一个子目录里面表示引导文件,也就表示子目录本身, 所以apache/init.sls
就是表示apache
.
如果同时存在apache.sls 和 apache/init.sls,则 apache/init.sls 被忽略,apache.sls将被用来表示 apache.
(1)想要批量执行上一篇博客中的apache.install,在base目录下准备top.sls文件:
# vim /srv/salt/top.sls
base:
'*':
- apache.install
(2)批量执行:
salt '*' state.highstate
可以看到server2和server3都执行了apache.install,在server3上查看进程
(3)现在,想要在server3中推nginx服务,那么nginx如何推呢?install.sls文件怎么写呢?具体操作如下:
base模式下,建立nginx子目录,并在子目录下建立files目录,获取nginx安装到到files目录下:
[root@server1 salt]# pwd
/srv/salt
[root@server1 salt]# mkdir nginx
[root@server1 salt]# cd nginx/
[root@server1 nginx]# scp root@172.25.33.250:/home/kiosk/Desktop/nginx-1.15.8.tar.gz .
The authenticity of host '172.25.33.250 (172.25.33.250)' can't be established.
ECDSA key fingerprint is SHA256:Bb8c7OXdsCYqQj0jSzzS/ESbOEP/47vePQXgV4L86es.
ECDSA key fingerprint is MD5:6d:4e:ce:d1:b5:65:f4:cb:0a:21:0b:b8:45:a7:1a:b7.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.25.33.250' (ECDSA) to the list of known hosts.
root@172.25.33.250's password:
nginx-1.15.8.tar.gz 100% 1004KB 36.9MB/s 00:00
[root@server1 nginx]# mkdi files
-bash: mkdi: command not found
[root@server1 nginx]# mkdir files
[root@server1 nginx]# mv nginx-1.15.8.tar.gz files
[root@server1 nginx]# cd files/
[root@server1 files]# ls
nginx-1.15.8.tar.gz
nginx子目录下准备install.sls文件:
##拆分的写Install.sls文件,先写简单操作,nginx压缩文件的解压
[root@server1 nginx]# cat install.sls
install-nginx:
file.managed:
- name: /mnt/nginx-1.15.8.tar.gz
- source: salt://nginx/files/nginx-1.15.8.tar.gz
cmd.run:
- name: cd /mnt && tar zxf nginx-1.15.8.tar.gz && cd nginx-1.15.8
#进行推送,结果如下:
##现在,进行nginx的编译,install.sls文件如下:
include:
- pkgs.install ##将编译过程中使用的依赖性软件,写成Install.sls文件,包含进来
install-nginx:
file.managed:
- name: /mnt/nginx-1.15.8.tar.gz
- source: salt://nginx/files/nginx-1.15.8.tar.gz
cmd.run:
- name: cd /mnt && tar zxf nginx-1.15.8.tar.gz && cd nginx-1.15.8 && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx && make && make install
- creates: /usr/local/nginx
[root@server1 nginx]# mkdir ../pkgs
[root@server1 nginx]# vim ../pkgs/install.sls
[root@server1 nginx]# cat ../pkgs/install.sls
nginx-make: ##nginx编译所需软件
pkg.installed:
- pkgs:
- gcc:
- make
- zlib-devel
- pcre-devel
##进行推送,结果如下:
##客户端执行结果 通过4506返回给master端 通过zmq消息队列实现的
返回结果实际上是保存的缓存里的 /var/cache/salt/master/jobs 会保存24小时
在生产实际中是将缓存数据和数据库结合在一起的
[root@server1 nginx]# cd /var/cache
[root@server1 cache]# ls
ldconfig man salt yum
[root@server1 cache]# cd salt/
[root@server1 salt]# cd master/
[root@server1 master]# cd jobs/
[root@server1 jobs]# ls
13 20 4b 57 59 60 61 77 86 98 9f a0 a8 ad ae e1 eb f2 f5 f6
##准备nginx.conf到files目录下,并修改nginx.conf文件,使worker进程适应远程主机的cpu数
[root@server1 nginx]# pwd
/srv/salt/nginx
[root@server1 nginx]# ls
files install.sls service.sls
[root@server1 nginx]# cd files/
[root@server1 files]# scp root@172.25.33.3:/usr/local/nginx/conf/nginx.conf .
root@172.25.33.3's password:
nginx.conf 100% 2656 1.3MB/s 00:00
[root@server1 files]# ls
nginx-1.15.8.tar.gz nginx.conf
[root@server1 files]# vim nginx.conf
##nginx目录下,编写service.sls文件,将nginx.install包括进来:
[root@server1 nginx]# cat service.sls
include:
- nginx.install
/usr/local/nginx/sbin/nginx:
cmd.run:
- creates: /usr/local/nginx/logs/nginx.pid
/usr/local/nginx/conf/nginx.conf:
file.managed:
- source: salt://nginx/files/nginx.conf
/usr/local/nginx/sbin/nginx -s reload:
cmd.wait:
- watch:
- file: /usr/local/nginx/conf/nginx.conf
最后,在files下配置文件准备完毕,base下nginx目录中install.sls准备完毕,service.sls文件也准备完毕,可以进行最后推送
[root@server1 nginx]# salt server3 state.sls nginx.service
(4)在server3中推动成功之后,进行nginx启动方式的修改,使用systemd启动nginx更方便,所以,首先,在files下准备脚本文件
##files下准备脚本文件
[root@server1 files]# cat nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
##修改之前的service.sls文件,将脚本包括进去
nclude:
- nginx.install
/usr/local/nginx/conf/nginx.conf:
file.managed:
- source: salt://nginx/files/nginx.conf
service-nginx:
file.managed:
- name: /usr/lib/systemd/system/nginx.service
- source: salt://nginx/files/nginx.service
service.running:
- name: nginx
- reload: True
- watch:
- file: /usr/local/nginx/conf/nginx.conf
##最后,在base目录下修改top.sls,直接高亮匹配推送
[root@server1 salt]# cat top.sls
base:
'server2':
- apache.install
'server3':
- nginx.service
##在推送之前,因为server3上已经开启nginx进程,所以先将nginx的master的worker的进程关闭
4414 ? Ss 0:00 nginx: master process /usr/local/nginx/sbin/nginx
4417 ? S 0:00 nginx: worker process
12601 ? R 0:00 [kworker/0:1]
14507 pts/0 R+ 0:00 ps ax
[root@server3 ~]# kill -9 4414
[root@server3 ~]# kill -9 4417
salt '*' state.highstate
server3的nginx推送成功!!!
2.Grains详解
(1)Grains简介
Grains是SaltStack的一个组件,存放在SaltStack的minion端。
当salt-minion启动时会把收集到的数据静态存放在Grains当中,只有当minion重启时才会进行数据的更新。
由于grains是静态数据,因此不推荐经常去修改它。
应用场景:
信息查询,可用作CMDB。
在target中使用,匹配minion。
在state系统中使用,配置管理模块。
(2)Grains信息查询
用于查询minion端的IP、FQDN等信息。
默认可用的grains:
salt '*' grains.ls
查看每一项的值:
salt '*' grains.items
取单项的值:
salt server3 grains.item ipv4
salt server3 grains.item fqdn
(3)自定义grains项
在/etc/salt/minion中定义:
vim /etc/salt/minion
grains:
roles:
- apache
重启salt-minion,否则数据不会更新:
systemctl restart salt-minion
在server1中获取server2中的roles
[root@server1 salt]# salt server2 grains.item roles
server2:
----------
roles:
- apache
在server3中的/etc/salt/grains中定义:
vim /etc/salt/grains:
roles: nginx
同步数据:
salt server3 saltutil.sync_grains
查询自定义项:
salt server3 grains.item roles
(4)编写grains模块
在salt-master端创建_grains目录:
mkdir /srv/salt/_grains
vim /srv/salt/_grains/my_grain.py
def my_grain():
grains = {}
grains[‘roles’] = nginx
grains[‘hello’] = ‘world’
return grains
salt server2 saltutil.sync_grains #同步grains到minion端
##在server2中查看文件的父级结构
[root@server2 salt]# pwd
/var/cache/salt
[root@server2 salt]# tree .
.
└── minion
├── accumulator
├── extmods
│ └── grains
│ ├── my_grains.py
│ └── my_grains.pyc
├── files
│ └── base
│ ├── apache
│ │ ├── files
│ │ │ └── httpd.conf
│ │ └── install.sls
│ ├── _grains
│ │ └── my_grains.py
│ └── top.sls
├── highstate.cache.p
├── module_refresh
├── pkg_refresh
├── proc
└── sls.p
10 directories, 10 files
(5)grains匹配运用
在target中匹配minion:
salt -G 'roles:apache'test.ping
salt -G 'roles:nginx'test.ping
在top文件中匹配:
vim /srv/salt/top.sls
base:
‘roles:apache’:
- match: grain
- apache.install
‘roles:nginx’:
- match: grain
- nginx.service
# salt '*' state.highstate ##全部主机推送
[root@server1 salt]# salt -G 'hello:world' test.ping ##匹配hello:world关键字的主机
server2:
True
server3:
True
3.pillar详解
(1)pillar简介
pillar和grains一样也是一个数据系统,但是应用场景不同。
pillar是将信息动态的存放在master端,主要存放私密、敏感信息(如用户名密码等),而且可以指定某一个minion才可以看到对应的信息。
pillar更加适合在配置管理中运用。
(2)声明pillar
定义pillar基础目录:
vim /etc/salt/master
pillar_roots:
base:
- /srv/pillar
mkdir /srv/pillar
重启salt-master服务:
systemctl restart salt-master
自定义pillar项
[root@server1 salt]# cd /srv/pillar
[root@server1 pillar]# ls
[root@server1 pillar]# mkdir web
[root@server1 pillar]# cd web
[root@server1 web]# vim vars.sls
[root@server1 web]# cat vars.sls
{% if grains['fqdn'] == 'server3' %}
webserver: nginx
{% elif grains['fqdn'] == 'server2' %}
webserver: httpd
{% endif %}
[root@server1 web]# vim ../top.sls
[root@server1 web]# cat ../top.sls
base:
'*': ##所有主机都包含vars资源
- web.vars
刷新pillar数据:
salt '*' saltutil.refresh_pillar
查询pillar数据:
salt '*' pillar.items
salt server2 pillar.item webserver
salt server3 pillar.item webserver
4.jinja模板详解
(1)jinja模板简介
Jinja是一种基于python的模板引擎,在SLS文件里可以直接使用jinja模板来做一些操作。
通过jinja模板可以为不同服务器定义各自的变量。
两种分隔符: {% … %} 和 {{ … }},前者用于执行诸如 for 循环 或赋值的语句,后者把表达式的结果打印到模板上。
(2)Jinja模板使用方式
Jinja在普通文件的使用:
[root@server1 apache]# cat install.sls
install-apache:
pkg.installed:
- pkgs:
- httpd
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/files/httpd.conf
- template: jinja ##使用jinja模板为port赋值
- context:
port: 80
service.running:
- name: httpd
- reload: true
- watch:
- file: install-apache
在apache/files下修改httpd.conf
给server2中推送:
salt server2 state.sls apache.install
[root@server1 apache]# vim install.sls
[root@server1 apache]# cat install.sls
install-apache:
pkg.installed:
- pkgs:
- httpd
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/files/httpd.conf
- template: jinja
- context:
port: 80
host: 172.25.4.2 ##配置文件中定义主机名
service.running:
- name: httpd
- reload: true
- watch:
- file: install-apache
[root@server1 apache]# cd files/
[root@server1 files]# ls
httpd.conf
[root@server1 files]# vim httpd.conf ##配置文件中修改监听格式
[root@server1 files]# salt server2 state.sls apache.install
再次进行推送:salt server2 state.sls apache.install
查看server2中的httpd.conf文件
(3)使用grains取值方式给模板变量赋值
install-apache:
pkg.installed:
- pkgs:
- httpd
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/files/httpd.conf
- template: jinja
- context:
port: 80
host: {{ grains['ipv4'][-1] }} ##grains取值方式
service.running:
- name: httpd
- reload: true
- watch:
- file: install-apache
进行推送:推送成功
也可以直接在配置文件中使用grains取值
进行推送:推送成功
(4)使用pillar取值方式给模板变量赋值
[root@server1 apache]# cat install.sls
install-apache:
pkg.installed:
- pkgs:
- httpd
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/files/httpd.conf
- template: jinja
- context:
port: 80
host: {{ pillar['ip'] }} ##需要在pillar的base目录下的sls文件中指名ip变量
service.running:
- name: httpd
- reload: true
- watch:
- file: install-apache
将配置文件中监听格式改为原样,并且在/srv/pillar/web/vars.sls文件中,赋值给ip变量
进行推送:推送成功
也可以直接在配置文件中使用pillar取值
进行推送:推送成功
(5)import方式
import方式,可在state文件之间共享:
定义变量文件:
vim lib.sls
{% set port = 80 %}
导入模板文件:
vim httpd.conf
{% from 'apache/lib.sls' import port %}
…
Listen {{ host }}:{{ prot }}
进行推送:推送成功
备注:在/srv/salt/nginx/install.sls文件中可以加入{% set nginx_version = 1.15.8 %},然后在文件中所有使用到版本的时候,都可以直接引用{{ nginx_version }}**
5.高可用keepalived的部署
(1)/srv/salt下建立keepalived子目录,编写install.sls文件
[root@server1 keepalived]# cat install.sls
install-keepalived:
pkg.installed:
- pkgs:
- keepalived
file.managed:
- name: /etc/keepalived/keepalived.conf
- source: salt://keepalived/files/keepalived.conf
- template: jinja
- context:
STATE: {{ pillar['state'] }}
VRID: {{ pillar['vrid'] }}
PRIORITY: {{ pillar['priority'] }}
service.running:
- name: keepalived
- watch:
- file: install-keepalived
(2)修改files下的keepalived.conf配置文件
[root@server1 keepalived]# cd files/
[root@server1 files]# pwd
/srv/salt/keepalived/files
[root@server1 files]# cp /etc/keepalived/keepalived.conf .
[root@server1 files]# ls
keepalived.conf
[root@server1 files]# vim keepalived.conf
(3)pillar的base目录下,为变量赋值
[root@server1 files]# cd /srv/pillar
[root@server1 pillar]# ls
top.sls web
[root@server1 pillar]# cd web/
[root@server1 web]# vim vars.sls
[root@server1 web]# cat vars.sls
{% if grains['fqdn'] == 'server2' %}
ip: 172.25.33.2
state: MASTER
vrid: 4
priority: 100
{% elif grains['fqdn'] == 'server3' %}
state: BACKUP
vrid: 4
priority: 50
(4)编写top.sls文件:
[root@server1 salt]# cat top.sls
base:
'roles:apache':
- match: grain
- apache.install
- keepalived.install
'roles:nginx':
- match: grain
- nginx.service
- keepalived.install
(5)进行推送
[root@server1 salt]# salt '*' state.highstate
(6)查看server2和3的进程,查看vip是否在server2上,当server2关闭主keepalived服务时,vip能够飘移
[root@server2 conf]# systemctl stop keepalived.service
6.salt job cache管理
(1)Job简介
master在下发指令任务时,会附带上产生的jid。
minion在接收到指令开始执行时,会在本地的/var/cache/salt/minion/proc目录下产生该jid命名的文件,用于在执行过程中master查看当前任务的执行情况。
指令执行完毕将结果传送给master后,删除该临时文件。
(2)默认JOB CACHE
Job缓存默认保存24小时:
vim /etc/salt/master
keep_jobs: 24
master端Job缓存目录:
/var/cache/salt/master/jobs
(3)把Job存储到数据库
1.修改master端配置:
vim /etc/salt/master
master_job_cache: mysql
mysql.host: ‘localhost’
mysql.user: ‘salt’
mysql.pass: ‘salt’
mysql.db: ‘salt’
重启salt-master服务:
systemctl restart salt-master
2.安装mysql数据库:
yum install -y mariadb-server MySQL-python
3.执行数据库初始化脚本:
mysql_secure_installation
4.创建数据库授权:
\> grant all on salt.* to salt@localhost identified by 'salt';
5.导入数据模板:
mysql -p < salt.sql
6.查看mastere端job缓存目录/var/cache/salt/master/jobs
7.执行命令,能否保存到数据库:保存成功!