SaltStack一键部署Haproxy + Keepalived
1. 基础包安装配置
[root@linux-node1 /srv/salt/prod]# mkdir {cluster,modules}
[root@linux-node1 /srv/salt/prod]# cd modules/
[root@linux-node1 /srv/salt/prod]# mkdir {haproxy,keepalived,memcached,nginx,php,pkg}
[root@linux-node1 /srv/salt/prod/modules]# ls
haproxy keepalived memcached nginx php pkg
[root@linux-node1 /srv/salt/prod]# tree /srv/salt/prod
/srv/salt/prod
├── cluster #集群层,业务引用
└── modules #模块管理层
├── haproxy
├── keepalived
├── memcached
├── nginx
├── php
└── pkg #基础包管理模块
[root@linux-node1 /srv/salt/prod]# cd pkg
[root@linux-node1 /srv/salt/prod/modules/pkg]# cat make.sls #基础安装包配置
make-pkg:
pkg.installed:
- pkgs:
- gcc
- gcc-c++
- glibc
- make
- autoconf
- openssl
- openssl-devel
- pcre
- pcre-devel2. 部署Haproxy
操作方法:第一次先打台机器手动安装一次,然后再用salt来编写,一次编写多次运行
[root@linux-node1 /srv/salt/prod/modules/haproxy]# cat install.sls include: - modules.pkg.make haproxy-install: file.managed: #配置文件管理 - name: /usr/local/src/haproxy-1.6.3.tar.gz - source: salt://modules/haproxy/files/haproxy-1.6.3.tar.gz - mode: 755 - user: root - group: root cmd.run: #编译安装 - name: cd /usr/local/src && tar zxf haproxy-1.6.3.tar.gz && cd haproxy-1.6.3 && make TARGET=linux2628 PREFIX=/usr/local/haproxy-1.6.3 && make install PREFIX=/usr/local/haproxy-1.6.3 && ln -s /usr/local/haproxy-1.6.3 /usr/local/haproxy - unless: test -L /usr/local/haproxy #如果unless后面的命令返回为true则不执行cmd.run命令,即此连接符号文件存在,上边命令则不执行,防止重复安装 - require: - pkg: make-pkg - file: haproxy-install haproxy-init: #启动文件管理 file.managed: - name: /etc/init.d/haproxy - source: salt://modules/haproxy/files/haproxy.init - mode: 755 - user: root - group: root - require_in: - file: haproxy-install cmd.run: #开机启动 - name: chkconfig --add haproxy - unless: chkconfig --list | grep haproxy net.ipv4.ip_nonlocal_bind: #修改内核参数,监听非本地IP,开启vip功能 sysctl.present: - value: 1 /etc/haproxy: file.directory: #管理配置文件目录 - user: root - group: root - mode: 755 [root@linux-node1 /srv/salt/prod/modules]# salt '*' state.sls modules.haproxy.install saltenv=prod #执行sls文件,安装haproxy [root@linux-node1 /srv/salt/prod/modules]# ls -l /usr/local/haproxy lrwxrwxrwx 1 root root 24 Jul 17 03:06 /usr/local/haproxy -> /usr/local/haproxy-1.6.3 [root@linux-node2 ~]# ps aux|grep yum root 3187 2.5 1.4 328920 27236 ? S 08:04 0:00 /usr/bin/python /usr/bin/yum -y install pcre-c++ openssl-devel root 3239 0.0 0.0 112648 960 pts/0 R+ 08:05 0:00 grep --color yum Summary for linux-node2.example.com ------------ Succeeded: 7 (changed=1) Failed: 0 ------------ Total states run: 7 [root@linux-node2 ~]# ls -l /usr/local/haproxy lrwxrwxrwx 1 root root 24 Jul 29 08:14 /usr/local/haproxy -> /usr/local/haproxy-1.6.3
3. Haproxy的业务引用
[root@linux-node1 ~]# cd /srv/salt/prod/cluster && mkdir files && cd files [root@linux-node1 /srv/salt/prod/cluster/files]# cat haproxy-outside.cfg #统一管理haproxy对外服务的配置文件 global #全局设置 maxconn 100000 #最大连接数 chroot /usr/local/haproxy #当前工作目录 uid 99 #运行用户的uid gid 99 #运行用户的用户组 daemon #以后台形式运行haproxy nbproc 1 #启动1个haproxy实例 pidfile /usr/local/haproxy/logs/haproxy.pid #pid文件位置 log 127.0.0.1 local3 info #日志文件的输出定向 defaults option http-keep-alive #启用请求-应答模式,持久连接,更高效 maxconn 100000 mode http #所处理的类别,默认采用http模式,可配置成tcp作4层消息转发 timeout connect 5000ms #连接超时时间 timeout client 50000ms #客户端连接超时时间 timeout server 50000ms #服务器连接超时时间 listen stats #监听运行状态 mode http bind 0.0.0.0:9999 #监听端口 stats enable #开启状态监听功能 stats uri /haproxy-status #监控页面入口地址 stats auth haproxy:saltstack #用户名密码认证设置 frontend frontend_www_example_com bind 192.168.56.21:80 #对外提供服务的vip mode http #http的7层模式 option httplog log global default_backend backend_www_example_com #frontend配置 backend backend_www_example_com option forwardfor header X-REAL-IP option httpchk HEAD / HTTP/1.0 balance roundrobin #轮询模式,改为balance source即为会话保持模式,balance leastconn最小连接模式 server web-node1 192.168.56.11:8080 check inter 2000 rise 30 fall 15 #服务器定义,serverid为web-node1,check inter 2000是检测心跳频率,rise 30是30次检测正确认为服务器可用,fall 15是15次失败认为服务器不可用,weight代表权重,可添加配置 server web-node2 192.168.56.12:8080 check inter 2000 rise 30 fall 15 [root@linux-node1 /srv/salt/prod/cluster]# cat haproxy-outside.sls #编写haproxy对外提供服务的sls文件 include: - modules.haproxy.install haproxy-service: file.managed: - name: /etc/haproxy/haproxy.cfg - source: salt://cluster/files/haproxy-outside.cfg - user: root - group: root - mode: 644 service.running: - name: haproxy - enable: True - reload: True - require: - cmd: haproxy-install - watch: - file: haproxy-service [root@linux-node1 /srv/salt/prod/cluster]# cat /srv/salt/base/top.sls #修改top file base: '*': - init.init prod: 'linux-node*': - cluster.haproxy-outside [root@linux-node1 /srv/salt/prod/cluster]# salt '*' state.highstate test=True [root@linux-node1 /srv/salt/prod/cluster]# salt '*' state.highstate #高级状态执行haproxy配置 Summary for linux-node1.example.com ------------- Succeeded: 21 (changed=4) Failed: 0 ------------- Total states run: 21 Summary for linux-node2.example.com ------------- Succeeded: 21 (changed=4) Failed: 0 ------------- Total states run: 21 [root@linux-node1 ~]# netstat -tnpl|grep haproxy tcp 0 0 0.0.0.0:9999 0.0.0.0:* LISTEN 22001/haproxy tcp 0 0 192.168.56.21:80 0.0.0.0:* LISTEN 22001/haproxy LISTEN 2595/zabbix_agentd [root@linux-node2 ~]# netstat -tnpl|grep haproxy tcp 0 0 0.0.0.0:9999 0.0.0.0:* LISTEN 22001/haproxy tcp 0 0 192.168.56.21:80 0.0.0.0:* LISTEN 22001/haproxy [root@linux-node1 /srv/salt/prod]# tree #目录结构 . ├── cluster │ ├── files │ │ └── haproxy-outside.cfg │ └── haproxy-outside.sls └── modules ├── haproxy │ ├── files │ │ ├── haproxy-1.6.3.tar.gz │ │ └── haproxy.init │ └── install.sls ├── keepalived ├── memcached ├── nginx ├── php └── pkg └── make.sls
测试,访问http://192.168.56.11:9999/haproxy-status,输入用户名密码,结果如下
4. 部署keepalived
[root@linux-node1 ~]# cd /srv/salt/prod/modules/keepalived/ && mkdir files
[root@linux-node1 /srv/salt/prod/modules/keepalived/files]# ls #把keepalived的安装包和配置,启动文件拷贝过来
keepalived-1.2.23.tar.gz keepalived.init keepalived.sysconfig
[root@linux-node1 /srv/salt/prod/modules/keepalived]# cat install.sls #编辑安装配置文件
{% set keepalived_tar = 'keepalived-1.2.23.tar.gz' %} #使用jinja模版定义变量
{% set keepalived_source = 'salt://modules/keepalived/files/keepalived-1.2.23.tar.gz' %}
keepalived-install:
file.managed:
- name: /usr/local/src/{{ keepalived_tar }}
- source: {{ keepalived_source }}
- mode: 755
- user: root
- group: root
cmd.run:
- name: cd /usr/local/src && tar zxf {{ keepalived_tar }} && cd keepalived-1.2.23 && ./configure --prefix=/usr/local/keepalived --disable-fwmark && make && make install
- unless: test -d /usr/local/keepalived
- require:
- file: keepalived-install
/etc/sysconfig/keepalived:
file.managed:
- source: salt://modules/keepalived/files/keepalived.sysconfig
- mode: 644
- user: root
- group: root
/etc/init.d/keepalived:
file.managed:
- source: salt://modules/keepalived/files/keepalived.init
- mode: 755
- user: root
- group: root
keepalived-init:
cmd.run:
- name: chkconfig --add keepalived
- unless: chkconfig --list | grep keepalived
- require:
- file: /etc/init.d/keepalived
/etc/keepalived:
file.directory:
- user: root
- group: root
[root@linux-node1 /srv/salt/prod/modules/keepalived]# salt '*' state.sls modules.keepalived.install saltenv=prod #执行安装命令
[root@linux-node1 /srv/salt/prod/cluster/files]# cat haproxy-outside-keepalived.conf #keepalived的配置文件
! Configuration File for keepalived
global_defs {
notification_email {
saltstack@example.com #设置报警邮箱,可以设置多个,每行一个
}
notification_email_from keepalived@example.com #设置邮件的发送地址
smtp_server 127.0.0.1 #设置smtp server地址
smtp_connect_timeout 30 #设置连接smtp server的超时时间
router_id {{ROUTEID}} #表示运行keepalived服务器的一个标识。发邮件时显示在邮件主题的信息
}
vrrp_instance haproxy_ha {
state {{STATEID}} #指定keepalived的角色
interface eth0 #指定HA监测网络的接口
virtual_router_id 36 #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的
priority {{PRIORITYID}} #优先级,数字越大,优先级越高。在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级
advert_int 1
authentication { #设置验证类型和密码
auth_type PASS #设置验证类型,主要有PASS和AH两种
auth_pass 1111 #设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
}
virtual_ipaddress {
192.168.56.21 #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
}
}
[root@linux-node1 /srv/salt/prod/cluster]# cat haproxy-outside-keepalived.sls #将keepalived与haproxy整合
include:
- modules.keepalived.install
keepalived-server:
file.managed:
- name: /etc/keepalived/keepalived.conf
- source: salt://cluster/files/haproxy-outside-keepalived.conf
- mode: 644
- user: root
- group: root
- template: jinja
{% if grains['fqdn'] == 'linux-node1.example.com' %} #通过grains动态获取主机ipv4地址
- ROUTEID: haproxy_ha
- STATEID: MASTER #定义keepalived角色
- PRIORITYID: 150 #定义优先级
{% elif grains['fqdn'] == 'linux-node2.example.com' %}
- ROUTEID: haproxy_ha
- STATEID: BACKUP
- PRIORITYID: 100
{% endif %}
service.running:
- name: keepalived
- enable: True
- watch:
- file: keepalived-server
[root@linux-node1 /srv/salt/prod/cluster/files]# cat /srv/salt/base/top.sls #修改top file文件
base:
'*':
- init.init
prod:
'linux-node*':
- cluster.haproxy-outside
- cluster.haproxy-outside-keepalived
[root@linux-node1 /srv/salt/prod/cluster]# salt '*' state.highstate #执行
[root@linux-node1 /srv/salt/prod/cluster]# ip ad li | awk -F "[ :]+" 'NR==11{print $3}'
192.168.56.21/32
[root@linux-node2 ~]# ip ad li | awk -F "[ :]+" 'NR==9{print $3}'
192.168.56.12/24 #vip在node1上,不在node2上,把node1上的keepalive关闭看vip会不会飘移
[root@linux-node1 /srv/salt/prod/cluster]# /etc/init.d/keepalived stop
Stopping keepalived (via systemctl):
[root@linux-node2 ~]# ip ad li | awk -F "[ :]+" 'NR==11{print $3}'
192.168.56.21/32 #vip漂移到了node2上,重新启动keepalived vip又会漂移到node1,配置成功

1 评论