一.saltstack简介
官网:https://docs.saltstack.com/en/latest/
salt stack 是什么?
salt是一种新型的基础架构管理方法。容易的在几分钟之内即可配置运行,可伸缩的足以管理成千上万的服务器,足够快的在几秒只内完成沟通。Salt通过分发一个动态的配置接口,可以被用来,配置,远程执行,配置管理等等。
特点:
Saltstack是基于python开发的一套C/S架构配置管理工具
• 使用SSL证书签方的方式进行认证管理
• 底层使用ZeroMQ消息队列pub/sub方式通信
– 号称世界上最快的消息队列ZeroMQ能快速在成千上万台主机上进行各种操作
– 采用RSA Key方式确认身份
主要功能:
Saltstack最主要的两个功能是:配置管理与远程执行
• Saltstack不只是一个配置管理工具,还是一个云计算与数据中心架构编排的利器
• Saltstack已经支持Docker相关模块
• 在友好地支持各大云平台之后,配合Saltstack的Mine实时发现功能可以实现各种云平台业务的自动扩展
saltstack架构
Saltstack基于C/S架构
– 服务器端称作Master
– 客户端称作Minion
• 可以实现传统处理方式,即:客户端发送请求给服务器,服务器收到请求后处理请求,再将结果返回
• 也可以使用消息队列中的发布与订阅(pub/sub)服务模式
saltstack工作机制
Master和Minion都以守护进程的方式运行
• Master监听配置文件里定义的ret_port(接收minion请求),和publish_port(发布消息)的端口
• 当Minion运行时,它会自动连接到配置文件里定义的Master地址ret_port端口进行连接认证
• 当Master和Minion可以正常通信后,就可以进行各种各样的配置管理工作了
二.saltstack的安装
实验用rhel6.5虚拟机,server{1..3} ip :172.25.254.{1..3}
- 下载slatstacke软件包到真机/var/www/html
- 在各个虚拟机上配置yum源
[rhel-source]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.254.61/rhel6.5
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[saltstack]
name=saltstack
baseurl=http://172.25.254.61/rhel6
enabled=1
gpgcheck=0
如果有这个错误:
http://172.25.254.61/rhel6/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 403 Forbidden"
解决办法
[root@foundation61 rhel6]# chmod 755 -R rhel6
3.配置salt的master端和slave端,server1上安装python-setproctitle,因为saltstack是基于python的,必须有python环境,安装主master:
[root@server1 ~]# yum install python-setproctitle
[root@server1 ~]# yum install -y salt-master
[root@server1 ~]# /etc/init.d/salt-master start
Starting salt-master daemon: [ OK ]
修改master的配置文件:
[root@server1 ~]# cd /etc/salt/
[root@server1 salt]# vim minion #去掉注释
537 file_roots:
538 base:
539 - /srv/salt/
[root@server1 salt]# /etc/init.d/salt-master restart
Stopping salt-master daemon: [ OK ]
Starting salt-master daemon: [ OK ]
4.在server2上安装客户端
[root@server2 salt]# yum install -y salt-minion
[root@server2 ~]# cd /etc/salt/
[root@server2 salt]# vim minion #指向master端
16 master: 172.25.254.1
[root@server2 salt]# /etc/init.d/salt-minion start #离开器服务会生成一个minion.id文件,如果中入更改主机名,salt并不会识别你更改的主机名,所以你必须删除minion.id重启服务,根据新的主机名重新生成文件
5.查看端口
netstat -antlp
4505端口:用来链接slave,发布订阅
4506端口:请求响应,模式为:zmq(消息队列)
lsof -i :4506 查看端口
6.在master上添加minion端(交换公钥的过程)
salt-key -L #显示所有可以添加的主机
salt-key -A # 添加显示的所有主机
7.分别在master和minion端查看两者的公钥
8.交换公钥完成之后,在master端可以直接调用python方法查看server2中的信息
三.配置自动化部署
(一).安装httpd服务
1.修改master端的配置文件,如上,去掉了注释
2.建立目录,建立/srv/salt/,和http的目录
[root@server1 ~]# cd /etc/salt/
[root@server1 salt]# vim master #取消注释
[root@server1 salt]# mkdir /srv/salt
[root@server1 salt]# /etc/init.d/salt-master restart
Stopping salt-master daemon: [ OK ]
Starting salt-master daemon: [ OK ]
[root@server1 ]# cd /srv/salt/
[root@server1 salt]# mkdir apache
[root@server1 apache]# ls
[root@server1 apache]# vim install.sls
apache-install:
pkg.installed:
- pkgs:
- httpd
- php
- php-mysql
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/files/httpd.conf
- mode: 644
- user: root
- group: root
[root@server1 apache]# mkdir files
[root@server2 salt]# scp /etc/httpd/conf/httpd.conf server1:/srv/salt/apache/files
[root@server1 apache]# cd files/
[root@server1 files]# vim httpd.conf #改端口为8080
[root@server1 apache]# salt server2 state.sls apache.install
3.Server2上安装http成功,端口也是8080
(二)salt源码安装nginx
1.Server1中写入脚本,执行,在server3上安装nginx
2.在server1中:
mkdir /src/salt/nginx/
cd /src/salt/nginx
mkdir files # files目录中存放nginx源码包
vim nginx.sls # 进行nginx源码安装的时候,首先安装依赖包;
再发送源码包,最后进行源码包的解压
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_sub_module --with-threads --with-file-aio &> /dev/null && make &> /dev/null && make install &> /dev/null #根据我们对nginx的安装,解压之后,修改 src/core/nginx.h 文件去掉版本号,auto/cc/gcc 注释,编译,make&&make install
- creates: /usr/local/nginx #创建/usr/local/nginx 目录
说明
pkgs.make 包的内容:
[root@server1 salt]# cd pkgs/
[root@server1 pkgs]# ls
make.sls
[root@server1 pkgs]# vim make.sls
[root@server1 pkgs]# cat make.sls
gcc-make:
pkg.installed:
- pkgs:
- gcc
- pcre-devel
- openssl-devel
3.推送nginx脚本,在server3上安装nginx
server3上安装nginx成功
(三)salt自动重新加载nginx配置文件
1.编辑自动建立nginx用户的sls文件
[root@server1 salt]# cd /srv/salt/
[root@server1 salt]# mkdir 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
2.安装文件的脚本
[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_sub_module --with-threads --with-file-aio &> /dev/null && make &> /dev/null && make install &> /dev/null
- creates: /usr/local/nginx
3.重启服务的脚本和建立用户脚本
[root@server1 nginx]# vim service.sls
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
- enable: True
- reload: True
- watch:
- file: /usr/local/nginx/conf/nginx.conf
4.执行安装并开启建立用户,用于启动服务,在server3中检测,开启nginx服务
[root@server1 nginx]# salt server3 state.sls nginx.service
server3中开启nginx,查看nginx用户
(四).saltstack一键部署负载均衡集群
1.在server1上安装salt-minion,把server1结点加入minion
2.修改结点,salt-key -A 添加到server1上,salt-key -L 显示添加的结点
3.建立haproxy目录
cd /srv/salt
mkdir haproxy
yum list haproxy #确定haproxy没有安装
cd haproxy
mkdir files
cd files #存放haproxy安装包,这里用的是haproxy-1.6.11.tar.gz
cd ..
vim install.sls #编写安装脚本
haproxy-install:
file.managed:
- name: /mnt/haproxy-1.6.11.tar.gz
- source: salt://haproxy/files/haproxy-1.6.11.tar.gz
salt server1 state.sls haproxy.install
查看/mnt是否存在,存在则推送成功
cd /mnt
ls
tar zxf haproxy-1.6.11.tar.gz
cd haproxy-1.6.11
源码编译
less README 查看编译要加的参数
4.继续写install.sls文件
[root@server1 haproxy]# cat install.sls
include:
- pkgs.make
- users.haproxy
haproxy-install:
file.managed:
- name: /mnt/haproxy-1.6.11.tar.gz
- source: salt://haproxy/files/haproxy-1.6.11.tar.gz
cmd.run:
- name: cd /mnt && tar zxf haproxy-1.6.11.tar.gz && cd haproxy-1.6.11 && make TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 PREFIX=/usr/local/haproxy && make ARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 PREFIX=/usr/local/haproxy install
- creates: /usr/local/haproxy
/etc/haproxy: #修改文件权限
file.directory:
- mode: 755
/usr/sbin/haproxy: #软连接,自启动脚本
file.symlink:
- target: /usr/local/haproxy/sbin/haproxy
5.写安装脚本
[root@server1 haproxy]# cat service.sls
include:
- haproxy.install
- users.haproxy
/etc/haproxy/haproxy.cfg:
file.managed:
- source: salt://haproxy/files/haproxy.cfg
haproxy_service:
file.managed:
- name: /etc/init.d/haproxy
- source: salt://haproxy/files/haproxy.init
- mode: 755
service.running:
- name: haproxy
- enable: True
- reload: True
- watch:
- file: /etc/haproxy/haproxy.cfg
[root@server1 haproxy]# ll /usr/sbin/haproxy
lrwxrwxrwx 1 root root 31 Nov 8 10:03 /usr/sbin/haproxy -> /usr/local/haproxy/sbin/haproxy
6.启动脚本,放到指定位置
[root@server1 haproxy]# cd /mnt/haproxy-1.6.11/examples/
[root@server1 examples]# cp haproxy.init content-sw-sample.cfg /srv/salt/haproxy/files/
[root@server1 examples]# cd /srv/salt/haproxy/files/
[root@server1 files]# mv content-sw-sample.cfg haproxy.cfg
[root@server1 files]# ls
haproxy-1.6.11.tar.gz haproxy.cfg haproxy.init
修改haproxy的配置文件
vim/srv/salt/haproxy/files/haproxy.cfg
global
maxconn 10000
stats socket /var/run/haproxy.stat mode 600 level admin
log 127.0.0.1 local0
uid 200
gid 200
chroot /var/empty
daemon
defaults
mode http
log global
option httplog
option dontlognull
monitor-uri /monitoruri
maxconn 8000
timeout client 30s
retries 2
option redispatch
timeout connect 5s
timeout server 30s
timeout queue 30s
stats uri /admin/stats
# The public 'www' address in the DMZ
frontend public
bind *:80 name clear
default_backend dynamic
backend dynamic
balance roundrobin
fullconn 4000
server dynsrv1 172.25.254.2:80 check inter 1000
server dynsrv2 172.25.254.3:80 check inter 1000
7.创建haproxy用户
[root@server1 salt]# cd users/
[root@server1 users]# ls
haproxy.sls nginx.sls
[root@server1 users]# cat haproxy.sls
haproxy-group:
group.present:
- name: haproxy
- gid: 200
haproxy:
user.present:
- uid: 200
- gid: 200
- home: /usr/local/haproxy
- createhome: False
- shell: /sbin/nologin
写完之后记着要在server1的install.sls加入- users.haproxy
8.推送
测试:
saltstack不仅可以用于一键部署服务,还可以远程监控主机
salt server3 grains.items #查看server3的所有信息
[root@server1 ~]# salt server3 grains.item os #查看系统信息 redhat
server3:
----------
os:
RedHat
[root@server1 ~]# salt server3 grains.item ip #查看ip
server3:
----------
ip:
[root@server1 ~]# salt server3 grains.item ipv4 #查看ipv4
server3:
----------
ipv4:
- 127.0.0.1
- 172.25.254.3
[root@server1 ~]# salt server3 grains.item ipv6 #查看ipv6
server3:
----------
ipv6:
- ::1
- fe80::5054:ff:fee5:12c6
[root@server1 ~]# salt -G 'os:redhat' cmd.run hostname
server1:
server1
server3:
server3
server2:
server2
(五)grains和pillar
saltstack的两个重要的数据系统组建grains和pillar,这两个组建都是用来做数据系统的,用来获取客户端基本信息数据或主控端数据。区别在于:
- grains是minion第一次启动时采集的静态数据,可以用在salt的模块和其他组件中。器是grains在每一次的minion启动,加载的时候会采集数据,向master汇报一次
- pillar是动态,只要在master端修改六一般会立即生效,不需要重启
(一)grains
1.在server2的minion端配置文件中打开grains
重启服务:[root@server2 ~]# /etc/init.d/salt-minion restart
在master端:[root@server1 ~]# salt '*' grains.item roles
2.设置grains的第二种方式
在sever3中
[root@server3 ~]# cd /etc/salt/
[root@server3 salt]# vim grains
[root@server3 salt]# cat grains
roles: nginx
在master中:
salt '*' grains.item roles # 还没有出现server3的角色
salt server3 saltutil.sync_grains # 刷新
salt '*' grains.item roles
3.方法三:设置grains
[root@server1 ~]# cd /srv/salt/
[root@server1 salt]# vim _grains/my_grains.py
[root@server1 salt]# cat _grains/my_grains.py
#!/usr/bin/env pyrhon
def my_grains():
grains = {}
grains['hello'] = 'world'
grains['salt'] = 'satck'
return grains
[root@server1 _grains]# salt server3 saltutil.sync_grains #在server1端将该py文件传送给server3
server3:
- grains.my_grains
在server3中的缓存目录下可以看到该py文件
在server1中查看查看对应的键值
4.grains优先级
- /etc/salt/grains
- /etc/salt/minion
- /srv/salt/_grains/ master端_grains目录下
优先级顺序依次为minion端的minion端/etc/salt/minion配置文件中的同名grains会覆盖/etc/salt/grains文件中的值,而通过master端_grains目录下grains文件下发的值可以会覆盖minion端的所有同名值。
(二)pillar
Pillar用于给特定的 minion 定义任何你需要的数据, 这些数据可以被Salt的其他组件使用!安全起见,有些数据是不可以共享出来的,需要指定。比如高度敏感的数据:通过pillar传输的数据会保证只向选定的minions展现,这使得pillar可以作为Salt中管理安全信息的引擎,比如加密的key和密码。
1.编辑/etc/salt/master 打开pillar存储路径,默认即可比如/srv/pillar
/etc/init.d/salt-minion restart
2.刷新锁与节点的pillar
[root@server1 salt]# salt '*' saltutil.refresh_pillar
server2:
True
server3:
True
server1:
True
3.编辑存储pillar键值对的文件
[root@server1 salt]# cd ..
[root@server1 srv]# ls
salt
[root@server1 srv]# mkdir pillar
[root@server1 srv]# cd pillar/
[root@server1 pillar]# mkdir web
[root@server1 pillar]# cd web/
[root@server1 web]# vim insatll.sls
[root@server1 web]# vim /srv/pillar/top.sls
[root@server1 web]# cat /srv/pillar/top.sls
base:
'*':
- web.install
[root@server1 web]# cat install.sls
{% if grains['fqdn'] == 'server2' %}
webserver: httpd
{% elif grains['fqdn'] == 'server3' %}
webserver: nginx
{% endif %}
4.在master处查看所有minion的名称(信息)
(六).jinja模块
方法一:
1.在server1的httpd.install中编写jinja模版
- template: jinja
- context:
bind: 172.25.1.2
port: 8080 # 以键值对的形式存储bind和port
2.在server1的http配置文件中编辑要更新的端口或者接口
Listen {{port}} ( Listen 8080 )或
Listen {{ bind }}:{{ port }} (Listen 172.25.1.2:8080)
3.在server端推送,则相应minion的 服务会发生变化
salt server2 state.sls httpd.install
方法二:
lib.sls
1.在httpd下编辑
vim lib.sls
{% set port = 80 %}
2.在httpd配置文件的第一行添加
{% from 'httpd/lib.sls' import port with context %}
3.推送测试
salt server2 state.sls httpd.install
利用grains和prilla推送服务
grains
1.在sevrer1的install.sls文件中
pillar:
1.cd /srv/pillar/web
{% if grains['fqdn'] == 'server2' %}
webserver: httpd
bind: 172.25.254.2
port: 80
{% elif grains['fqdn'] == 'server3' %}
webserver: nginx
{% endif %}
2.在httpd的配置文件中:
Listen {{ pillar[‘bind’] }}:{{ port }}
互相交叉使用:
在httpd配置文件中Listen {{ grains[‘ipv4’][-1] }}:{{ port }}