文章目录
一、salt简介
Salt,,一种全新的基础设施管理方式,部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯。
salt底层采用动态的连接总线, 使其可以用于编配, 远程执行, 配置管理等等。
python的客户端接口:
为了允许简单的扩展,Salt执行程序可以写为纯Python模块。数据从Salt执行过程中收集到可以发送回master服务端,或者发送到任何任意程序。Salt可以从一个简单的Python API调用,或者从命令行被调用,所以Salt可以用来执行一次性命令,也可以作为一个更大的应用程序的一个组成部分。
salt基于消息队列,通信比较快,队列方式适合线程的限流
二、salt的运用
1.环境准备:
安装包的获取可以在salt的官网https://repo.saltstack.com/index.html#rhel上下载,本机使用的salt软件版本是2019.2(Latest)
server1: 172.25.20.1 (salt的master主机)
server2: 172.25.20.2 (salt的客户端主机)
server3:172.25.20.3 (salt的客户端主机)
yum install -y salt-master.noarch python-setproctitle.x86_64
##salt服务主机安装salt-master和一个python服务来通过python对其他节点操作
vim /etc/salt/master ##修改配置文件,修改默认的读取文件的位置,此时/srv/salt/就相当于家目录
systemctl restart salt-master.service
yum install salt-minion -y ##安装客户端服务
vim /etc/salt/minion ##修改配置文件,指向master服务端
systemctl restart salt-minion.service
三台机器都重启服务后,开始测试salt服务:
salt-key -L ##查看接受salt服务端主机可管理的客户端
salt-key -A ##给连接上的客户端奋发key
salt '*' test.ping ##与python很像,调用ping模块来测试主机是否连通
mkdir -p /srv/salt ##建立默认的salt家目录
2.给客户端推送一个apache服务
文件编写例子如下:
vim top.sls ##'*'表示所有主机,apache.install表示apache的安装
base:
'*':
- apache.install
##注意python格式的缩进
salt '*' state.highstate ##高级推送,给所有客户端推送服务
3.给客户端推送一个源码编译安装的nginx示例
cd /srv/salt
mkdir pkgs
vim pkgs/install.sls ##把编译所需要的依赖环境单独写出来
nginx-make:
pkg.installed:
- pkgs:
- gcc
- make
- zlib-devel
- pcre-devel
mkdir nginx
vim nginx/install.sls
{% set nginx_version = '1.16.0' %} ##通过变量调用来设置nginx的版本
include:
- pkgs.install
install-nginx:
file.managed:
- name: /mnt/nginx-{{ nginx_version }}.tar.gz
- source: salt://nginx/files/nginx-{{ nginx_version }}.tar.gz
cmd.run:
- name: cd /mnt && tar zxf nginx-{{ nginx_version }}.tar.gz && cd nginx-{{ nginx_version }} && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx && make && make install
- creates: /usr/local/nginx
vim nginx/service.sls
include:
- nginx.install ##调用nginx.install文件
/usr/local/nginx/conf/nginx.conf:
file.managed:
- source: salt://nginx/files/nginx.conf
service-nginx:
file.managed: ##给nginx写一个systemd的启动脚本,模版参照httpd即可
- name: /usr/lib/systemd/system/nginx.service
- source: salt://nginx/files/nginx.service
service.running: ##当nginx.conf被修改时,reload服务
- name: nginx
- reload: True
- watch:
- file: /usr/local/nginx/conf/nginx.conf
mkdir nginx/files
vim nginx/files/nginx.service ##nginx的systemd的启动脚本编写
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
注意:在推送systemd方式操作nginx之前,需要把刚才以脚本方式启动的nginx关闭,不然systemd无法关闭脚本启动的nginx
salt server3 state.sls nginx.service ##给server3以sls的方式推送nginx服务
3.静态变量的设定方法
首先是变量的获取
salt server2 grains.items ##列出server上的变量和一些变量的内容
salt server3 grains.ls ##只列处变量的名称
salt server2 grains.item nodename ##单独获取某个变量的信息
第一种方法:
在minion上修改配置文件
vim /etc/salt/minion
systemctl restart salt-minion
salt server2 grains.item roles ##可以看到server2的roles里多了apache
第二种:
在minion的配置文件目录下建立一个文件
cd /etc/salt
systemctl restart salt-minion
salt server3 grains.item roles ##server3的roles里多了nginx
此时可以直接通过规则来与server2和server3通信
第三种:
在master主机上的/srv/salt下建立一个_grains目录
编写一个变量模块,发送给客户端即可
4.动态变量的设定
在master的配置文件里打开pillar模块
vim /etc/salt/master
systemctl restart salt-master.service
mkdir /srv/pillar
cd /srv/pillar
mkdir web
vim web/vars.sls ##加上判断,当主机名为server2时,属于httpd
{% if grains['fqdn'] == 'server2' %}
webserver: httpd
{% elif grains['fqdn'] == 'server3' %}
webserver: nginx
{% endif %}
vim top.sls ##因为我们web里加了判断,所以都使用这个规则
base:
'*':
- web.vars
发送过去的模块和一些文件模板,在minion的缓存里都可以看到 /var/cache/salt
在安装文件中写入jinja模板和变量,以apache为例
通过pillar模块来写
salt server2 state.sls apache.install
直接在模板中修改,一般不建议直接在模板中修改
vim files/httpd.conf ##在文件首行指定端口,但是客户端的配置文件不会有这一行
5.keepalived的高可用部署
这是在server2部署apache,server3部署nginx的基础上做的
高可用和负载均衡可以分开部署
mkdir keepalived
cd keepalived
vim install.sls ##自动安装部署keepalived
install-keepalived:
pkg.installed:
- pkgs:
- keepalived
file.managed:
- name: /etc/keepalived/keepalived.conf
- source: salt://keepalived/files/keepalived.conf
- template: jinja
- context:
STATE: {{ pillar['state'] }}
VRID: {{ pillar['vrid'] }}
PRIORITY: {{ pillar['priority'] }}
service.running:
- name: keepalived
- watch:
- file: install-keepalived
vim files/keepalived.conf ##高可用的配置文件
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state {{ STATE }} ##变量直接写在pillar目录里
interface eth0
virtual_router_id {{ VRID }} ##不能与通过一个网络下的别人的vrid相同,否则会引起冲突
priority {{ PRIORITY }}
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.20.100
}
}
推送成功后测试:
关闭server2的httpd,查看vip能否漂移,在浏览器能否访问到server3的nginx