文章目录
前言
工作机制:
- Master和Minion都以
守护进程
的方式运行。 - Master监听配置文件里定义的ret_port(接收minion请求),和publish_port(发布消息)的端口
- 当Minion运行时,它会自动连接到配置文件里定义的Master地址ret_port端口进行连接认证
- 当Master和Minion可以正常通信后,就可以进行各种各样的配置管理工作了
实验环境
主机(IP) | 角色 |
---|---|
server1(172.25.11.1) | master |
server2(172.25.11.2) | minior |
server3(172.25.11.3) | minior |
saltstack的部署
server1
- 搭建yum源,同时将yum源文件发给server2和server3:
[root@server1 2019]# vim /etc/yum.repos.d/salt.repo
[salt]
name=salt
gpgcheck=0
baseurl=file:///root/2019
[root@server1 2019]# yum clean all
[root@server1 2019]# yum repolist
[root@server1 2019]# scp /etc/yum.repos.d/salt.repo server2:/etc/yum.repos.d/
[root@server1 2019]# scp /etc/yum.repos.d/salt.repo server3:/etc/yum.repos.d/
- 安装salt-master:
[root@server1 2019]# yum install salt-master-2019.2.0-1.el7.noarch.rpm
- 开启服务并查看端口:
[root@server1 ~]# systemctl start salt-master
[root@server1 ~]# systemctl enable salt-master
[root@server1 ~]# netstat -antlp
4505端口:用来链接slave,发布订阅
4506端口:请求响应,模式为:zmq(消息队列)
server2和server3
- 安装salt-minion:
[root@server2 2019]# yum install salt-minion-2019.2.0-1.el7.noarch.rpm
[root@server3 2019]# yum install salt-minion-2019.2.0-1.el7.noarch.rpm
- 修改配置文件16行,指定主节点,取消注释:
[root@server2 2019]# cd /etc/salt/
[root@server2 salt]# ls
cloud cloud.maps.d master minion.d proxy.d
cloud.conf.d cloud.profiles.d master.d pki roster
cloud.deploy.d cloud.providers.d minion proxy
[root@server2 salt]# vim minion
16 master: server1 #可以写主机名也可以写ip,做好了解析的情况下可以直接写主机名
- 开启服务,并设置为开机自启动。
[root@server2 salt]# systemctl start salt-minion
[root@server2 salt]# systemctl enable salt-minion
[root@server3 salt]# systemctl start salt-minion
[root@server3 salt]# systemctl enable salt-minion
- 至此,saltstack的部署完成。
添加连接密钥(查看密钥并加入)/在master添加minion
- 查看当前证书的签证情况(第一次客户端的证书在未验证Unaccepted Keys:的下面)
[root@server1 ~]# salt-key -L
- 给所有节点添加验证,并查看是否添加成功,第二次查看时server2和server3出现在了accept keys的下边,说明此时已经建立通过了验证,可以建立通信了。
[root@server1 ~]# salt-key -A
[root@server1 ~]# salt-key -L
- 在server1测试:
[root@server1 ~]# salt '*' test.ping
- 安装监听端口命令lsof,查看此时开启的端口:
监听状态是指网络服务端程序所处的一种状态,在该状态下,服务端程序等待客户端的连接
[root@server1 ~]# yum install lsof -y
[root@server1 ~]# lsof -i :4505
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
salt-mast 1110 root 15u IPv4 23877 0t0 TCP *:4505 (LISTEN)
salt-mast 1110 root 17u IPv4 32049 0t0 TCP server1:4505->server2:35762 (ESTABLISHED)
salt-mast 1110 root 18u IPv4 32083 0t0 TCP server1:4505->server3:40784 (ESTABLISHED)
[root@server1 ~]# lsof -i :4506
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
salt-mast 1116 root 23u IPv4 23887 0t0 TCP *:4506 (LISTEN)
- 列出树状关系。
[root@server1 ~]# yum install tree -y
[root@server1 ~]# cd /etc/salt/pki/
[root@server1 pki]# tree .
- 通过下图可以看到server1、2、3的公钥是一样的。
[root@server1 minion]# cd /etc/salt/pki/master/
[root@server2 salt]# cd /etc/salt/pki/minion/
[root@server3 salt]# cd /etc/salt/pki/minion/
- 安装python-setproctitle,查看python端口情况。
[root@server1 master]# yum install python-setproctitle -y
[root@server1 master]# systemctl restart salt-master
- 测试。
[root@server1 master]# salt '*' test.ping
[root@server1 master]# salt '*' cmd.run hostname 主机名
[root@server1 master]# salt '*' cmd.run df #挂载情况
yaml语法
saltstack的官网说明:https://docs.saltstack.com/en/latest/topics/yaml/
-
在前面我们讲过ansible的playbook使用的是yaml语法,其实这都是因为它是用python写的,所以使用的yaml语法,那么我们就来具体了解一下yaml。
-
默认的SLS文件的renderer是YAML renderer。YAML是一个有很多强大特性的标记性语言。Salt使用了一个YAML的小型子集,映射非常常用的数据结构,像列表和字典。YAML renderer的工作是将YAML数据格式的结构编译成为Python数据结构给Salt使用。尽管YAML语法可能第一眼看上去很简洁但令人畏惧,但是只要记住三个非常简单的规则就可以使用YAML语法写SLS文件了。
三个规则: -
1.规则一:缩进
-
YAML使用一个固定的缩进风格表示数据层结构关系。Salt需要每个缩进级别
由两个空格组成。不要使用tabs。如果要使用tabls的话建议修改.vimrc,设置tab的缩进格数。 -
2.规则2:冒号
-
3.规则3:短横杠
配置简单的自动化部署(安装httpd)
安装并开启服务
- 修改master端的配置文件。
[root@server1 ~]# cd /etc/salt/
[root@server1 salt]# vim master
658 file_roots:
659 base:
660 - /srv/salt #base目录,这个目录需要自己建立
[root@server1 salt]# mkdir /srv/salt
[root@server1 salt]# cd /srv/
[root@server1 srv]# ls
salt
[root@server1 salt]# systemctl restart salt-master
- 在base目录下新建apache目录,编写安装apache并开启服务的.sls文件。
[root@server1 apache]# vim install.sls
install-apache:
pkg.installed:
- pkgs:
- httpd
- php
- httpd-tools
service.running:
- name: httpd
- enable: True
- reload: True
[root@server1 apache]# salt server2 state.sls apache.install #给server2主机执行apache目录下的install.sls文件。
- 查看执行结果。
指定配置文件并运行服务
- 指定配置文件并运行服务。
[root@server1 salt]# cd /srv/salt/apache/
[root@server1 apache]# vim install.sls
install-apache:
pkg.installed:
- pkgs:
- httpd
file.managed: #文件管理的模块
- name: /etc/httpd/conf/httpd.conf #目标文件的路径
- source: salt://apache/files/httpd.conf #本地文件的路径,是以base目录为基础的
service.running:
- name: httpd
- reload: True
- watch: #检测,watch的含义是条件为false时执行。
[root@server1 apache]# mkdir files
[root@server1 apache]# cd files/
[root@server1 files]# scp root@172.25.11.250:/etc/httpd/conf/httpd.conf . #从此目录拷贝文件到files目录下
[root@server1 files]# ls
httpd.conf
[root@server1 files]# salt server2 state.sls apache.install #再次执行,执行过的会跳过。
- 在从节点上查看是否修改了默认配置文件,发现目录的结构发生变化。
[root@server2 minion]# cd /var/cache/salt/minion/
[root@server2 minion]# tree .
多节点部署多模块
- 在server1(master):
[root@server1 ~]# cd /srv/salt/
[root@server1 salt]# ls
apache
[root@server1 salt]# vim top.sls #编辑主入口文件 top.sls 类似于ansible中的main.yml文件
base:
'*': # * 通配符 所有节点
- apache.install #apahce目录下的 install.sls
[root@server1 salt]# salt '*' state.highstate #高级状态 ,高级推。
- 在server2和3:
[root@server3 ~]# netstat -antlp server2和server3查看端口80以及服务的状态:
[root@server3 ~]# systemctl status httpd
- 消息队列 : 起到一个缓冲的作用 来做限流的 否则会雪崩
源码安装nginx
执行状态和方法
4505:发布订阅
4506:请求响应
create:会判断 只有false才执行
不仅会输出到终端 也会保存在缓存里 默认保存24小时 生产环境中会保存在数据库中 ,默认是在本地文件系统中
/var/cache/salt/master/jobs
oms 有前端
- 首先关闭server2和server3的httpd服务。
[root@server2 salt]# systemctl stop httpd
[root@server3 ~]# systemctl stop httpd
server1
安装nginx
- 新建nginx目录,获取nginx安装包
server1:
[root@server1 salt]# pwd
/srv/salt
[root@server1 salt]# mkdir nginx #新建nginx的目录。
[root@server1 salt]# cd nginx/
[root@server1 nginx]# mkdir files
[root@server1 nginx]# cd files/ #在此目录下获取nginx的压缩包
lftp 172.25.11.250:~> get pub/lamp/nginx-1.15.8.tar.gz
- 编辑安装nginx的文件。
[root@server1 nginx]# vim install.sls
include:
- pkgs.install #调用安装依赖性的文件 安装所需依赖性
install-nginx:
file.managed:
- name: /mnt/nginx-1.15.8.tar.gz #文件在server3的位置
- source: salt://nginx/files/nginx-1.15.8.tar.gz #文件在本机的位置 也就是我们的下载点
cmd.run:
- name: cd /mnt && tar zxf nginx-1.15.8.tar.gz && cd nginx-1.15.8 && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx && make && make install # 解压 修改debug 编译 安装
- creates: /usr/local/nginx #如果这个目录存在了则不执行上面的
- 为server3主机执行nginx目录下的install.sls文件。
[root@server1 nginx]# salt server3 state.sls nginx.install
- 因为没有安装依赖性,所以报错了。我们新建一个pkgs目录,里面编辑install.sls文件,加入源码编译需要的依赖。下次如果需要源码编译其他软件,将此模块include到对应的install.sls文件中即可。
[root@server1 salt]# ls
apache nginx top.sls
[root@server1 salt]# mkdir pkgs
[root@server1 salt]# cd pkgs/
[root@server1 pkgs]# vim install.sls
nginx-make:
pkg.installed:
- pkgs:
- gcc
- make
- zlib-devel
- pcre-devel
- 此目录下的子目录中的文件默认保存24小时。
/var/cache/salt/master/jobs #24小时的缓存
编写管理服务的文件service.sls
[root@server1 nginx]# vim service.sls
include:
- nginx.install #引用nginx目录下的install文件,安装nginx
/usr/local/nginx/sbin/nginx:
cmd.run:
- creates: /usr/local/nginx/logs/nginx.pid #根据此文件判断服务是否启动,出现pid文件则说明服务已经开启,有多种方式可以判断
/usr/local/nginx/conf/nginx.conf:
file.managed:
- source: salt://nginx/files/nginx.conf #配置文件的路径在base目录下的nginx目录下
/usr/local/nginx/sbin/nginx -s reload:
cmd.wait:
- watch:
- file: /usr/local/nginx/conf/nginx.conf #判断文件内容是否改变 通过diff命令 改变了则重载服务。
- 再继续执行。
[root@server1 nginx]# salt server3 state.sls nginx.service
[root@server1 nginx]# cd files/
[root@server1 files]# ls
nginx-1.15.8.tar.gz #将此压缩包拷贝到files目录下。
[root@server1 files]# scp server3:/usr/local/nginx/conf/nginx.conf .
修改配置文件 在推
[root@server1 nginx]# salt server3 state.sls nginx.service
可以看到server1显示的pid与server3 px ax 查看进程的pid相同且改变,而不修改的时候,不改变
编辑nginx的启动脚本
[root@server1 files]# pwd
/srv/salt/nginx/files
[root@server1 files]# vim nginx.service #在此目录下编辑管理nginx服务的脚本,可以借鉴官网或httpd的服务脚本
[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 #改4个地方 路径分别对应server3nginx的路径
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
在上一个的基础上继续修改service.sls文件。
[root@server1 nginx]# vim service.sls
include:
- nginx.install #调用nginx目录下的install.sls文件
/usr/local/nginx/conf/nginx.conf:
file.managed:
- source: salt://nginx/files/nginx.conf
service-nginx:
file.managed:
- name: /usr/lib/systemd/system/nginx.service
- source: salt://nginx/files/nginx.service #加入nginx的启动脚本
service.running:
- name: nginx
- reload: True
- watch:
- file: /usr/local/nginx/conf/nginx.conf
- 修改全局设定,其中server2执行apache目录下的install.sls文件,server3执行nginx目录下的service.sls文件。
[root@server1 salt]# vim top.sls
base:
'server2':
- apache.install
'server3':
- nginx.service
[root@server1 nginx]# salt '*' state.highstate
第一次推的时候会报错,需要手动在server3关闭nginx服务 再kill -9 master进程 和 worker进程 然后在推就成功了
kill -9 清空程序的缓存