saltstack自动化运维部署工具

版权声明:转载请著明出处 https://blog.csdn.net/weixin_40543283/article/details/88869963

一、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是来接受消息的。

具体步骤如下

  1. Salt stack的Master与Minion之间通过ZeroMq进行消息传递,使用了ZeroMq的发布-订阅模式,连接方式包括tcp,ipc
  2. salt命令,将cmd.run ls命令从salt.client.LocalClient.cmd_cli发布到master,获取一个Jodid,根据jobid获取命令执行结果。
  3. master接收到命令后,将要执行的命令发送给客户端minion。
  4. minion从消息总线上接收到要处理的命令,交给minion._handle_aes处理
  5. minion._handle_aes发起一个本地线程调用cmdmod执行ls命令。线程执行完ls后,调用minion._return_pub方法,将执行结果通过消息总线返回给master
  6. master接收到客户端返回的结果,调用master._handle_aes方法,将结果写的文件中
  7. 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,这里不再展开详细叙述,请大家自己到下面网站学习

http://docs.saltstack.cn/

ok~

猜你喜欢

转载自blog.csdn.net/weixin_40543283/article/details/88869963