saltstack自动化部署Apache安装、nginx源码安装、haproxy实现负载均衡

一、Saltstack简介

saltstack是基于python开发的一套C/S架构配置管理工具,它的底层使用ZeroMQ消息队列pub/sub方式通信,使用SSL证书签发的方式进行认证管理。ZeroMQ使SaltStack能快速在成千上万台机器上进行各种操作。
在SaltStack架构中服务器端叫作Master,客户端叫作Minion,传统C/S架构为:客户端发送请求给服务器端,服务器端接收到请求并且处理完成后再返回给客户端。在SaltStack架构中不仅有传统的C/S架构服务模式,而且有消息队列中的发布与订阅(pub/sub)服务模式。这使得SaltStack应用场景更加丰富。目前在实际环境中一般使用SaltStack的C/S架构进行配置管理。
这里写图片描述

实验环境:虚拟机6.5版本
一台master(server1):172.25.10.1,多台minion(server2、3、4):172.25.10.2/3/4

二、Master与Minion连接

1、在所有主机上配置yum源
注:需要把真机的yum源目录/rhel6放置http默认发布目录下
rhel6:
这里写图片描述

vim /etc/yum.repos.d/rhel-source.repo 
[salt]
name=salt
baseurl=http://172.25.10.250/rhel6
enabled=1
gpgcheck=0
查看yum源配置是否正确
yum repolist

这里写图片描述
2、添加地址解析
每台主机都要有其他3台主机的解析
如server1:

vim /etc/hosts
172.25.10.1 server1
172.25.10.2 server2
172.25.10.3 server3
172.25.10.4 server4

3、Master与Minion初始配置
server1:
安装salt-master服务

[root@server1 ~]# yum install salt-master -y
[root@server1 ~]# cd /etc/salt/
[root@server1 salt]# vim master      ##saltstack master端配置文件,这里不做修改内容,只是查看 

开启服务

[root@server1 salt]# /etc/init.d/salt-master start

server2:
安装salt-minion服务

[root@server2 ~]# yum install salt-minion -y

编辑minion端配置文件

[root@server2 ~]# cd /etc/salt/
[root@server2 salt]# vim minion
 16 master: 172.25.10.1           ##以server1为master

开启服务

[root@server2 salt]# /etc/init.d/salt-minion start

4、Master与Minion认证
1)minion在第一次启动时,会在/etc/salt/pki/minion/(该路径在/etc/salt/minion里面设置)下自动生成minion.pem(private key)和 minion.pub(public key),然后将 minion.pub发送给master。

2)master在接收到minion的public key后,通过salt-key命令accept minion public key,这样在master的/etc/salt/pki/master/minions下的将会存放以minion id命名的 public key,然后master就能对minion发送指令了。

[root@server1 salt]# salt-key -L    ##显示已经或未认证的被控端id,Acceptd Keys为已认证清单,Unaccepted Keys为未认证清单
[root@server1 salt]# salt-key -A    ##接受所有id证书请求
[root@server1 salt]# salt-key -L

这里写图片描述
通过认证后可在master端查看minion端的状态

[root@server1 salt]# salt server2 test.ping
[root@server1 salt]# salt server2 cmd.run hostname
[root@server1 salt]# salt server2 cmd.run 'df -h'

这里写图片描述
查看钥匙
这里写图片描述
这里写图片描述
如要改名,将该目录删除(此情况是在master与minion创建连接之后修改的主机名不生效才做的)
这里写图片描述
5、Master与Minion的连接查看
SaltStack master启动后默认监听4505和4506两个端口。4505(publish_port)为saltstack的消息发布系统,4506(ret_port)为saltstack客户端与服务端通信的端口。如果使用lsof 查看4505端口,会发现所有的minion在4505端口持续保持在ESTABLISHED状态。
查看服务端口
master端:

[root@server1 salt]# netstat -antlp
tcp        0      0 0.0.0.0:4506                0.0.0.0:*                   LISTEN      1475/python2.6      
tcp        0      0 0.0.0.0:4505                0.0.0.0:*                   LISTEN      1468/python2.6  

minion端:

[root@server2 salt]# netstat -antlp
tcp        0      0 172.25.10.2:33556           172.25.10.1:4505            ESTABLISHED 1726/python2.6   

下载lsof监听端口软件监听端口

yum install -y lsof
[root@server1 salt]# lsof -i :4505
[root@server1 salt]# lsof -i :4506

这里写图片描述
下载服务查看进程详细信息

[root@server1 salt]# yum install -y python-setproctitle
[root@server1 salt]# /etc/init.d/salt-master restart

查看进程 ps ax
这里写图片描述

了解YAML
默认的SLS文件的renderer是YAML renderer。YAML是一个有很多强大特性的标记性语言。Salt使用了一个YAML的小型子集,映射非常常用的数据结构,像列表和字典。YAML renderer的工作是将YAML数据格式的结构编译成为Python数据结构给Salt使用。
规则一: 缩进
YAML使用一个固定的缩进风格表示数据层结构关系。Salt需要每个缩进级别由两个空格组成。不要使用tabs。
规则二: 冒号
Python的字典当然理所当然是简单的键值对。其他语言的用户应该知道这个数据类型叫哈希表或者关联数组。
字典的keys在YAML中的表现形式是一个以冒号结尾的字符串。Values的表现形式冒号下面的每一行,用一个空格隔开:
规则三: 短横杠
想要表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一列表的一部分。

三、一键部署apache安装

1、master端配置安装http
server1:
在master上面定义salt的主目录,默认是在/srv/salt/下面

[root@server1 salt]# vim master  
取消注释
 534 file_roots:      #文件的根目录
 535   base:
 536     - /srv/salt

重启服务

[root@server1 salt]# /etc/init.d/salt-master restart

新建默认目录

[root@server1 salt]# mkdir /srv/salt
[root@server1 salt]# cd /srv/salt/

新建httpd目录

[root@server1 salt]# mkdir httpd
[root@server1 salt]# cd httpd/

部署安装httpd并使开机自启

[root@server1 httpd]# vim install.sls
apache-install:     #安装apache
  pkg.installed:    #定义使用(pkg state module)
    - pkgs:
      - httpd       #安装httpd
      - php         #安装php
  service.running:  #httpd服务运行  
    - name: httpd
    - enable: True  #开机重启
    - reload: True  #重启服务

运行sls文件

[root@server1 httpd]# salt server2 state.sls httpd.install

2、minion端查看安装情况
在server2(minion端)中查看是否安装

[root@server2 salt]# rpm -q httpd 
[root@server2 salt]# rpm -q php

这里写图片描述
查看httpd端口

[root@server2 salt]# netstat -antlp
tcp        0      0 :::80                       :::*                        LISTEN      2023/httpd  

查看是否开机自启

[root@server2 salt]# chkconfig --list httpd

3、配置修改httpd修改端口
server1:在httpd目录下新建目录

[root@server1 httpd]# mkdir files

server2:将httpd配置文件传至该目录

[root@server2 salt]# scp /etc/httpd/conf/httpd.conf server1:/srv/salt/httpd/files

server1:编辑httpd配置文件,修改端口

[root@server1 httpd]# cd files/
[root@server1 files]# vim httpd.conf 
 136 Listen 8080

这时可以发现修改过后的master端中的http配置文件与原Minion端配置文件不同

[root@server1 files]# md5sum httpd.conf 
b7ca7a0e786418ba7b5ad84efac70265  httpd.conf
[root@server2 salt]# md5sum /etc/httpd/conf/httpd.conf 
27a5c8d9e75351b08b8ca1171e8a0bbd  /etc/httpd/conf/httpd.conf

编辑安装文件

[root@server1 httpd]# vim install.sls
apache-install:
  pkg.installed:
    - pkgs:
      - httpd
      - php

  file.managed:    #执行文件
    - name: /etc/httpd/conf/httpd.conf       #文件的名称
    - source: salt://httpd/files/httpd.conf  #文件的来源
    - mode: 644    #文件权限
    - usr: root    #以指定用户执行该文件

  service.running:      #执行命令
    - name: httpd
    - enable: True
    - reload: True 
    - watch:            #在某个state变化时运行此模块,文中的配置,相关文件变化后,立即执行相应操作 
      - file: apache-install

执行sls文件

[root@server1 httpd]# salt server2 state.sls httpd.install

拓展:后缀来源
这里写图片描述
在minion端查看端口:已改为8080

[root@server2 salt]# netstat -antlp
tcp        0      0 :::8080                     :::*                        LISTEN      2023/httpd  

拓展:
此外文件内容还有2种编写方式:

1、
apache-install:
  pkg.installed:
    - pkgs:
      - httpd
      - php

  service.running:
    - name: httpd
    - enable: True
    - reload: True
    - watch:
      - file: /etc/httpd/conf/httpd.conf

/etc/httpd/conf/httpd.conf:
  file.managed:
    - source: salt://httpd/files/httpd.conf
    - mode: 644
    - user: root
2、
httpd:
  pkg.installed

php:
  pkg.installed

apache:
  service.running:
    - name: httpd
    - enable: True
    - reload: True
    - watch:
      - file: /etc/httpd/conf/httpd.conf

/etc/httpd/conf/httpd.conf:
  file.managed:
    - source: salt://httpd/files/httpd.conf
    - mode: 644
    - user: root

四、一键部署nginx源码安装

重新打开一个6.5虚拟机server3
1、server1(master端)认证server3(minion端配置)
server3:
配置yum源:文章开头
安装服务

[root@server3 ~]# yum install salt-minion -y

编写配置文件

[root@server3 ~]# cd /etc/salt/
[root@server3 salt]# vim minion
 16 master: 172.25.10.1

开启服务

[root@server3 salt]# /etc/init.d/salt-minion start

server1:

[root@server1 ~]# salt-key -a server3   #接受单个id证书请求

这里写图片描述
在server3的/mnt下放置Nginx安装包

[root@server3 salt]# cd /mnt/
[root@server3 mnt]# ls
nginx-1.14.0.tar.gz

这里写图片描述
2、nginx建立目录(将sls文件分门别类,需要哪些功能执行哪个sls文件)
默认目录下建立Nginx目录

[root@server1 salt]# mkdir nginx

到nginx目录下再建立一个目录

[root@server1 salt]# cd nginx/
[root@server1 nginx]# mkdir files

将server3的nginx安装包和nginx脚本还有nginx配置文件传至该目录

[root@server1 nginx]# cd files/
[root@server1 files]# ls
nginx-1.14.0.tar.gz、nginx脚本、nginx.conf

3、nginx的一键部署文件
nginx的用户设置

[root@server1 salt]# mkdir users
[root@server1 salt]# cd users/
[root@server1 users]# vim nginx.sls 
nginx-group:
  group.present:
    - name: nginx
    - gid: 800

nginx-user:
  user.present:
    - name: nginx
    - uid: 800
    - gid: 800
    - shell: /sbin/nologin
    - createhome: False
    - home: /usr/local/nginx

nginx的依赖性安装

[root@server1 salt]# mkdir pkgs
[root@server1 salt]# cd pkgs/
[root@server1 pkgs]# vim make.sls 
make-gcc:
  pkg.installed:
    - pkgs:
      - pcre-devel
      - openssl-devel
      - gcc

安装nginx(解决依赖性、源码编译安装Nginx)

[root@server1 salt]# cd nginx/
[root@server1 nginx]# vim install.sls 
include:             ##包含某个文件,可以继承相关模块配置,而不必重新编写
  - pkgs.make

nginx-install:
  file.managed:
    - name: /mnt/nginx-1.14.0.tar.gz
    - source: salt://nginx/files/nginx-1.14.0.tar.gz

  cmd.run:    ##执行编译和配置的过程
    - name: cd /mnt && tar zxf nginx-1.14.0.tar.gz && cd nginx-1.14.0 && sed -i.bak 's/#define NGINX_VER          "nginx\/" NGINX_VERSION/#define NGINX_VER          "nginx"/g' src/core/nginx.h && sed -i.bak 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio &> /dev/null && make &> /dev/null && make install &> /dev/null
    - creates: /usr/local/nginx   ##最终安装目录

注:如果想重新一键安装,将/usr/local 目录下的/nginx目录删除即可
一键部署nginx(包括解决依赖性、安装、用户设置、启动进程)

include:
  - users.nginx
  - nginx.install

/usr/local/nginx/conf/nginx.conf:
  file.managed:
    - source: salt://nginx/files/nginx.conf


nginx-service:
  file.managed:
    - name: /etc/init.d/nginx
    - source: salt://nginx/files/nginx
    - mode: 755
  service.running:
    - name: nginx
    - reload: True
    - watch:
      - file: /usr/local/nginx/conf/nginx.conf

执行sls文件,令server3一键部署Nginx

salt server3 state.sls nginx.service

部署完后查看端口

netstat -antlp
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      7432/nginx       

查看进程ps ax
查看用户id nginx
这里写图片描述
五、一键部署haproxy负载均衡
1、server1(master端)配置
server1:
安装minion服务

yum install slat-minion

编辑minion配置文件

[root@server1 nginx]# cd /etc/salt/
[root@server1 salt]# vim minion
 16 master: 172.25.10.1

启动服务

[root@server1 salt]# /etc/init.d/salt-minion start

添加自己认证

[root@server1 salt]# salt-key -L
[root@server1 salt]# salt-key -a server1

这里写图片描述
配置yum源(haproxy需要)

[root@server1 salt]# vim /etc/yum.repos.d/rhel-source.repo 
[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.10.250/rhel6.5/LoadBalancer
gpgcheck=0

2、安装haproxy
新建haproxy目录

cd /srv/salt/
[root@server1 salt]# mkdir haproxy
[root@server1 salt]# cd haproxy/

编辑安装haproxy sls文件

[root@server1 haproxy]# vim install.sls
haproxy-install:
  pkg.installed:
    - pkgs:
      - haproxy

执行文件

[root@server1 haproxy]# salt server1 state.sls haproxy.install

查看haproxy能否开启,检查配置是否正确

[root@server1 files]# /etc/init.d/haproxy start
[root@server1 files]# /etc/init.d/haproxy stop

3、一键部署haproxy轮循
先将haproxy配置文件移到指定目录

[root@server1 haproxy]# cd /etc/haproxy/
[root@server1 haproxy]# ls
haproxy.cfg

新建目录

[root@server1 haproxy]# mkdir /srv/salt/haproxy/files

将haproxy配置文件移到该新建目录下

[root@server1 haproxy]# cp haproxy.cfg /srv/salt/haproxy/files/

配置haproxy轮循
编辑haproxy配置文件

[root@server1 haproxy]# cd files/
[root@server1 files]# vim haproxy.cfg 
 63 frontend  main *:80          # 监听80端口
 64     default_backend             app
 65 
 66 backend app  
 67     balance     roundrobin   #轮循机制
 68     server  app1 172.25.10.2:80 check  #2和3进行轮循   
 69     server  app2 172.25.10.3:80 check

这里写图片描述
安装且运行haproxy服务、加载haproxy配置文件

[root@server1 haproxy]# cd /srv/salt/haproxy/
[root@server1 haproxy]# vim 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@server1 files]# salt server1 state.sls haproxy.install

查看端口

[root@server1 files]# netstat -antlp
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      20718/haproxy 

一键部署haproxy轮循

[root@server1 salt]# vim top.sls  #top.sls 默认从 base 标签开始解析执行,下一级是操作的目标
base:
  'server1':
    - haproxy.install
  'server2':
    - httpd.install
  'server3':
    - nginx.service

新建httpd的默认发布文件

[root@server2 conf]# vim /var/www/html/index.html 
server2

测试主机连通性:以下命令执行效果一样

[root@server1 salt]# salt server? test.ping
[root@server1 salt]# salt server* test.ping
[root@server1 salt]# salt server[1,2,3] test.ping
[root@server1 salt]# salt '*' test.ping

这里写图片描述
执行文件

[root@server1 salt]# salt '*' state.highstate  ##state.highstate会读取所有环境(包括base环境)的top.sls文件,并且执行top.sls文件内容里面定义的sls文件,不在top.sls文件里面记录的sls则不会被执行;

注意:httpd、nginx、haproxy的端口都需为80

浏览器输入172.25.10.1刷新查看轮循
这里写图片描述
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值