SaltStck 搭建Web集群运用示例 (一)

简介:

saltstack是一个非常强大的管理工具,使用saltstack会做到标准化的管理,下面就以一个简单的示例来更加具体的了解一下saltstack的功能特性。

使用saltstack来搭建一个简单的web集群,需要完成三个步骤:

1、系统初始化。初始化模块所有的机器环境一致。

2、功能模块:设置单独的目录haproxy nginx  php mysql  memcached.

      功能模块做到尽可能的全,独立。

3、业务模块:根据业务类型划分,如web服务、论坛bbs等


Base基础环境的配置


salt环境配置

创建salt初始化环境:

修改master配置文件,

1
2
3
4
5
6
7
8
9
10
11
# vim /etc/salt/master
file_roots:               #配置基础环境和生产环境两个目录
   base:
     /srv/salt/base
   prod:
     /srv/salt/prod
     
pillar_roots:             #创建pillar环境
   base:
     /srv/pillar/base
     /srv/pillar/prod

创建环境目录:

1
2
3
4
  mkdir  /srv/salt/base
  mkdir  /srv/salt/prod
  mkdir  /srv/pillar/base
  mkdir  /srv/pillar/prod


base基础环境初始化

基础环境的配置项:


  • dns配置

  • history记录时间

  • 记录命令操作

  • 内核参数优化

  • 安装yum仓库

  • 安装zabbix-agent


dns配置,创建dns.sls:

1
2
3
4
5
6
7
8
9
[root@node1  /srv/salt/base/init ] # cat dns.sls 
/etc/resolv .conf:
   file .managed:
     source : salt: //init/files/resolv .conf
     - user: root
     - group: root
     - mode: 644
     
[root@node1  /srv/salt/base/init ] # cp /etc/resolv.conf  files/

history记录时间,创建history.sls:

1
2
3
4
5
[root@node1  /srv/salt/base/init ] # cat history.sls 
/etc/profile :
   file .append:
     - text:
       export  HISTTIMEFORMAT= "%F %T `whoami` "

记录命令操作,创建audit.sls :

1
2
3
4
5
[root@node1  /srv/salt/base/init ] # cat audit.sls 
/etc/bashrc :
   file .append:
     - text:
       export  PROMPT_COMMAND= '{ msg=$(history 1 | { read x y; echo $y; });logger "[euid=$(whoami)]":$(who am i):[`pwd`]"$msg"; }'

内核参数优化,创建sysctl.sls:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@node1  /srv/salt/base/init ] # cat  sysctl.sls 
net.ipv4.ip_local_port_range:
   sysctl.present:
     - value: 10000 65000    #指定本地可用的端口范围
fs. file -max:
   sysctl.present:
     - value: 2000000        #最大文件
net.ipv4.ip_forward:
   sysctl.present:
     - value: 1              #打开转发功能
vm.swappiness:
   sysctl.present:
     - value: 0              #设置尽量不使用交换分区(权重值)

设置epel源,创建yum仓库, 

1
2
3
4
5
[root@node1  /srv/salt/base/init ] # cat epel.sls 
yum_repo_release:
   pkg.installed:
     - sources:
       - epel-release: http: //mirrors .aliyun.com /epel/epel-release-latest-7 .noarch.rpm

创建zabbix-agent模板,这里的安装必须要有对应的yum源,在生产或环境需要有自己的yum源(或zabbix yum源),才能安装上对应的软件包:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@node1  /srv/salt/base/init ] # cat zabbix-agent.sls 
zabbix-agent:
   pkg.installed:
     - name: zabbix-agent
   file .managed:
     - name:  /etc/zabbix/zabbix_agentd .conf
     source : salt: //init/files/zabbix_agentd .conf
     - template: jinja
     - backup: minion    #在文件模块中,对要修改的文件先备份,备份的文件默认在:/var/cache/salt/minion/file_backup/中
     - defaults:
       Zabbix_Server: {{ pillar[ 'Zabbix_Server' ] }}  #被引用的名称A
       Hostname: {{  'grains[fqdn]'  }}   #被应用的名称B
     - require:
       - pkg: zabbix-agent
   service.running:
     enable : True
     watch :
       - pkg: zabbix-agent     #包和文件发生改变就重启服务
       file : zabbix-agent
zabbix_agentd.conf.d:
   file .directory:
     - name:  /etc/zabbix/zabbix_agentd .d
     - watch_in:               #配置目录中发生任何变化都会重启zabbix-agent
       - service: zabbix-agent  
     - require:
       - pkg: zabbix-agent
       file : zabbix-agent

拷贝zabbix的配置文件到file目录,并将pillar参数添加到配置文件的对应位置:

1
2
3
4
5
cp  /etc/zabbix/zabbix_agentd .conf  files/
vim files /zabbix_agentd .conf
#设置对应参数的引用  
Hostname={{ Hostname }}    #设置agent为主动模式,引用B出的参数
Server= {{ Zabbix_Server }}    #此处引用的是A处的Zabbix_Server要使用上面的参数,还需要配置pillar才能使用。


配置pillar base初始化环境

创建一个pillar,

1
2
[root@node1  /srv/pillar/base/zabbix ] # cat agent.sls 
Zabbix_Server: 172.16.10.60

创建pillar的top.sls,指定那些主机运行那些文件:

1
2
3
4
[root@node1  /srv/pillar/base ] # cat top.sls 
base:
   '*' :
     - zabbix.agent

验证pillar的base环境:

1
2
3
4
5
6
7
8
9
[root@node1  /srv/pillar/base ] # salt '*' pillar.items
node2:
     ----------
     Zabbix_Server:
         172.16.10.60
node1:
     ----------
     Zabbix_Server:
         172.16.10.60

验证zabbix配置:

1
[root@node1 ~] # salt '*' state.sls init.zabbix-agent

执行成功并自动修改了zabbix的配置文件则说明设置成功。

配置完上面的这些文件,基础环境就配置好了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@node1  /srv ] # tree
.
├── pillar
│   ├── base
│   │   ├──  top .sls
│   │   └── zabbix
│   │       └── agent.sls
│   ├── prod
│   └──  top .sls
└── salt
     ├── base
     │   └── init
     │       ├── audit.sls
     │       ├── dns.sls
     │       ├── epel.sls
     │       ├── files
     │       │   ├── resolv.conf
     │       │   └── zabbix_agentd.conf
     │       ├──  history .sls
     │       ├── sysctl.sls
     │       └── zabbix-agent.sls
     ├── prod
     └──  top .sls

可以编写一个基础的初始化配置文件,include所有基础的配置:

1
2
3
4
5
6
7
8
[root@node1  /srv/salt/base/init ] # cat init.sls 
include:
   - init.dns
   - init. history
   - init.audit
   - init.sysctl
   - init.epel
   - init.zabbix-agent

然后执行这个主配置文件即可:

1
# salt '*' state.sls init.init

如果定义高级状态进行执行,就要定义使用top file:

1
2
3
4
[root@node1  /srv/salt/base ] # cat top.sls 
base:
   '*' :
     - init.init

执行高级状态:

1
2
# salt '*' state.highstate test=True 验证结果
# salt '*' state.highstate  确认执行

提示:

  • 在对文件进行操作时,为了避免误操作而破坏源文件,生产上所有涉及到文件的管理都要加上"- backup:minion"  参数,自动备份文件,备份的文件默认在/var/cache/salt/minion/file_backup目录。

  • 在对文件执行salt 高级状态时,选对文件进行测试,加 test=True,确认无误后再执行。



Prod环境配置


Haproxy基础环境配置

首先对负载均衡进行一个初始化环境的配置,由于使用haproxy的源码安装方式,所以对prod的基础环境进行配置。

创建分类目录:

1
2
3
4
5
6
[root@node1  /srv/salt/prod ] # mkdir haproxy
[root@node1  /srv/salt/prod ] # mkdir keepalived
[root@node1  /srv/salt/prod ] # mkdir nginx
[root@node1  /srv/salt/prod ] # mkdir php
[root@node1  /srv/salt/prod ] # mkdir memcached
[root@node1  /srv/salt/prod ] # mkdir pkg

编写与编译相关的安装包文件参数:

1
[root@node1  /srv/salt/prod ] # vim pkg/make.sls
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@node1  /srv/salt/prod ] # cat pkg/make.sls
make -pkg:
   pkg.installed:
     - pkgs:
       - gcc
       - gcc-c++
       - glibc
       make
       - autoconf
       - openssl
       - openssl-devel
       - pcre
       - pcre-devel

对于haproxy需要下载源码进行安装,对于安装的编译参数等可以在一台机器上安装验证。同时,需要将安装包和所需要启动脚本的文件放在files文件目录中。

1
[root@node1  /srv/salt/prod/haproxy/files ] # cp /software/haproxy-1.6.6/examples/haproxy.init ./

修改启动脚本haproxy.init中的默认BIN路径:

1
BIN= /usr/local/haproxy/sbin/ $BASENAME

这样在/srv/salt/prod/haproxy/files目录下默认就会有两个文件:

1
2
[root@node1  /srv/salt/prod/haproxy/files ] # ls
haproxy-1.6.6. tar .gz  haproxy.init

编写sls文件,在文件编写haproxy的安装配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[root@node1  /srv/salt/prod/haproxy ] # cat install.sls 
include:
   - pkg. make          # 执行pkg/make.sls文件
haproxy- install :
   file .managed:     #salt状态模块,将source中的文件下载到ID(没有name参数则默认ID)指定的路径
     - name:  /usr/local/src/haproxy-1 .6.6. tar .gz 
     source : salt: //haproxy/files/haproxy-1 .6.6. tar .gz
     - mode: 644
     - user: root
     - group: root
   cmd.run:         # cmd.run状态模块
     - name:   cd  /usr/local/src  &&  tar  xvf haproxy-1.6.6. tar .gz &&  \ 
     cd   haproxy-1.6.6 &&  make  TARGET=linux2628 PREFIX= /usr/local/haproxy-1 .6.6 \
     &&  make  install  PREFIX= /usr/local/haproxy-1 .6.6 && \
     ln  -s  /usr/local/haproxy-1 .6.6  /usr/local/haproxy 
     - unless:  test  -L  /usr/local/haproxy  #如果结果为True,则不执行name指向的命令
     - 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:   # 设置允许linux监听VIP(非本机IP)
   sysctl.present:   
     - value: 1
/etc/haproxy :
   file .directory:   # 目录管理
     - user: root
     - group: root
     - mode: 755

这里有补充两个状态关系:

unless: 用于检查的命令,仅当unless选项指向的命令返回false时才执行name指向的命令

onlyif:  检查的命令,近当onlyif选项指向的命令返回true时才执行name指向的命令


执行salt 命令,完成所有节点的安装,指定环境路径prod,默认为base环境:

1
# salt '*'  state.sls haproxy.install saltenv=prod


业务引用haproxy

为了更加清晰的对服务模块和业务模块区分,可以在prod目录下分两个目录:cluster和modules ,分别对应业务和服务的各个模块,将所有prod下的目录服务包全部mv到modules目录中。

由于重建了目录,所以之前的/srv/salt/prod/modules/haproxy/install.sls 文件需要修改sourse file路径:

1
2
3
4
5
  include:
    - modules.pkg. make
    
  source : salt: //modules/haproxy/files/haproxy-1 .6.6. tar .gz
  source : salt: //modules/haproxy/files/haproxy .init

修改之后的目录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@node1  /srv/salt/prod ] # tree
.
├── cluster
└── modules
     ├── haproxy
     │   ├── files
     │   │   ├── haproxy-1.6.6. tar .gz
     │   │   └── haproxy.init
     │   └──  install .sls
     ├── keepalived
     ├── memcached
     ├── nginx
     ├── php
     └── pkg
         └──  make .sls

执行salt 命令进行测试:

1
# salt '*'  state.sls modules.haproxy.install  saltenv=prod

将集群的业务配置放在cluster/files目录中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[root@node1  /srv/salt/prod/cluster/files ] # cat haproxy-outside.cfg 
global
maxconn 100000
chroot  /usr/local/haproxy
uid 99  
gid 99 
daemon
nbproc 1 
pidfile  /usr/local/haproxy/logs/haproxy .pid 
log 127.0.0.1 local3 info
defaults
option http-keep-alive
maxconn 100000
mode http
timeout connect 5000ms
timeout client  50000ms
timeout server 50000ms
listen stats
mode http
bind 0.0.0.0:8888
stats  enable
stats uri      /haproxy-status 
stats auth    haproxy:saltstack
frontend frontend_www_example_com
bind 172.16.10.62:80
mode http
option httplog
log global
     default_backend backend_www_example_com
backend backend_www_example_com
option forwardfor header X-REAL-IP
option httpchk HEAD / HTTP /1 .0
balance  source
server web-node1  172.16.10.60:8080 check inter 2000 rise 30 fall 15
server web-node2  172.16.10.61:8080 check inter 2000 rise 30 fall 15

修改/srv/salt/prod/modules/haproxy/install.sls 添加开启自启动行为(上面的文件已经添加)

创建haproxy的对外业务配置sls文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@node1  /srv/salt/prod/cluster ] # cat haproxy-outside.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

同时,需要在base环境中修改top file:

1
2
3
4
5
6
7
[root@node1  /srv/salt/base ] # cat top.sls 
base:
   '*' :
     - init.init
prod:
   'node*' :
     - cluster.haproxy-outside

执行salt高级状态,由于haproxy监听80和8888端口,所以先确保这些端口不被占用:

1
2
# salt 'node1' state.highstate test=True  #高级状态指定top file运行
# salt '*' state.highstate

访问监听的8888监控端口:

http://172.16.10.60:8888/haproxy-status 

访问两个节点成功,说明配置成功。


 本文转自 酥心糖 51CTO博客,原文链接:http://blog.51cto.com/tryingstuff/1873040






相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2月前
|
SQL 开发框架 .NET
ASP.NET Web——GridView完整增删改查示例(全篇幅包含sql脚本)大二结业考试必备技能
ASP.NET Web——GridView完整增删改查示例(全篇幅包含sql脚本)大二结业考试必备技能
33 0
|
8月前
|
运维 关系型数据库 MySQL
【运维知识进阶篇】集群架构-Nginx实现基础web架构(Linux+Nginx+PHP+Mysql)(二)
【运维知识进阶篇】集群架构-Nginx实现基础web架构(Linux+Nginx+PHP+Mysql)(二)
202 0
|
5月前
|
负载均衡 监控 算法
百度搜索:蓝易云【HAProxy搭建web集群教程。】
这是一个简单的HAProxy搭建Web集群的教程。在实际应用中,还可以进行更多的配置和优化,以满足你的需求。建议在搭建之前查阅官方文档或参考其他详细的教程以获取更全面的指导。
86 3
百度搜索:蓝易云【HAProxy搭建web集群教程。】
|
7月前
|
弹性计算 Kubernetes 索引
使用Kubectl部署web服务到K8s集群
本场景带您体验如何使用k8s的原生命令kubectl部署一个web应用(魔方应用)的镜像到k8s集群中,并通过Ingress将部署的服务暴露出来由外部访问。
5691 2
|
8月前
|
弹性计算 Kubernetes 容器
使用Kubectl部署web服务到K8s集群
本次基于阿里云实验室提供的实验环境,使用预创建好的创建云服务器ECS和ACK集群资源,实现通过Kubectl部署web服务到K8s集群。
|
8月前
|
运维 关系型数据库 MySQL
【运维知识进阶篇】集群架构-Nginx实现基础web架构(Linux+Nginx+PHP+Mysql)(一)
【运维知识进阶篇】集群架构-Nginx实现基础web架构(Linux+Nginx+PHP+Mysql)
175 0
|
8月前
|
负载均衡 网络协议 Linux
web集群第二次作业
LVS(Linux Virtual Server)是一种高性能、可扩展的负载均衡软件,它可以将客户端请求分发到多个后端服务器上,从而实现负载均衡。LVS支持多种工作模式,其中最常用的是NAT模式和DR模式。这两种模式各有优缺点,下面我将详细介绍他们的特点及适用场景。
55 0
|
11月前
|
Unix 应用服务中间件 Linux
ansible在web集群中批量部署nfs
ansible在web集群中批量部署nfs
154 0
|
11月前
|
存储 Apache
Centos7.7下建立无共享存储的WEB集群(pcs+pacemaker+corosync)
Centos7.7下建立无共享存储的WEB集群(pcs+pacemaker+corosync)
42 0
|
数据采集 JSON API
FastAPI – 一个现代高性能Python Web框架及其示例
FastAPI是一个用于构建API的现代、高性能Python web框架。它使用标准的Python类型提示来支持数据自动验证和API文档自动生成。该框架的一些优点包括速度快、易用性好、自动文档生成、类型注解、异步支持和验证功能。 FastAPI与其他Python框架的不同之处在于,它基于ASGI而非WSGI,支持异步代码。FastAPI还使用Python 3.6+的类型提示来声明参数、请求体、响应模型等,而其他框架需要额外的库或插件来实现数据验证和序列化。
298 0