一.什么是salt
Salt 是:
一个配置管理系统,能够维护预定义状态的远程节点(比如,确保指定的报被安装,指定的服务在运行)
一个分布式远程执行系统,用来在远程节点(可以是单个节点,也可以是任意规则挑选出来的节点)上执行命令和查询数据
二.Salt的核心功能
1.使命令发送到远程系统是并行的而不是串行的
2.使用安全加密的协议
3.使用最小最快的网络载荷
4.提供简单的编程接口
Salt同样引入了更加细致化的领域控制系统来远程执行,使得系统成为目标不止可以通过主机名,还可以通过系统属性。
三.salt使用Python客户端接口
为了允许简单的扩展,Salt执行程序可以写为纯Python模块。数据从Salt执行过程中收集到可以发送回master服务端,或者发送到任何任意程序。Salt可以从一个简单的Python API调用,或者从命令行被调用,所以Salt可以用来执行一次性命令,也可以作为一个更大的应用程序的一个组成部分。
1.配置yum源
mv salt /var/www/html/
[rhel-source]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.1.250/source6.5
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[slat]
name=slatstack
baseurl=http://172.25.1.250/salt
gpgcheck=0
1.server1是master端,server2和server3是minion端
在server1上yum install -y salt-master
在sevrer2和server3上yum install -y salt-minion
2.在master端修改配置文件
cd /etc/salt/
vim master
534 file_roots:
535 base:
536 - /srv/salt # 打开注释
537
/etc/init.d/salt-master start
netstat -antlp # 查看端口是否打开
4505端口:用来链接slave,发布订阅
4506端口:请求响应,模式为:zmq(消息队列)
3.在minion端修改配置文件(server2)
cd /etc/salt/
vim minion
16 master: 172.25.1.1 # 指向的master端
/etc/init.d/salt-minion start # 打开服务后生成一个minion.id文件
# 如果修改ip或者hostname的话,必须删除该文件重新生成
4.在master添加minion(master和minion交换公钥的过程)
salt-key -L
salt-key -A # 添加显示的所有主机
5.分别在master和minion端查看两者的公钥
master:
miniso:
6.交换公钥完成之后,在master端可以直接调用python方法查看server2中的信息
四.配置自动化部署
(一)安装httpd服务
1.修改master端的配置文件
cd /etc/salt/
vim master
534 file_roots:
535 base:
536 - /srv/salt # 这个目录没有,自己建立
mkdir /srv/salt
/etc/init.d/salt-master restart
2.配置自动化安装httpd的脚本
mkdir /srv/salt
cd /srv/salt/
mkdir httpd
cd httpd
vim apache.sls
apache-install: # 在该文件中唯一的名字
pkg.installed: # 调用pki模块的installed方法
- pkgs:
- httpd # 安装httpd
- php # 安装php
3.测试脚本的运行
salt server2 state.sls httpd.apache
httpd和php已经安装
(二)自动重启httpd服务,更改httpd的默认端口
1.在minion端将httpd服务的配置文件发送给master
scp httpd.conf server1:/srv/salt/httpd/files
mkdir files #在master中建立目录,保存配置文件
scp httpd.conf server1:/srv/salt/httpd/files # 将server2的httpd配置文件放在files下
vim httpd.conf # 编辑配置文件,修改httpd服务的端口为8080
2.编辑自动化加载配置文件的脚本
pkg.installed:
- pkgs:
- httpd
- php
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://httpd/files/httpd.conf
- mode: 644
- user: root
service.running:
- name: httpd
- enable: True
- reload: True
- watch:
- file: apache-install
3.执行自动化脚本
server2中的httpd原始端口
4.在minino端查看httpd的端口是否改变
(三)salt源码编译安装nginx
1.在master端:
mkdir /srv/salt/nginx/files
cd files # 将nginx的源码包放进去
vim /srv/salt/nginx/install.sls
nginx-install:
pkg.installed:
- pkgs:
- gcc
- pcre-devel
- openssl-devel # 安装源码编译的依赖项
file.managed:
- name: /opt/nginx-1.10.1.tar.gz
- source: salt://nginx/files/nginx-1.10.1.tar.gz # 源码包存放的位置
cmd.run:
- name: cd /opt && tar zxf nginx-1.10.1.tar.gz && cd nginx-1.10.1 && sed -i.bak 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && sed -i.bak 's/#define NGINX_VER "nginx\/" NGINX_VERSION/#define NGINX_VER "nginx"/g' src/core/nginx.h && ./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 # 检验条件,当存在这个目录时,就不再编译安装
2.执行脚本
salt server3 state.sls nginx.install
3.在server3中查看是否已经安装nginx
(四)salt自动重新加载nginx的配置文件
1.编辑自动建立nginx用户的sls文件
cd /srv/salt
mkdir users
vim users/
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.编辑自动加载nginx配置文件的sls文件
cd /srv/salt/nginx/ vim service.sls
include:
- users.nginx # 调用nginx的建立用户
- nginx.install # 调用nginx的安装
/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
3.执行service.sls文件
nginx用户生成:
nginx脚本加在指定位置:
五.saltstack一键部署负载均衡集群
1.在salt上的master端安装salt-minion,把server1也当作一个minion
2.将server1这个节点也与自身的master节点交换密钥
3.在/srv/salt下创建haproxy目录
mkdir haproxy
cd haproxy
vim install.sls
haproxy-install:
pkg.installed:
- pkgs:
- haproxy # 安装haproxy
-
4.将haproxy的配置文件发送到haproxy下的files下
5.编辑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
6.将server2上的haproxy配置文件发送到server1salt目录下,编辑haproxy的配置文件:
vim/srv/salt/haproxy/files/haproxy.cfg
最后部分:
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend main *:80
default_backend app
backend app
balance roundrobin # 调度算法
server app1 172.25.1.2:80 check # 后端服务器
server app2 172.25.1.3:80 check # 后端服务器
6.在base(/etc/salt)目录下,编辑top.sls
base:
'server1':
- haproxy.install # 在server1上安装haproxy
'server2':
- httpd.install # 在server2上安装httpd
'server3':
- nginx.service # 在servre3上安装nginx
7.调用salt ‘’ state.highstate 代表所有minion节点
server1:
server2:
server3:
8.在浏览器中输入172.25.1.1,出现负载均衡轮询
六.grains和pillar
saltstack的两个重要数据系统组件grains和pillar,这两个组件都是用来做数据系统的,用来取客户端基本信息数据或主控端数据。区别在于:
—–grains是minion第一次启动的时候采集的静态数据,可以用在salt的模块和其他组件中。其实grains在每次的minion启动(重启)的时候都会采集,即向master汇报一次的
—–pillar是随时可变的,只要在master端修改了那一般都会立刻生效的
(一)grains
1.在server2的minion配置文件中打开grains
120 grains:
121 roles:
122 apach # 定义角色为apach
重启服务:/etc/init.d/salt-minion restart
在master端:salt ‘*’ grains.item roles查看所有minion的键值。
2.设置grain的方法2
在server3中vim /etc/salt/grains
roles:
nginx
在master端:
salt '*' grains.item roles # 还没有出现server3的角色
salt server3 saltutil.sync_grains # 刷新
salt '*' grains.item roles
3.设置grain3的方法3
在server1上:
cd /srv/salt
mkdir _grains
cd _grains
vim my_grains.py
#!/usr/bin/env/python
def my_grains():
grains = {}
grains['hello'] = 'world' # 键和值组成的键值对
grains['salt'] = 'stack'
return grains
在server1端将该py文件传送给server2
在server2中的缓存目录下可以看到该py文件
在server1中查看查看对应的键值
4.grains优先级
(1). /etc/salt/grains
(2) /etc/salt/minion
(3)./srv/salt/_grains/ master端_grains目录下
优先级顺序依次为存在在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
694 pillar_roots:
695 base:
696 - /srv/pillar
2.重启master服务
/etc/init.d/salt-master restart
3.刷新锁与节点的pillar
salt '*' saltutil.refresh_pillar
4.编辑存储pillar键值对的文件
mkdir /srv/pillar
mkdir web
vim install.sls
{% if grains['fqdn'] == 'server2' %}
webserver: httpd
{% elif grains['fqdn'] == 'server3' %}
webserver: nginx
{% endif %}
vim /srv/pillar/top.sls
base:
'*':
- web.install
七.jinja模块的使用
方法一
1.在server1的httpd.install中编写jinja模版
apache-install:
pkg.installed:
- pkgs:
- httpd
- php
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://httpd/files/httpd.conf
- mode: 644
- user: root
- template: jinja
- context:
bind: 172.25.1.2
port: 8080 # 以键值对的形式存储bind和port
service.running:
- name: httpd
- enable: True
- reload: True
- watch:
- file: apache-install
2.在server1的httpd配置文件中编辑要更新的端口或接口
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文件中
apache-install:
pkg.installed:
- pkgs:
- httpd
- php
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://httpd/files/httpd.conf
- mode: 644
- user: root
- template: jinja
- context:
bind: {{ grains['ipv4'][-1] }} # python中的列表切片
port: 8080
service.running:
- name: httpd
- enable: True
- reload: True
- watch:
- file: apache-install
2.salt server2 state.sls httpd.install
pillar:
1.cd /srv/pillar/web
vim install.sls
{% if grains['fqdn'] == 'server2' %}
webserver: httpd
bind: 172.25.1.2
port: 80
{% elif grains['fqdn'] == 'server3' %}
webserver: nginx
{% endif %}
2.在httpd的配置文件中:
Listen {{ pillar[‘bind’] }}:{{ port }}
互相交叉使用:
在httpd配置文件中Listen {{ grains[‘ipv4’][-1] }}:{{ port }}