本实验是在云计算自动化运维——SaltStack详解文章基础上进行的,master-minion端已经配置好。
本文涉及到的jinja模板的使用,详情见:云计算自动化运维——saltstack之jinja模块详解
本文涉及到的pillar数据系统详情见:云计算自动化运维——SaltStack之数据系统Grains、Pillar
saltstack+keepalived+haprox+apache+nginx实现高可用
实验环境
主机名 | ip | 功能 |
---|---|---|
server1 | 172.25.1.1 | saltstack、keepalived(master端) |
server2 | 172.25.1.2 | nginx |
server3 | 172.25.1.3 | apache |
server4 | 172.25.1.4 | keepalived(backup端) |
实验
Keepalived
步骤一:将master端的server1主机添加为自己的minion端,因为后续需要在server1上推送
在server1上安装salt-minion:
在配置文件/etc/salt/minion中添加master主机:
将server1添加到master端的接收列表中:
需要注意的是:安装salt-minion后,在/etc/salt目录下生成的文中,minion_id文件保存的是minion端主机名,每次修改主机名都需要删除此文件,重启服务。否则master端会连接不到minion端
。
步骤二:在/srv/salt目录下创建keepalived目录。并在次目录下编写install.sls文件,实现keepalived源码编译安装,并作好软链接
/mnt/libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm:
file.managed:
- source: salt://keepalived/files/libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm
keepalived-install:
pkg.installed:
- pkgs:
- gcc
- openssl-devel
- libnl-devel
file.managed:
- name: /mnt/keepalived-2.0.6.tar.gz
- source: salt://keepalived/files/keepalived-2.0.6.tar.gz
cmd.run:
- name: cd /mnt && rpm -ivh libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm --nodeps &> /dev/null && tar zxf keepalived-2.0.6.tar.gz && cd keepalived-2.0.6 && ./configure --prefix=/usr/local/keepalived &> /dev/null && make &> /dev/null && make install &> /dev/null && ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ && ln -s /usr/local/keepalived/etc/keepalived/ /etc/ && ln -s /usr/local/keepalived/sbin/keepalived /sbin/
- create: /etc/keepalived/keepalived.conf
libnfnetlink-devel依赖包在yum仓库不存在,所有我在网上下载到我的saltstack主机上,在saltstack中使用file.managed模块将文件发往keepalived主机。在cmd.run模块中使用rpm -ivh安装
我在安装依赖项时出的问题:
安装libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm时报如下错误:
解决方法:
rpm -ivh libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm --nodeps #忽略依赖性安装
步骤二:编写service.sls文件,修改配置文件并开启服务
由于keepalived负载均衡会有主机master和备机backup,主备的配置文件 /etc/keepalived/keepalived.conf中的变量设置是不同的,所以这里需要用jinja模块,定义pillar动态变量。
include:
- keepalived.install
keepalived-service:
file.managed:
- name: /etc/keepalived/keepalived.conf
- source: salt://keepalived/files/keepalived.conf
- template: jinja #调用jinja模板
- context: #引用变量到source指定的文件中去
STATE: {{ pillar['state'] }} #引用pillar自定义动态变量
VRID: {{ pillar['vrid'] }}
PRIV: {{ pillar['priv'] }}
service.running:
- name: keepalived
- reload: true
- watch:
- file: /etc/keepalived/keepalived.conf
步骤三:使用pillar数据系统自定义动态变量
(1)编写/srv/pillar/kp.sls文件,定义动态变量
由于我选用server1做master,server4做backup,所以此处只对主机名为server1与server4的主机定义相应变量。
{% if grains['fqdn'] == 'server1' %}
state: MASTER
vrid: 51
priv: 100
{% elif grains['fqdn'] == 'server4' %}
state: BACKUP
vrid: 51
priv: 50
{% endif %}
(2)编写/srv/pillar/top.sls文件,通过top.sls文件关联其他变量所在的kp.sls文件
base:
'*':
- kp
测试:查看变量定义是否正确
步骤四:将服务要用到的文件放到指定位置
(1)创建files目录,用来存放需要的文件
(2)在任意主机上安装keepalived,生成配置文件,并做修改后放到saltstack主机/srv/salt/keepalived/files目录下
我是在server2虚拟机上安装的:
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost #邮件提醒时的发送方
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict #必须注释掉,否则会出错
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state {{ STATE }} #状态,主或者备
interface eth0
virtual_router_id {{ VRID }} #虚拟ID,同一局域网中的值不能相同,主备主机必须相同。
priority {{ PRIV }} #优先级
advert_int 1
authentication { #认证
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #虚拟ip
172.25.1.100
}
}
注:删除配置文件31行后边的信息,后边的是搭建lvs时需要用到的配置,此处不需要。
(3)从网上下载keepalived安装包及依赖项libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm安装包,放到files目录下
(4)安装邮件服务mailx,keepalived主机出错时会有邮件提醒。
haprox
步骤一:在/srv/salt目录下创建haproxy目录,在haproxy目录中编辑安装文件
install.sls
haproxy-install:
pkg.installed:
- name: haproxy
file.managed:
- name: /etc/haproxy/haproxy.cfg
- source: salt://haproxy/files/haproxy.cfg
service.running:
- name: haproxy
- reload: true
- watch:
- file: haproxy-install
步骤二:在haproxy目录下创建files目录,存放haproxy.cfg配置文件
提前在某台主机上安装haproxy服务,将生成的配置文件haproxy.cfg拷贝到server1主机上/srv/salt/haproxy/files目录下,并作如下配置:
nginx
步骤一:在/srv/salt目录下创建nginx目录,在nginx目录中编辑安装文件
此处我用的是nginx源码安装
。
nginx-install:
pkg.installed:
- pkgs:
- gcc
- pcre-devel
- openssl-devel
file.managed:
- name: /mnt/nginx-1.16.1.tar.gz
- source: salt://nginx/files/nginx-1.16.1.tar.gz
cmd.run:
- name: cd /mnt/ && tar zxf nginx-1.16.1.tar.gz && cd nginx-1.16.1 && sed -i.bak 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx --with-http_ssl_module &> /dev/null && make install &> /dev/null
- creates: /usr/local/nginx #监控,一旦/usr/local/nginx存在则不再执行cmd.run模块
步骤二:编辑服务配置文件service.sls文件
include: #包含nginx目录下的install文件
- nginx.install
/usr/local/nginx/conf/nginx.conf:
file.managed:
- source: salt://nginx/files/nginx.conf
nginx-service:
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
步骤三:在nginx目录下创建files目录,拷贝nginx配置文件及nginx安装包到此目录下
在任意主机上安装nginx,将生成的配置文件拷贝到files目录下,拷贝的文件有:/usr/local/nginx/conf/nginx.conf 和/usr/lib/systemd/system/nginx.service
不做修改。
apache
步骤一:在/srv/salt目录下创建apache目录,在apache目录中编辑安装文件
此处我调用了jinja模块,定义pillar动态变量,也可以不使用,直接指定静态数据。
apache-install:
pkg.installed:
- pkgs:
- httpd
- httpd-tools
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/files/httpd.conf
- template: jinja
http_host: {{ grains['ipv4'][-1]}}
http_port: {{ pillar['port']}}
service.running:
- name: httpd
- reload: true
- watch:
- file: apache-install
步骤二:使用pillar数据系统自定义动态变量
(1)编写web.sls文件,定义动态变量
由于我选用server3安装apache,所以此处只对主机名为server3主机定义端口变量。
{% if grains['fqdn'] == 'server3' %}
port: 80
{% endif %}
(2)编写top.sls文件,通过top.sls文件关联其他变量所在的kp.sls文件
base:
'*':
- kp
- web
(3)测试:查看变量定义是否正确
步骤三:在apache目录下创建files目录,拷贝apache配置文件httpd.conf到此目录下
提前在某台主机上安装httpd服务,将生成的配置文件/etc/httpd/conf/httpd.conf传到files目录下,并做如下修改:
saltstack
步骤一:编辑多节点推送文件/srv/salt/top.sls
base:
'server2':
- nginx.service
'server3':
- apache.install
'server1':
- keepalived.service
- haproxy.install
'server4':
- keepalived.service
- haproxy.install
步骤二:多节点推送
salt '*' state.highstate
推送成功标志:
server3:
server2:
server4:
server1:
步骤三:在web界面搜索虚拟ip 172.25.1.100,发现轮询调度后端主机nginx和apache
搜索haproxy默认发布界面172.25.1.100/status,查看主备节点的节点信息
步骤四:模拟主备节点故障
(1)可查看虚拟ip在server1主机上,此时对外的服务端为server1
(2)模拟server1主机down掉,关闭keepalived
(3)此时haproxy负载均衡正常工作,不受影响
(3)查看此时虚拟ip在server4主机上,此时对外的服务端为server4
故障恢复:
(1)开启server1主服务器的keepalived服务
此时虚拟ip回归到server1上,因为上边我们在配置文件中设置优先级时,server1的优先级高于server4
(2)此时haproxy负载均衡正常工作,不受影响
步骤五:模拟后端轮询调度主机某一台发生故障
(1)关闭server2主机上的nginx
(2)此时haproxy监测到server2主机故障
故障恢复:
(1)开启server2主机上的nginx
(2)此时haproxy监测到server2主机正常
本次实验容易遇到的错误及解决方法:
在keepalived源码安装时很容易出错,每次推送完发生报错时,修改安装配置文件后必须删除文件中报错部分对目标主机做的相应操作,然后再重新推送。
我在server1和server4上源码安装keepalived,进行推送时报了如下错误:
我在修改完安装文件后,删除了对目标主机server1和server4的所有操作,然后重新推送。删除步骤如下:
yum remove gcc openssl-devel libnl-devel -y
rpm -e libnfnetlink-devel
rm -fr /mnt/*
rm -fr /usr/local/keepalived
rm -fr /etc/sysconfig/keepalived
rm -fr /sbin/keepalived