SaltStack的部署以及配置简单的自动化部署

前言

工作机制:

  • 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 清空程序的缓存
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值