ITPub博客

首页 > 数据库 > 数据库开发技术 > 干货篇 | 自动化运维工具-saltstack

干货篇 | 自动化运维工具-saltstack

原创 数据库开发技术 作者:咸鱼运维杂谈 时间:2022-07-21 22:53:00 0 删除 编辑
前言

早在去年,我就在《干货篇 | 一文带你了解Ansible(上)》和《干货篇 | 一文带你了解Ansible(下)》文章中介绍过一款自动化运维工具——ansible

那么我将为大家介绍另一款自动化运维工具——saltstack

saltstack采用C/S结构的方式来进行配置管理,运行速度快、部署轻松,几分钟内便可运行起来,而且服务器之间能够做到秒级通讯,容易批量管理上万台服务器,显著降低人力与运维成本

话不多说,开始进入正题!


初始saltstack


  • 是一种基于C/S架构的服务器基础架构集中化管理平台,管理端称为master,客户端称为minion
  • 具备配置管理、远程执行、监控等功能
  • 基于python语言开发
  • 结合轻量级的消息队列软件ZeroMQ与Python第三方模块(Pyzmq、PyCrypto、Pyjinjia2、 python-msgpack 和 PyYAML 等)构建

1.特征

  1. 部署简单方便
  2. 主从集中化管理
  3. 配置简单、功能强大、扩展性强
  4. 主控端(master)和被控端(minion)基于证书认证,安全可靠
  5. 支持API自定义模块,可通过Python扩展

2.运行模式

  • local:本地单点(不建议这么做,不然就没意义了)
  • Master/Minion:通过server/client的方式进行管理,效率很高
  • Salt SSH:通过SSH方式进行管理(类似于ansible),效率相对来说比较低

对比上面的运行模式,我们可以得出saltstack一般都是采用Master/Minion来进行自动化运维管理的,下面便是Master/Minion的架构图




minion:客户端安装组件,配置好之后会主动去连接master,从master端得到资源状态信息,并同步资源管理信息

master:服务端安装组件,运行在主服务器上,负责salt命令运行和资源的管理

3.如何实现批量操作?

  • master与minion之间通过Zero进行消息传递,使用ZeroMQ进行消息传递,以及Zero-MQ的发布订阅模式,连接方式包括tcp、ipc

  • master将要执行的操作或命令发送给minion,minion从消息总线上收到要进行的操作或要处理的命令,之后交给minion_handle_aes处理

  • 之后minion_handle_aes发起一个本地线程去调用cmdmod去执行操作或命令,线程执行完毕后调用minion.return_pub方法,将执行结果通过消息总线返回给master

  • master接收到客户端返回的结果,调用master._handle_aes方法,将结果写进文件中

  • salt.client.LocalClient.cmd_cli通过轮询获取执行结果,将结果输出到终端

4.与ansible异同之处

saltstack与ansible都作为自动化运维工具,能够对目标主机实现配置管理批量操作等功能,满足企业的自动化运维管理,那么他们之间有什么异同之处呢?

相同点:

1.  都是基于python开发,可以部署到不同的系统环境中
2.  具有较好的二次开发性,便于实现个性定制

3.  ansible的playbook和saltstack的state都是遵循yaml格式

4.  执行返回结果都是json格式,容易理解


不同点:

从响应速度来看:

    saltstack的master与minion之间是通过ZeroMQ来传输数据,而ansible是通过标准SSH进行数据传输,saltstack的响应速度要比ansible的要快



从安全性来讲:
    
    ansible与saltstack都需要和远程主机进行连接,所以最大的问题就是MITM攻击(通过伪装成master主机和远程主机进行通信,从而进行攻击)

    saltstack使用ZeroMQ进行数据传输,ZeroMQ本身数据传输不支持加密,saltstack可以通过使用AES数据加密方法来对数据进行加密传输,但minion以守护进程的方式运行在远程主机,容易暴露

    ansible则使用标准SSH进行连接,不需要在远程主机上启动守护进程,而且标准SSH数据传输就是加密传输,安全方面ansible要更胜一筹

从成本来讲:
    
    saltstack需要在master和minion主机启动守护进程,需要检测守护进程的运行状态,增加了运维成本

    ansible和远程主机之间都是通过标准SSH进行连接的,远程主机只需要运行SSH进程就可以进行操作,而SSH是机房主机中都会安装和启动的进程,运维成本低于saltstack,使用起来要比saltstack简单的多
    
从语法来讲:

    saltstack的state和ansible的playbook都遵循YAML格式,但是Ansible的Playbook语法要比SaltStack的State语法具有更好的可读性


master&minion


前面我们说过,在saltstack中有两种角色——master(主控端)和minion(被控端),master来管理minion

下面我们来看下master和minion之间是怎么通信的

1.认证

minion在第一次启动时,会在/etc/salt/pki/minion/(该路径在 /etc/salt/minion里面设置)下自动生成minion.pem(private key)和minion.pub(public key),然后将 minion.pub发送给master



master收到minion的public key后,通过salt-key命令accept minion public key,这样在master的/etc/salt/pki/master/minions下将会存放以minion id命名的 public key,以此来建立可靠且加密的通信连接,同时通过消息队列ZeronMQ在master和minion之间建立消息发布通道



2.连接

master启动后默认监听4505和4506两个端口

4505端口为saltstack的消息发布系统端口;
4506端口为 saltstack minion与master 通信的端口

查看4505的端口状态我们会发现所有的minion在4505端口持续保持在ESTABLISHED状态


安装&部署


1.安装





我们先来看一下本次实验的架构图

192.168.244.141作为主控端master
192.168.244.128/129都是被控端minion

我们先分别在三台服务器上安装依赖包

#安装saltstack存储库和密钥rpm --import https://repo.saltproject.io/py3/redhat/7/x86_64/3002/SALTSTACK-GPG-KEY.pub
#配置镜像源touch /etc/yum.repos.d/salt.repocurl -fsSL https://repo.saltproject.io/py3/redhat/7/x86_64/3002.repo | tee /etc/yum.repos.d/salt.repo
#清缓存yum clean expire-cache


然后我们根据不同的角色来安装不同组件

#master[root@master ~]#  yum install salt-master -y
#minion[root@minion1 ~]# yum install salt-minion -y[root@minion2 ~]# yum install salt-minion -y

安装完毕后开启并设置自启动

[root@master ~]#systemctl enable salt-master && systemctl start salt-master
[root@minion1 ~]#systemctl enable salt-minion && systemctl start salt-minion[root@minion2 ~]#systemctl enable salt-minion && systemctl start salt-minion


2.配置

  • 修改master配置文件

master配置文件路径:vim /etc/salt/master

[root@master ~]# vim /etc/salt/master[root@master ~]# grep -Ev "^$|#" /etc/salt/masterfile_root:  base:    - /home/saltpillar_roots:  base:    - /home/salt/pillarorder_masters: Trueauto_accept: True


file_roots:主目录pillar_roots:pillar组件主目录order_masters:允许开启多层masterauto_accept:自动认证


[root@master ~]#systemctl restart salt-master


  • 修改minion配置文件
minion配置文件路径:vim /etc/salt/minion

我只展示操作minion1的过程,minion2同理的

[root@minion1 ~]# vim /etc/salt/minion[root@minion1 ~]# grep -Ev "^$|#" /etc/salt/minionmaster: 192.168.244.141id: 192.168.244.129user: root
#重启服务[root@minion1 ~]# systemctl restart salt-minion

# minion的识别ID,可以是IP,域名,或是可以通过DNS解析的字符串id: 192.168.244.128
# salt运行的用户权限user: root
# master的识别ID,可以是IP,域名,或是可以通过DNS解析的字符串master : 192.168.244.141
# master通讯端口master_port: 4506
# 备份模式,minion是本地备份,当进行文件管理时的文件备份模式backup_mode: minion
# 执行salt-call时候的输出方式output: nested
# minion等待master接受认证的时间acceptance_wait_time: 10
# 失败重连次数,0表示无限次,非零会不断尝试到设置值后停止尝试acceptance_wait_time_max: 0
# 重新认证延迟时间,可以避免因为master的key改变导致minion需要重新认证的syn风暴random_reauth_delay: 60
# 日志文件位置log_file: /var/logs/salt_minion.log
# 文件路径基本位置file_roots:base:- /etc/salt/minion/file
# pillar基本位置pillar_roots:base:- /data/salt/minion/pillar

3.认证并连接

minion在第一次启动时,会在/etc/salt/pki/minion/下自动生成minion.pem(private key)和 minion.pub(public key),然后将minion.pub发送给master

我们在master端来进行key认证,使用salt-key命令

[root@master ~]# salt-key Accepted Keys: #可以看到master已经检测到minion,且已认证key192.168.244.128192.168.244.129Denied Keys:Unaccepted Keys:Rejected Keys:
#如果没有认证,手动输入认证一下[root@master ~]# salt-key -a id

认证成功之后我们来验证一下

[root@master ~]# salt '192.168.244.128' test.ping192.168.244.128:    True  #返回结果表示成功[root@master ~]# salt '192.168.244.129' test.ping192.168.244.129:    True


总结


这篇文章首先介绍了saltstack是什么,以及它与ansible之间的相似之处和不同之处


还介绍了saltstack中master和minion之间是怎么实现通信的


最后还通过在三台虚拟机上部署saltstack组件,让大家印象更深刻


在下一篇文章中,我将为大家介绍saltstack的一些基础命令和如何实现分组管理,以及写一些简单的SLS脚本来实现对minion的批量操作




扫码
关注

原文作者:咸鱼运维杂谈;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
最新的技术文章首先发布在微信公众号:咸鱼运维杂谈 擅长Linux系统维护、开源软件维护、自动化运维等领域,博客主要偏向于学习笔记及经历分享

注册时间:2021-05-29

  • 博文量
    193
  • 访问量
    84246