一、saltstack
以下简介内容来自
https://www.jianshu.com/p/624b9cf51c64
部署不是的~
1.saltstack简介
SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)构建。
通过部署SaltStack,我们可以在成千万台服务器上做到批量执行命令,根据不同业务进行配置集中化管理、分发文件、采集服务器数据、操作系统基础及软件包管理等,SaltStack是运维人员提高工作效率、规范业务配置与操作的利器。
2.saltstack基本原理
SaltStack 采用 C/S模式,server端就是salt的master,client端就是minion,minion与master之间通过ZeroMQ消息队列通信
minion上线后先与master端联系,把自己的pub key发过去,这时master端通过salt-key -L命令就会看到minion的key,接受该minion-key后,也就是master与minion已经互信
master可以发送任何指令让minion执行了,salt有很多可执行模块,比如说cmd模块,在安装minion的时候已经自带了,它们通常位于你的python库中,
locate salt | grep /usr/
可以看到salt自带的所有东西。这些模块是python写成的文件,里面会有好多函数,如cmd.run,当我们执行
salt '*' cmd.run 'uptime'
的时候,master下发任务匹配到的minion上去,minion执行模块函数,并返回结果。master监听4505和4506端口,4505对应的是ZMQ的PUB system,用来发送消息,4506对应的是REP system是来接受消息的。
具体步骤如下
- Salt stack的Master与Minion之间通过ZeroMq进行消息传递,使用了ZeroMq的发布-订阅模式,连接方式包括tcp,ipc
- salt命令,将
cmd.run ls
命令从salt.client.LocalClient.cmd_cli
发布到master,获取一个Jodid,根据jobid获取命令执行结果。 - master接收到命令后,将要执行的命令发送给客户端minion。
- minion从消息总线上接收到要处理的命令,交给
minion._handle_aes
处理 minion._handle_aes
发起一个本地线程调用cmdmod执行ls命令。线程执行完ls后,调用minion._return_pub
方法,将执行结果通过消息总线返回给master- master接收到客户端返回的结果,调用
master._handle_aes
方法,将结果写的文件中 salt.client.LocalClient.cmd_cli
通过轮询获取Job执行结果,将结果输出到终端
二、部署saltstack
环境:
salt1:rhel7系统,控制节点
salt2:rhel7系统,被控制节点
salt3:rhel7系统,被控制节点
salt4:rhel7系统,被控制节点
软件:saltstack ==> 点击下载 提取码: gbw2
1.安装saltstack
这里我们已经提前做好了第三方软件库,直接在yum文件内添加即可,salt1和salt2都添加
[root@salt1 ~]# vim /etc/yum.repos.d/yum.repo
[salt]
name=salt
baseurl=ftp://172.25.1.254/pub/saltstack
gpgcheck=0
salt1
[root@salt1 ~]# yum install salt* -y
salt2
[root@salt2 ~]# yum install salt-minion.noarch -y
2.修改设置
salt1
[root@salt1 ~]# cd /etc/salt/
[root@salt1 salt]# vim minion
16 master: 172.25.1.1
[root@salt1 salt]# systemctl start salt-master
salt2
[root@salt2 ~]# cd /etc/salt/
[root@salt2 salt]# vim minion
16 master: 172.25.1.1
[root@salt2 salt]# systemctl start salt-minion
3.测试
[root@salt1 salt]# salt-key -L ##列出信息
[root@salt1 salt]# salt-key -A ##接受存在的主机
[root@salt1 salt]# salt '*' test.ping ##
salt1:
True
salt2:
True
如上图,就可以对salt2进行部署操作了,我们可以查看一下
[root@salt1 salt]# yum install lsof -y ##安装查看连接的软件
root@salt1 salt]# lsof -i :4505 ##server1的minion是后期打开的
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
salt-mini 13273 root 27u IPv4 46137 0t0 TCP salt1:55148->salt1:4505 (ESTABLISHED)
salt-mast 13407 root 15u IPv4 41527 0t0 TCP *:4505 (LISTEN)
salt-mast 13407 root 17u IPv4 43194 0t0 TCP salt1:4505->172.25.1.2:49884 (ESTABLISHED)
salt-mast 13407 root 18u IPv4 46138 0t0 TCP salt1:4505->salt1:55148 (ESTABLISHED)
三、saltstack实践
1.在salt2上自动化部署httpd
1.新建存放httpd自动化部署的配置目录
[root@salt1 ~]# mkdir /srv/salt
[root@salt1 ~]# cd /srv/salt
[root@salt1 salt]# mkdir httpd
[root@salt1 salt]# cd httpd/
[root@salt1 httpd]# mkdir files ##存放要推的文件
配置文件 == > 点击下载 提取码: nbdx 放在file文件夹内
2.编辑httpd自动化部署设置文件
我们可以安装和启动服务的sls文件分开,模块化更好操作一点
[root@salt1 httpd]# vim install.sls
[root@salt1 httpd]# cat install.sls
httpd:
pkg.installed
[root@salt1 httpd]# vim service.sls
[root@salt1 httpd]# cat service.sls
include:
- httpd.install
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://httpd/files/httpd.conf
httpd-service:
service.running:
- name: httpd
- enable: False
- reload: True
watch:
- file: /etc/httpd/conf/httpd.conf
3.测试一下
[root@salt1 httpd]# salt server2 state.sls httpd.service
在salt2上查看
2.在salt3上自动化部署nginx
1.新建存放nginx自动化部署的配置目录
[root@salt1 httpd]# cd ..
[root@salt1 salt]# cd httpd/
[root@salt1 httpd]# mkdir ../nginx
[root@salt1 httpd]# cd ../nginx
[root@salt1 nginx]# ls
[root@salt1 nginx]# mkdir files ##用来从放配置文件等
配置文件 == > 点击下载 提取码: rx23 放在file文件夹内
2.编辑httpd自动化部署设置文件
我们可以安装和启动服务的sls文件分开,模块化更好操作一点
[root@salt1 nginx]# vim install.sls
[root@salt1 nginx]# cat install.sls
nginx-install:
pkg.installed:
- pkgs:
- pcre-devel
- zlib-devel
- gcc
- make
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 &>/dev/null && make &> /dev/null && make install &> /dev/null && cd .. && rm -fr nginx-1.15.8
- creates: /usr/local/nginx
[root@salt1 nginx]# vim service.sls
[root@salt1 nginx]# cat service.sls
include:
- nginx.install
nginx:
user.present:
- uid: 1000
- shell: /sbin/nologin
/usr/local/nginx/conf/nginx.conf:
file.managed:
- source: salt://nginx/files/nginx.conf
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
3.测试一下
[root@salt1 files]# salt server3 state.sls nginx.service
在salt上查看
3.在salt4上自动化部署haproxy
1.新建存放nginx自动化部署的配置目录并编辑配置文件
[root@salt1 salt]# mkdir haproxy
[root@salt1 salt]# cd haproxy/
[root@salt1 haproxy]# ls
[root@salt1 haproxy]# vim install.sls
[root@salt1 haproxy]# cat install.sls
haproxy-install:
pkg.installed:
- pkgs:
- haproxy
file.managed:
- name: /etc/haproxy/haproxy.cfg
- source: salt://haproxy/files/haproxy.cfg
service.running:
- name: haproxy
- reload: True
- watch:
- file: haproxy-install
[root@salt1 haproxy]# mkdir files
配置文件 == > 点击下载 提取码: hdud 放在file文件夹内
2.测试一下
[root@salt1 haproxy]# salt server4 state.sls haproxy.install
接下来编辑httpd和nginx的默认网页,用以区分
[root@salt2 html]# cat index.html
www.httpd.com
[root@salt3 html]# cat index.html
www.nginx.com
4.在salt4上自动化部署keepalive(带vip)
1.新建keepalive配置目录
[root@salt1 haproxy]# mkdir ../keepalived
[root@salt1 haproxy]# cd ../keepalived
[root@salt1 keepalived]# mkdir files
配置文件 == > 点击下载 提取码:divc 放在file文件夹内
2.自动化部署配置文件
[root@salt1 keepalived]# vim install.sls
[root@salt1 keepalived]# cat install.sls
kp-install:
pkg.installed:
- pkgs:
- keepalived
file.managed:
- name: /etc/keepalived/keepalived.conf
- source: salt://keepalived/files/keepalived.conf
- template: jinja
{% if grains['fqdn'] == 'server1' %}
STATE: MASTER
VRID: 1
PRIORITY: 100
{% elif grains['fqdn'] == 'server4' %}
STATE: BACKUP
VRID: 1
PRIORITY: 50
{% endif %}
service.running:
- name: keepalived
- reload: True
- watch:
- file: kp-install
3.测试
需要在server端安装mailx,这样如果发生了切换啥的,会邮件通知
[root@salt4 ~]# yum install mailx
salt端部署
[root@salt1 keepalived]# salt server4 state.sls keepalived.install
先使用虚拟ip进行测试,此时vip在salt4
可以,我们在salt1也自动化部署安装haproxy和keepalive,接下来试一试停掉salt4的haproxy,试一试虚拟ip会不会漂移到salt1,以及lb会不会受到影响
如上图,vip到了salt1
lb也是正常的
我们还可以进行顶级设置
[root@salt1 salt]# vim top.sls
[root@salt1 salt]# cat top.sls
base:
'server1':
- haproxy.install
'server2':
- httpd.service
'salt3':
- nginx.service
'salt4':
- haproxy.install
- keepalived.install
这样只需要下面一个命令就可以把所有的群组安装上对应的服务
[root@salt1 salt]# salt '*' state.highstate
四、将saltstack的执行返回值存入数据库
我们将saltstack的执行和执行返回值存入数据库,就相当于做了日志记录,是一个好用的功能,这里分为两种情况,一是在minion端设置,这样可以将其中一台的操作数据存入数据库,我们还可以对master端进行设置,所有的操作数据会存入数据库
1.设置minion,也就是让其中一台主机的操作指令存入数据库
1)修改minion设置文件
[root@salt4 salt]# vim minion
865 return: mysql
866 mysql.host: '172.25.1.1'
867 mysql.user: 'salt'
868 mysql.pass: 'salt'
869 mysql.db: 'salt'
870 mysql.port: 3306
2)数据库设置
[root@salt1 salt]# yum install mariadb-server -y
[root@salt1 salt]# systemctl start mariadb
[root@salt1 salt]# mysql
MariaDB [(none)]> grant all on salt.* to salt@'%' identified by 'salt'; ##数据库授权
Query OK, 0 rows affected (0.00 sec)
然后导入数据库
[root@salt1 salt]# vim test.sql
[root@salt1 salt]# cat test.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;
--
-- 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;
[root@salt1 salt]# mysql < test.sql
3)测试
[root@salt1 salt]# salt server4 cmd.run hostname --return mysql
server4:
salt4
[root@salt1 salt]# mysql
MariaDB [(none)]> show databases;+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| salt |
| test |
+--------------------+
MariaDB [(none)]> use salt
MariaDB [salt]> show tables;
+----------------+
| Tables_in_salt |
+----------------+
| jids |
| salt_events |
| salt_returns |
+----------------+
MariaDB [salt]> select * from salt_returns;
Empty set (0.00 sec)
发现是空的,这是什么原因呢,原来是没有安装MySQL-python,并且没有重启salt4的salt-minion
[root@salt4 salt]# yum install MySQL-python -y
[root@salt4 salt]# systemctl restart salt-minion
再次测试
2.在master端设置,将所有的操作数据存入数据库
首先我们对上一个配置进行回滚操作,删除之前在salt4对minion文件的修改,因为所有的数据都会返回给master,所以我们这里的原理就是直接拿返回的数据全部丢到数据库里面
1)修改master端的master文件配置
[root@salt1 salt]# vim /etc/salt/master
1260 mysql.host: 'localhost'
1261 mysql.user: 'salt'
1262 mysql.pass: 'salt'
1263 mysql.db: 'salt'
1264 mysql.port: 3306
1265
1266 master_job_cache: mysql
2)安装MySQL-python
[root@salt1 salt]# yum install MySQL-python -y
3)数据库授权
[root@salt1 salt]# mysql
MariaDB [(none)]> grant all on salt.* to salt@'localhost' identified by 'salt';
Query OK, 0 rows affected (0.00 sec)
4)测试
测试之前请重启salt-master
[root@salt1 salt]# salt server3 test.ping
ok~
五、saltstack定义模块
1.新建模块目录并编辑模块配置文件
[root@salt1 _modules]# mkdir /srv/salt/_modules
[root@salt1 _modules]# cd /srv/salt/_modules
[root@salt1 _modules]# vim my_disk.py
def df():
cmd = 'df -h'
return __salt__['cmd.run'](cmd)
2.同步模块
[root@salt1 _modules]# salt server4 saltutil.sync_modules
3.测试
[root@salt1 _modules]# salt server4 my_disk.df
ps:还可以通过api的方法来调用salt,这里不再展开详细叙述,请大家自己到下面网站学习
ok~