💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
![](https://i-blog.csdnimg.cn/direct/ff169577db1c4a128c6c5ae56d3c6949.gif)
推荐:Linux运维老纪的首页,持续学习,不断总结,共同进步,活到老学到老
导航剑指大厂系列:全面总结 运维核心技术:系统基础、数据库、网路技术、系统安全、自动化运维、容器技术、监控工具、脚本编程、云服务等。
常用运维工具系列:常用的运维开发工具, zabbix、nagios、docker、k8s、puppet、ansible等
数据库系列:详细总结了常用数据库 mysql、Redis、MongoDB、oracle 技术点,以及工作中遇到的 mysql 问题等
懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
自动化运维之SaltStack 实践
技能目标
- 掌握 SaltStack 部署常见服务
- 掌握 SaltStack 部署常见架构
1.1SaltStack简介
SaltStack是一个配置管理系统,它能够维护预定义状态的远程节点。SaltStack同时也是一个分布式远程执行系统,用于在远程节点上执行命令和查询数据。这个系统主要由四个部分组成:Master(负责管理所有节点)、Minion(相当于客户端的节点服务)、ZeroMQ(通信服务)和AES(数据加密方法)。SaltStack的特点包括简单、并行执行、基于成熟的技术、提供Python API以及灵活和开放。然而,它也有一些缺点,比如需要单独安装客户端和存在安全隐患。
SaltStack的核心功能包括并行发送命令到远程系统,使用安全加密的协议,以及提供简单的编程接口。它引入了更加细致化的领域控制系统来远程执行,使得系统成为目标不仅可以通过主机名,还可以通过系统属性进行指定。SaltStack采用C/S模式,Minion与Master之间通过ZeroMQ消息队列进行通信,默认监听4505端口。Master运行的第二个网络服务是ZeroMQ REP系统,默认监听4506端口。
SaltStack的常用命令包括salt
命令,用于执行Salt的执行模块,通常在Master端运行,是使用最频繁的命令。其他命令如salt-run
用于执行runner(salt带的或者自定义的runner),通常在Master端执行。例如,salt '*' 'test.ping'
用于查看在线的Minion,而salt '*' 'pkg.install ftp'
则用于在所有Minion上安装ftp。这些命令展示了SaltStack在远程节点管理中的强大功能和灵活性
2.1 案例分析
2.1.1 案例概述
之前学习了 SaltStack 常见模块的语法和基本使用。各模块知识点比较多,也相
对比较散乱,可能对 SaltStack 不是很熟悉的同学在实际工作中部署项目的时候甚至
有点无从下手和不知所措。本章节更偏向于实践操作,将多个模块知识点整合在一起,
然后部署单个服务,最后多个服务形成一个 Keepalived+Haproxy+Nginx 高可用的架
构。
2.1.2 案例环境
1. 本案例实验环境
本案例使用三台服务器,均采用 CentOS 7.3 系统,实验环境要能连入互联网,Selinux
和防火墙均已关闭。三台服务器设置完整的 fqdn 域名形式。具体环境如表 2-1 所示。
表 2-1 实验环境
角色 | 主机名 | IP 地址 | 安装软件 |
master | master.saltstack.com | 192.168.9.233 | Salt-master |
minion | minion01.saltstack.com | 192.168.9.234 |
Salt-minion、Keepalived(主)、Haproxy、
Nginx
|
minion | minion02.saltstack.com | 192.168.9.235 |
Salt-minion、Keepalived(备)、Haproxy、
Nginx
|
实验网络拓扑如图 2.1 所示。图 2.1 网络拓扑![](https://i-blog.csdnimg.cn/direct/eb7dae6574f74c3da51f2f6c4a9b98be.png)
2. 案例需求
在不同的企业或者不同的实际生产环境中,可能一个服务的软件安装包或者一个架构中
的软件安装包并不是使用 YUM 进行安装的,而是使用源码编译安装,所以本案例要求使用
SaltStack 实现源码自动化部署及管理 Keepalived、Haproxy、Nginx,形成一个高可用的网
站架构。
3. 案例实现思路
将上述高可用架构拆分为几个服务进行安装,这样做的好处是:如果出错,方便排查解
决。实现思路如下:
(1) 准备工作。
(2) 安装 Saltstack 软件包。
(3) 安装 Keepalived。
(4) 安装 Haproxy。
(5) 安装 Nginx。
(6) 验证部署结果。
2.2 案例实施
2.2.1 准备工作
(1)配置主机名
分别修改三台服务器主机名。
[root@node1 ~]# hostnamectl set-hostname master.saltstack.com
[root@node2 ~]# hostnamectl set-hostname minion01.saltstack.com
[root@node3 ~]# hostnamectl set-hostname minion02.saltstack.com
(2)配置/etc/hosts 文件
在三台服务器上,修改/etc/hosts 文件,增加主机名和 IP 的映射关系,具体内容如下所
示。
建议:生产环境使用 DNS 服务器统一做解析管理。
[root@master ~]# cat << EOF >> /etc/hosts
192.168.9.233 master.saltstack.com
192.168.9.234 minion01.saltstack.com
192.168.9.235 minion02.saltstack.com
EOF
//三台服务器均操作
2.2.2 安装 SaltStack
(1)安装 EPEL 源本步骤中,三台服务器上都需要安装 EPEL 源,并安装 SaltStack 服务端和客户端。下 面以主控端 Master 为例进行操作演示。
[root@master ~]# yum install -y epel-release
(2)安装 salt-master 软件
在主控端(也就是 Master)上,安装 SaltStack 软件。
[root@master ~]# yum install -y salt-master
(3)安装 salt-minion 软件
在被控端(也就是两台 Minion)上,安装 SaltStack 软件。
[root@minion01 ~]# yum install -y salt-minion
[root@minion02 ~]# yum install -y salt-minion
(4)配置主控端
配置主控端的主配置文件/etc/salt/master,默认的 master 文件全部是注释的。修改
SaltStack 文件根目录位置,去掉注释。
[root@master ~]# vim /etc/salt/master
file_roots:
base:
- /srv/salt
主控端做完上述操作后,启动 salt-master 服务。
[root@master ~]# systemctl start salt-master
[root@master ~]# systemctl enable salt-master
Created
symlink
from
/etc/systemd/system/multi-user.target.wants/salt-master.service
to
/usr/lib/systemd/system/salt-master.service.
(5)配置被控端
配置两台被控端的主配置文件/etc/salt/minion,默认的 minion 文件全部也是注释的。
[root@minion01 ~]# vim /etc/salt/minion
master: master.saltstack.com
//指定主控端 IP 地址
[root@minion02 ~]# vim /etc/salt/minion
master: master.saltstack.com
分别启动两台被控端 salt-minion 服务,命令如下:
[root@minion01 ~]# systemctl start salt-minion
[root@minion01 ~]# systemctl enable salt-minion
Created
symlink
from
/etc/systemd/system/multi-user.target.wants/salt-minion.service
to
/usr/lib/systemd/system/salt-minion.service.
[root@minion02 ~]# systemctl start salt-minion
[root@minion02 ~]# systemctl enable salt-minion
Created
symlink
from
/etc/systemd/system/multi-user.target.wants/salt-minion.service
to
/usr/lib/systemd/system/salt-minion.service.
(6)配置通信认证
主控端和被控端通信是采用认证的方式,所以需要在主控端同意认证。执行 salt-key -L
命令显示所有的 Minion 的认证信息。
[root@master ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
minion01.saltstack.com
minion02.saltstack.com
Rejected Keys:
执行 salt-key -A 命令可以接受所有 Unaccepted Keys 状态的 Minion 的认证信息。接受
过程中会有交互,需要输入 y 字符,如下所示。如果是接受指定的 Minion 信息,则使用-a
参数。
[root@master ~]# salt-key -A
The following keys are going to be accepted:Unaccepted Keys:
minion01.saltstack.com
minion02.saltstack.com
Proceed? [n/Y] y
Key for minion minion01.saltstack.com accepted.
Key for minion minion02.saltstack.com accepted.
(7)测试通信状态
在主控端上简单测试主控端和被控端通信状态。如果返回都是 True,说明正常。
[root@master ~]# salt '*' test.ping
minion01.saltstack.com:
True
minion02.saltstack.com:
True
2.2.3 SaltStack 部署 Keepalived
在主控端创建 SaltStack 需要的目录。
[root@master ~]# mkdir /srv/salt
通常情况下,编译安装软件需要用到 gcc、make 等这些基础环境软件包或者需要一些
依赖包,而很多被控端可能没有这些编译环境。这里把三个开源软件依赖的软件包一起先进
行安装,所以需要使用 SaltStack 进行配置依赖包安装。为了方便统一管理,创建不同目录
进行区分。
[root@master ~]# mkdir /srv/salt/pkg
[root@master ~]# vim /srv/salt/pkg/make.sls
make-pkg:
pkg.installed:
- pkgs:
- make
- gcc
- gcc-c++
- autoconf
- openssl
- openssl-devel
- pcre
- pcre-devel
- zlib
- zlib-devel
创建 Keepalived 目录。
[root@master ~]# mkdir /srv/salt/keepalived
创建一个目录,用于存放 Keepalived 源码包和一些它的相关配置文件。
[root@master ~]# mkdir /srv/salt/keepalived/files
首先从 Keepalived 官网下载源码包文件上传到/root 目录下,然后解压。本次案例中使
用是 1.2.13 版本。
[root@master ~]# tar zxvf keepalived-1.2.13.tar.gz
拷贝源码包、启动服务文件、配置文件到 files 目录下。
[root@master ~]# cp keepalived-1.2.13.tar.gz /srv/salt/keepalived/files
[root@master
~]#
cp
keepalived-1.2.13/keepalived/etc/init.d/keepalived.init
/srv/salt/keepalived/files/keepalived
[root@master
~]#
cp
keepalived-1.2.13/keepalived/etc/keepalived/keepalived.conf
/srv/salt/keepalived/files
[root@master
~]#
cp
keepalived-1.2.13/keepalived/etc/init.d/keepalived.sysconfig
/srv/salt/keepalived/files/keepalived.sys
[root@master ~]# ls /srv/salt/keepalived/files/
keepalived keepalived-1.2.13.tar.gz keepalived.conf keepalived.sys
默认的 keepalived.conf 配置文件并不适合本案例的环境,需要修改,具体内容如下所
示。
提示:可新建 keepalived.conf 文件,粘贴以下内容,去掉注释。
注意:备份好原文件。
[root@master ~]# vim /srv/salt/keepalived/files/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id HAPROXY-HA
}
vrrp_instance VI_1 {
{% if grains['fqdn'] == 'minion01.saltstack.com' %}
//通过主机名判断主从
state MASTER
priority 100
{% elif grains['fqdn'] == 'minion02.saltstack.com' %}
state BACKUP
priority 99
{% endif %}
interface ens33
//监听网卡
virtual_router_id 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.9.228
//设置 VIP 地址
}
}
编写执行动作 install.sls 文件,内容如下所示。
[root@master ~]# vim /srv/salt/keepalived/install.sls
include:
- pkg.make
//载入基础环境 make.sls 文件
keepalived-install:
//拷贝源码包
file.managed:
- name: /usr/local/src/keepalived-1.2.13.tar.gz
- source: salt://keepalived/files/keepalived-1.2.13.tar.gz
cmd.run:
//安装 keepalived 软件
- name: cd /usr/local/src && tar zxf keepalived-1.2.13.tar.gz && cd keepalived-1.2.13
&& ./configure --prefix=/usr/local/keepalived --with-init=SYSV && make && make install
- unless: test –d /usr/local/keepalived
//如果目录存在就不执行上面的 name
- require:
- file: keepalived-install
/usr/sbin/keepalived:
//创建软连接
file.symlink:
- target: /usr/local/keepalived/sbin/keepalived
/etc/keepalived:
//创建目录
file.directory:
- mode: 755
/etc/sysconfig/keepalived:
//拷贝文件
file.managed:
- source: salt://keepalived/files/keepalived.sys
- mode: 644
- user: root
/etc/init.d/keepalived:
file.managed:
- source: salt://keepalived/files/keepalived
- mode: 755
- user: root
cmd.run:
- name: chkconfig --add keepalived
- unless: chkconfig --list |grep keepalived
/etc/keepalived/keepalived.conf:
file.managed:
- source: salt://keepalived/files/keepalived.conf
- mode: 644
- template: jinja
编写服务启动 service.sls,文件内容如下所示。
[root@master ~]# vim /srv/salt/keepalived/service.sls
include:
- keepalived.install
//载入上述创建的 install.sls 文件
keepalived-service:
//服务启动
service.running:
- name: keepalived- enable: True
- reload: True
- watch:
- file: /etc/keepalived/keepalived.conf
编写统一入口文件 top.sls,文件内容如下所示。
[root@master ~]# vim /srv/salt/top.sls
base:
'minion0[1-2].saltstack.com':
- keepalived.service
主控端向两台被控端推送安装 Keepalived,执行如下命令。
[root@master ~]# salt '*' state.highstate
第一次执行时间比较长,执行完成后可以看到每台被控端上面成功执行任务 ID。
2.2.4 SaltStack 部署 Haproxy
创建 haproxy 目录,目录结构和 keepalived 基本保持一致。
[root@master ~]# mkdir /srv/salt/haproxy
[root@master ~]# mkdir /srv/salt/haproxy/files
从 Haproxy 官网下载 Haproxy 的源码包上传到/root 目录下,本案例使用版本为 1.5.19。
[root@master ~]# tar zxvf haproxy-1.5.19.tar.gz
拷贝 Haproxy 的源码包、启动脚本、配置文件到 files 目录。
[root@master ~]# cp /root/haproxy-1.5.19.tar.gz /srv/salt/haproxy/files/
[root@master ~]# cp /root/haproxy-1.5.19/examples/haproxy.cfg /srv/salt/haproxy/files
[root@master
~]#
cp
/root/haproxy-1.5.19/examples/haproxy.init
/srv/salt/haproxy/files/haproxy
[root@master ~]# ls /srv/salt/haproxy/files
haproxy haproxy-1.5.19.tar.gz haproxy.cfg
同样默认的 Haproxy 配置文件也不适合本案例的需求,所以需要做如下的修改。
[root@master ~]# vim /srv/salt/haproxy/files/haproxy.cfg
global
log
127.0.0.1 local0
chroot
/var/lib/haproxy
pidfile
/var/run/haproxy.pid
maxconn
10000
user
haproxy
group
haproxy
daemon
defaults
mode
http
log
global
option
httplog
option
dontlognull
option http-server-close
option
redispatch
retries
3
timeout http-request
10s
timeout queue
1m
timeout connect
10s
timeout client
1m
timeout server
1m
timeout http-keep-alive 10s
timeout check
10s
maxconn
5000
listen stats *:10000
//查看 haproxy 状态
mode http
stats enable
stats uri /
stats refresh 5s
stats show-node
stats show-legends
stats hide-version
listen test 0.0.0.0:80
//监听 80 端口,所以 nginx 需要修改为 8888 端口
mode tcp
option tcplog
timeout client 10800s
timeout server 10800s
balance leastconn
option tcp-check
default-server port 8888 inter 2s downinter 5s rise 3 fall 2 slowstart 60s maxconn 5000
maxqueue 250 weight 100
server test-node1 minion01.saltstack.com:8888 check
server test-node2 minion02.saltstack.com:8888 check
从 Haproxy 的配置文件中,可以看到服务运行使用的是 haproxy 用户。编译安装不会
创建用户,所以需要在启动服务之前创建,编写 haproxy.sls 文件,内容如下所示。[root@master ~]# mkdir /srv/salt/user
[root@master ~]# vim /srv/salt/user/haproxy.sls
haproxy:
group.present:
- gid: 300
user.present:
- uid: 300
- gid: 300
- shell: /sbin/nologin
- home: /var/lib/haproxy
编写 Haproxy 的安装 install.sls 文件,内容如下所示。
[root@master ~]# vim /srv/salt/haproxy/install.sls
include:
- user.haproxy
haproxy-install:
file.managed:
- name: /usr/local/src/haproxy-1.5.19.tar.gz
- source: salt://haproxy/files/haproxy-1.5.19.tar.gz
cmd.run:
- name: cd /usr/local/src && tar zxf haproxy-1.5.19.tar.gz && cd haproxy-1.5.19 && make
TARGET=linux2628 PREFIX=/usr/local/haproxy && make install PREFIX=/usr/local/haproxy
- unless: test -d /usr/local/haproxy
- require:
- file: haproxy-install
/usr/sbin/haproxy:
file.symlink:
- target: /usr/local/haproxy/sbin/haproxy
/etc/haproxy:
file.directory:
- mode: 755
/etc/haproxy/haproxy.cfg:
file.managed:
- source: salt://haproxy/files/haproxy.cfg
- mode: 644
/etc/init.d/haproxy:
file.managed:
- source: salt://haproxy/files/haproxy
- mode: 755
- user: root
cmd.run:
- name: chkconfig --add haproxy
- unless: chkconfig --list |grep haproxy
编写 service.sls 文件,内容如下所示。
[root@master ~]# vim /srv/salt/haproxy/service.sls
include:
- haproxy.install
haproxy-service:
service.running:
- name: haproxy
- enable: True
- reload: True
- watch:
- file: /etc/haproxy/haproxy.cfg
在入口 top.sls 文件中,增加 Haproxy 相关的操作,内容如下所示。
[root@master ~]# vim /srv/salt/top.sls
base:
'minion0[1-2].saltstack.com':
- keepalived.service
- haproxy.service
主控端向两台被控端推送安装 Haproxy,执行如下命令。
[root@master ~]# salt '*' state.highstate
第一次执行时间比较长,执行完成后可以看到每台被控端上面成功执行任务 ID。
2.2.5 SaltStack 部署 Nginx
创建 nginx 目录,目录结构还是保持一致。
[root@master ~]# mkdir /srv/salt/nginx
[root@master ~]# mkdir /srv/salt/nginx/files
因为 Nginx 服务也需要使用 nginx 用户运行,所以需要创建 nginx 用户。
[root@master ~]# vim /srv/salt/user/nginx.sls
nginx:
group.present:
- gid: 400
user.present:
- uid: 400
- gid: 400
- shell: /sbin/nologin
- home: /home/nginx
从 Nginx 官网下载源码包上传到/root 目录然后解压,本案例使用 1.12.0 版本。
[root@master ~]# tar zxvf nginx-1.12.0.tar.gz
拷贝 Nginx 的源码包、配置文件到 files 目录。
[root@master ~]# cp nginx-1.12.0.tar.gz /srv/salt/nginx/files
[root@master ~]# cp nginx-1.12.0/conf/nginx.conf /srv/salt/nginx/files
因为源码包里面没有启动 Nginx 服务脚本文件,加上本案例的 CentOS 7.3 系统采用
Systemctl 管理启动服务,所以需要手动创建一个启动文件 nginx.service,内容如下所示。
[root@master ~]# vim /srv/salt/nginx/files/nginx.service
[Unit]
Description=nginx service
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
为了区分两台 Nginx 节点首页显示不一样内容,创建一个 index.html 文件,内容如下
所示。
[root@master ~]# vim /srv/salt/nginx/files/index.html
{% if grains['fqdn'] == 'minion01.saltstack.com' %}
This is 192.168.9.234 node!
{% elif grains['fqdn'] == 'minion02.saltstack.com' %}
This is 192.168.9.235 node!
{% endif %}
查看 /srv/salt/nginx/files/目录下的文件,如下所示。
[root@master ~]# ls /srv/salt/nginx/files/
index.html nginx-1.12.0.tar.gz nginx.conf nginx.service
编写 Nginx 的 install.sls 安装文件,内容如下所示。
[root@master ~]# vim /srv/salt/nginx/install.sls
include:
- user.nginx
nginx-install:
file.managed:
- name: /usr/local/src/nginx-1.12.0.tar.gz
- source: salt://nginx/files/nginx-1.12.0.tar.gz
cmd.run:
- name: cd /usr/local/src && tar zxf nginx-1.12.0.tar.gz && cd nginx-1.12.0 && ./configure
--prefix=/usr/local/nginx && make && make install
- unless: test -d /usr/local/nginx
- require:
- file: nginx-install
/usr/local/nginx/conf/nginx.conf:
file.managed:
- source: salt://nginx/files/nginx.conf
- mode: 644
cmd.run:
- name: sed -i 's/#user
nobody/user
nginx/g' /usr/local/nginx/conf/nginx.conf && sed -i
'0,/80/s/80/8888/' /usr/local/nginx/conf/nginx.conf
/usr/local/nginx/html/index.html:
file.managed:
- source: salt://nginx/files/index.html
- mode: 644
- template: jinja
nginx-init:
file.managed:
- name: /usr/lib/systemd/system/nginx.service
- source: salt://nginx/files/nginx.service
- mode: 644
- user: root
cmd.run:
- name: systemctl enable nginx
- unless: systemctl is-enabled nginx编写 Nginx 的启动服务 service.sls 文件,内容如下所示。
[root@master ~]# vim /srv/salt/nginx/service.sls
include:
- nginx.install
nginx-service:
service.running:
- name: nginx
- enable: True
- reload: True
- watch:
- file: /usr/local/nginx/conf/nginx.conf
编写总入口文件 top.sls 文件,增加 Nginx 相关操作,内容如下所示。
[root@master ~]# vim /srv/salt/top.sls
base:
'minion0[1-2].saltstack.com':
- keepalived.service
- haproxy.service
- nginx.service
最后,在 salt-master 端给 salt-minion 端推送 top.sls 文件,实现在 Minion 端根据不同
需求自动安装 Keepalived、Haproxy、Nginx 服务并启动。如下命令第一次执行时间会比较
长,请耐心等待。每台 Minion 端成功执行 30 个 ID 任务。
[root@master ~]# salt '*' state.highstate
//因输出太多,省略部分
----------
ID: nginx-service
Function: service.running
Name: nginx
Result: True
Comment: Service nginx is already enabled, and is running
Started: 15:33:04.665507
Duration: 766.121 ms
Changes:
----------
nginx:
True
Summary
-------------
Succeeded: 30 (changed=29)
Failed:
0
-------------
Total states run:
30查看整个 salt 的目录结构,如下所示。
[root@master ~]# tree /srv/salt/
/srv/salt/
├── haproxy
│ ├── files
│ │ ├── haproxy
│ │ ├── haproxy-1.5.19.tar.gz
│ │ └── haproxy.cfg
│ ├── install.sls
│ └── service.sls
├── keepalived
│ ├── files
│ │ ├── keepalived
│ │ ├── keepalived-1.2.13.tar.gz
│ │ ├── keepalived.conf
│ │ └── keepalived.sys
│ ├── install.sls
│ └── service.sls
├── nginx
│ ├── files
│ │ ├── index.html
│ │ ├── nginx-1.12.0.tar.gz
│ │ ├── nginx.conf
│ │ └── nginx.service
│ ├── install.sls
│ └── service.sls
├── pkg
│ └── make.sls
├── top.sls
└── user
├── haproxy.sls
└── nginx.sls
8 directories, 21 files
2.2.6 验证部署结果
登录两台 Minion 节点,查看 Keepalived 状态。
[root@minion01 ~]# ps -ef | grep keepalived
root
5350
1 0 18:13 ?
00:00:00 keepalived -D
root
5351 5350 0 18:13 ?
00:00:00 keepalived -D
root
5352 5350 0 18:13 ?
00:00:00 keepalived -D
root
8376 3453 0 18:20 pts/2
00:00:00 grep --color=auto keepalived
[root@minion02 ~]# ps -ef | grep keepalived
root
5388
1 0 15:31 ?
00:00:00 keepalived -D
root
5389 5388 0 15:31 ?
00:00:00 keepalived -D
root
5390 5388 0 15:31 ?
00:00:00 keepalived -D
root
8413 3487 0 15:40 pts/2
00:00:00 grep --color=auto keepalived
登录 minion01.saltstack.com 主机,查看 VIP 状态如下。
[root@minion01 ~]# ip a | grep 192.168.9.228
inet 192.168.9.228/32 scope global ens33
登录两台 Minion 节点主机,查看 Haproxy 的状态。
[root@minion01 ~]# ps -ef | grep haproxy
haproxy
5739
1
0 18:13 ?
00:00:00 /usr/sbin/haproxy -D -f
/etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid
root
8413 3453 0 18:21 pts/2
00:00:00 grep --color=auto haproxy
[root@minion02 ~]# ps -ef | grep haproxy
haproxy
5768
1
0 15:32 ?
00:00:00 /usr/sbin/haproxy -D -f
/etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid
root
8424 3487 0 15:41 pts/2
00:00:00 grep --color=auto haproxy
登录两台 Minion 节点主机,查看 Nginx 的状态。
[root@minion01 ~]# ps -ef | grep nginx
root
8304
1
0 18:14 ?
00:00:00 nginx: master process
/usr/local/nginx/sbin/nginx
nginx
8305 8304 0 18:14 ?
00:00:00 nginx: worker process
root
8575 3453 0 18:31 pts/2
00:00:00 grep --color=auto nginx
[root@minion02 ~]# ps -ef | grep nginx
root
8333
1
0 15:33 ?
00:00:00 nginx: master process
/usr/local/nginx/sbin/nginx
nginx
8334 8333 0 15:33 ?
00:00:00 nginx: worker process
root
8466 3487 0 15:44 pts/2
00:00:00 grep --color=auto nginx
通过 VIP 地址,查看 Haproxy 的状态,如图 2.2 所示。
图 2.2 查看 Haproxy 的状态
在 Master 控制主机上,访问 VIP 地址,查看是否轮询,如下所示。[root@master ~]# curl http://192.168.9.228
This is 192.168.9.234 node!
[root@master ~]# curl http://192.168.9.228
This is 192.168.9.235 node!
做一个破坏性测试,关闭 minion01.saltstack.com 主机,查看 VIP 地址已经漂移到
minion02.saltstack.com 主机上。
[root@minion02 ~]# ip a | grep 192.168.9.228
inet 192.168.9.228/32 scope global ens33
查看 Haproxy 的状态,显示 minion01.saltstack.com 主机已宕机,如图 2.3 所示。
图 2.3 查看 Haproxy 的状态
在控制主机上再次访问 VIP 地址,后端一个 Nginx 节点正常提供服务,高可用架构正
常,如下所示。
[root@master ~]# curl http://192.168.9.228
This is 192.168.9.235 node!
[root@master ~]# curl http://192.168.9.228
This is 192.168.9.235 node!
至此,SaltStack 部署 Keepalived、Haproxy、Nginx 高可用架构完成。
![](https://i-blog.csdnimg.cn/direct/468d132fe72e4d528c413ee2d7cc0f49.gif)