一、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刷新查看轮循