SaltStack

  1. SaltStack介绍

1.1 自动化运维工具
作为一个运维人员,很大一部分工作是在业务的配置管理和状态维护以及版本发布上,而当业务场景及公司规模上了一定规模后,人为手工的去做这些工作将变得极其困难,此时我们将需要利用一些自动化运维的工具来达到批量管理的目的。

1.2 saltstack的特点
基于python开发的C/S架构配置管理工具
底层使用ZeroMQ消息队列pub/sub方式通信
使用SSL证书签发的方式进行认证管理,传输采用AES加密

1.3 saltstack服务架构
在saltstack架构中服务器端叫Master,客户端叫Minion。

在Master和Minion端都是以守护进程的模式运行,一直监听配置文件里面定义的ret_port(接受minion请求)和publish_port(发布消息)的端口。

当Minion运行时会自动连接到配置文件里面定义的Master地址ret_port端口进行连接认证。

saltstack除了传统的C/S架构外,其实还有一种叫做masterless的架构,其不需要单独安装一台 master 服务器,只需要在每台机器上安装 Minion端,然后采用本机只负责对本机的配置管理机制服务的模式。

  • SaltStack四大功能与四大运行方式
    SaltStack有四大功能,分别是:
  • 远程执行
  • 配置管理/状态管理
  • 云管理(cloud)
  • 事件驱动

SaltStack可以通过远程执行实现批量管理,并且通过描述状态来达到实现某些功能的目的。

SaltStack四大运行方式:

  • local本地运行
  • Master/Minion传统方式
  • Syndic分布式
  • Salt ssh
  1. SaltStack组件介绍
    组件 功能
    Salt Master 用于将命令和配置发送到在受管系统上运行的Salt minion
    Salt Minions 从Salt master接收命令和配置
    Execution Modules 从命令行针对一个或多个受管系统执行的临时命令。对…有用:
  2. 实时监控,状态和库存
  3. 一次性命令和脚本
  4. 部署关键更新
    Formulas (States) 系统配置的声明性或命令式表示
    Grains Grains是有关底层受管系统的静态信息,包括操作系统,内存和许多其他系统属性。
    Pillar 用户定义的变量。这些安全变量被定义并存储在Salt Master中,然后使用目标“分配”给一个或多个Minion。
    Pillar数据存储诸如端口,文件路径,配置参数和密码之类的值。
    Top File 将Formulas (States)和Salt Pillar数据与Salt minions匹配。
    Runners 在Salt master上执行的模块,用于执行支持任务。Salt runners报告作业状态,连接状态,从外部API读取数据,查询连接的Salt minions等。
    Returners 将Salt minions返回的数据发送到另一个系统,例如数据库。Salt Returners可以在Salt minion或Salt master上运行。
    Reactor 在SaltStack环境中发生事件时触发反应。
    Salt Cloud / Salt Virt 在云提供商/虚拟机管理程序上提供系统,并立即将其置于管理之下。
    Salt SSH 在没有Salt minion的系统上通过SSH运行Salt命令。
  5. SaltStack安装与最小化配置
    环境说明:

SaltStack安装与最小化配置

主机类型ip要安装的应用
控制机master192.168.207.131salt-master
salt-minion
被控机node1192.168.207.137salt-minion

打开官方yum源https://repo.saltproject.io/#rhel

image-20210701201602336

添加仓库

[root@master ~]# rpm --import https://repo.saltproject.io/py3/redhat/8/x86_64/latest/SALTSTACK-GPG-KEY.pub
[root@master ~]# curl -fsSL https://repo.saltproject.io/py3/redhat/8/x86_64/latest.repo | tee /etc/yum.repos.d/salt.repo
[salt-latest-repo]
name=Salt repo for RHEL/CentOS 8 PY3
baseurl=https://repo.saltproject.io/py3/redhat/8/x86_64/latest
skip_if_unavailable=True
failovermethod=priority
enabled=1
enabled_metadata=1
gpgcheck=1
gpgkey=https://repo.saltproject.io/py3/redhat/8/x86_64/latest/SALTSTACK-GPG-KEY.pub

开始安装

[root@master ~]# dnf -y install salt-master salt-minion

修改主控端的配置文件

[root@master ~]# sed -i '/^#master:/a master: 192.168.207.131' /etc/salt/minion

启动

[root@master ~]# systemctl enable --now salt-master
Created symlink /etc/systemd/system/multi-user.target.wants/salt-master.service → /usr/lib/systemd/system/salt-master.service.
[root@master ~]# systemctl enable --now salt-minion
Created symlink /etc/systemd/system/multi-user.target.wants/salt-minion.service → /usr/lib/systemd/system/salt-minion.service.
[root@master ~]# ss -antl
State   Recv-Q  Send-Q   Local Address:Port     Peer Address:Port  Process  
LISTEN  0       128            0.0.0.0:4505          0.0.0.0:*              
LISTEN  0       128            0.0.0.0:4506          0.0.0.0:*              
LISTEN  0       128            0.0.0.0:22            0.0.0.0:*              
LISTEN  0       128               [::]:22               [::]:*  

在被控机上安装salt-minion客户端

[root@node1 ~]# rpm --import https://repo.saltproject.io/py3/redhat/8/x86_64/latest/SALTSTACK-GPG-KEY.pub
[root@node1 ~]# curl -fsSL https://repo.saltproject.io/py3/redhat/8/x86_64/latest.repo | tee /etc/yum.repos.d/salt.repo
[salt-latest-repo]
name=Salt repo for RHEL/CentOS 8 PY3
baseurl=https://repo.saltproject.io/py3/redhat/8/x86_64/latest
skip_if_unavailable=True
failovermethod=priority
enabled=1
enabled_metadata=1
gpgcheck=1
gpgkey=https://repo.saltproject.io/py3/redhat/8/x86_64/latest/SALTSTACK-GPG-KEY.pub
[root@node1 ~]# dnf -y install salt-minion

修改被控端的配置文件,将master设为主控端的IP

[root@node1 ~]# sed -i '/^#master:/a master: 192.168.207.131' /etc/salt/minion

启动并设置开机自启

[root@node1 ~]# systemctl enable --now salt-minion
Created symlink /etc/systemd/system/multi-user.target.wants/salt-minion.service → /usr/lib/systemd/system/salt-minion.service.

saltstack配置文件

saltstack的配置文件在/etc/salt目录

saltstack配置文件说明:

配置文件说明
/etc/salt/master主控端(控制端)配置文件
/etc/salt/minion受控端配置文件

配置文件/etc/salt/master默认的配置就可以很好的工作,故无需修改此配置文件。

配置文件/etc/salt/minion常用配置参数

  • master:设置主控端的IP
  • id:设置受控端本机的唯一标识符,可以是ip也可以是主机名或自取某有意义的单词

在日常使用过程中,经常需要调整或修改Master配置文件,SaltStack大部分配置都已经指定了默认值,只需根据自己的实际需求进行修改即可。下面的几个参数是比较重要的

  • max_open_files:可根据Master将Minion数量进行适当的调整
  • timeout:可根据Master和Minion的网络状况适当调整
  • auto_accept和autosign_file:在大规模部署Minion时可设置自动签证
  • master_tops和所有以external开头的参数:这些参数是SaltStack与外部系统进行整合的相关配置参数

SaltStack认证机制

saltstack主控端是依靠openssl证书来与受控端主机认证通讯的,受控端启动后会发送给主控端一个公钥证书文件,在主控端用salt-key命令来管理证书。

salt-minion与salt-master的认证过程:

  • minion在第一次启动时,会在/etc/salt/pki/minion/下自动生成一对密钥,然后将公钥发给master
  • master收到minion的公钥后,通过salt-key命令接受该公钥。此时master的/etc/salt/pki/master/minions目录将会存放以minion id命名的公钥,然后master就能对minion发送控制指令了
//salt-key常用选项
    -L      //列出所有公钥信息
    -a minion    //接受指定minion等待认证的key
    -A      //接受所有minion等待认证的key
    -r minion    //拒绝指定minion等待认证的key
    -R      //拒绝所有minion等待认证的key
    -f minion   //显示指定key的指纹信息
    -F      //显示所有key的指纹信息
    -d minion   //删除指定minion的key
    -D      //删除所有minion的key
    -y      //自动回答yes
    
重启被控端
[root@node1 ~]# systemctl restart salt-minion
//查看当前证书情况
[root@master ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
master
node1
Rejected Keys:
[root@master pki]# tree
.
├── master
│   ├── master.pem
│   ├── master.pub
│   ├── minions
│   ├── minions_autosign
│   ├── minions_denied
│   ├── minions_pre
│   │   ├── master
│   │   └── node1
│   └── minions_rejected
└── minion
    ├── minion.pem
    └── minion.pub

7 directories, 6 files
//接受指定minion的新证书
[root@master pki]# salt-key -a master
The following keys are going to be accepted:
Unaccepted Keys:
master
Proceed? [n/Y] y
Key for minion master accepted.
[root@master pki]# tree
.
├── master
│   ├── master.pem
│   ├── master.pub
│   ├── minions
│   │   └── master
│   ├── minions_autosign
│   ├── minions_denied
│   ├── minions_pre
│   │   └── node1
│   └── minions_rejected
└── minion
    ├── minion.pem
    └── minion.pub

7 directories, 6 files
[root@master pki]# salt-key -ya node1
The following keys are going to be accepted:
Unaccepted Keys:
node1
Key for minion node1 accepted.
[root@master pki]# tree
.
├── master
│   ├── master.pem
│   ├── master.pub
│   ├── minions
│   │   ├── master
│   │   └── node1
│   ├── minions_autosign
│   ├── minions_denied
│   ├── minions_pre
│   └── minions_rejected
└── minion
    ├── minion_master.pub
    ├── minion.pem
    └── minion.pub

7 directories, 7 files
[root@master pki]# salt-key -L
Accepted Keys:
master
node1
Denied Keys:
Unaccepted Keys:
Rejected Keys:
//接受所有minion的新证书
[root@master pki]# salt-key -yA

SaltStack远程执行

测试指定受控端主机是否可以连接
[root@master pki]# salt 'node1' test.ping
node1:
    True
查看主机名
[root@master pki]# salt 'node1' cmd.run hostname
node1:
    node1
查看时间
[root@master pki]# salt 'node1' cmd.run "date"
node1:
    Thu Jul  1 21:01:33 CST 2021
//测试所有受控端主机是否存活
[root@master pki]# salt '*' test.ping
node1:
    True
master:
    True
查看版本
[root@master pki]# salt --version
salt 3003.1
//查看saltstack以及依赖包的版本号
[root@master pki]# salt --versions-report
Salt Version:
          Salt: 3003.1
 
Dependency Versions:
          cffi: Not Installed
      cherrypy: Not Installed
      dateutil: 2.6.1
     docker-py: Not Installed
         gitdb: Not Installed
     gitpython: Not Installed
        Jinja2: 2.10.1
       libgit2: Not Installed
      M2Crypto: 0.35.2
          Mako: Not Installed
       msgpack: 0.6.2
  msgpack-pure: Not Installed
  mysql-python: Not Installed
     pycparser: Not Installed
      pycrypto: Not Installed
  pycryptodome: Not Installed
        pygit2: Not Installed
        Python: 3.6.8 (default, Jan 27 2021, 01:17:18)
  python-gnupg: Not Installed
        PyYAML: 3.12
         PyZMQ: 19.0.0
         smmap: Not Installed
       timelib: Not Installed
       Tornado: 4.5.3
           ZMQ: 4.3.4
 
System Versions:
          dist: centos 8 
        locale: UTF-8
       machine: x86_64
       release: 4.18.0-294.el8.x86_64
        system: Linux
       version: CentOS Stream 8 
 

salt命令使用

//语法:salt [options] '<target>' <function> [arguments]

//常用的options
    --version       //查看saltstack的版本号
    --versions-report   //查看saltstack以及依赖包的版本号
    -h      //查看帮助信息
    -c CONFIG_DIR   //指定配置文件目录(默认为/etc/salt/)
    -t TIMEOUT      //指定超时时间(默认是5s)
    --async     //异步执行
    -v      //verbose模式,详细显示执行过程
    --username=USERNAME     //指定外部认证用户名
    --password=PASSWORD     //指定外部认证密码
    --log-file=LOG_FILE     //指定日志记录文件
    
//常用target参数
    -E      //正则匹配
    -L      //列表匹配 
    -S      //CIDR匹配网段
    -G      //grains匹配
    --grain-pcre    //grains加正则匹配
    -N      //组匹配
    -R      //范围匹配
    -C      //综合匹配(指定多个匹配)
    -I      //pillar值匹配
[root@master pki]# salt -E 'node*' test.ping
node1:
    True
[root@master pki]# salt -L node1,master test.ping
node1:
    True
master:
    True
[root@master pki]# salt -S '192.168.207.0/24' test.ping
node1:
    True
master:
    True
待续。。。

常用的自动化运维工具

一、Puppet
—基于 Ruby 开发,采用 C/S 架构,扩展性强,基于 SSL,远程命令执行相对较弱
二、SaltStack
—基于 Python 开发,采用 C/S 架构,相对 puppet 更轻量级,配置语法使用 YMAL,使得配置 脚本更简单
Ansible和SaltStack都是的目前最流行的自动化运维工具,能满足企业IT系统的自动化运维管理。这两个工具都是用python开发的,
可以部署到不同的系统环境中和具有良好的二次开发特性。

1: 响应速度
SaltStack的master和minion主机是通过ZeroMQ传输数据,而Ansible是通过标准SSH进行数据传输,SaltStack的响应速度要比Ansible快很多。
标准SSH连接的时候比较耗费时间,ZeroMQ传输的速度会快很多,所以单单从响应速度方面考虑SaltStack会是更好的选择。

2: 安全
Ansible和SaltStack都需要和远程主机进行连接,它们的最大的安全问题就是MITM攻击,通过伪装成Master主机和远程主机进行通信,从而进行攻击。
SaltStack使用ZeroMQ进行数据传输,ZeroMQ本身数据传输不支持加密,SaltStack可以通过使用AES数据加密方法来对数据进行加密传输,但是SaltStack
的minion主机以守护进程的方式运行在远端暴露了很多容易被攻击的点。 Ansible使用标准SSH连接传输数据,不需要在远程主机上启动守护进程,并且标
准SSH数据传输本身就是加密传输,这样远程主机不容易被攻击。也不是说Ansible就可以完全避免被攻击,Ansible使用paramiko库进行SSH连接,paramiko
是一个有很不错记录SSH连接的python库。Ansible可以通过配置StrictHostKeyChecking参数,使得远程主机上的keys和之前连接不一样的时候Ansible没有
及时感知和提醒用户。但是Ansible可以通过修改配置文件和配置一个合适的known_hosts文件来解决这个问题,因此Ansible在安全方面还是比SaltStack做的好。

3: 自身运维
SaltStack需要在Master和Minion主机启动守护进程,自身需要检测守护进程的运行状态,增加运维成本。Ansible和远端主机之间的通信是通过标准SSH进行,
远程主机上只需要运行SSH进程就可以进行运维操作,SSH是机房主机中一般都安装和启动的进程,所以在Ansible进行运维的时候只需要关注Ansible主机的运
行状态。Ansible对机房运维不会增加过多的运维成本。从工具本身的运维角度来说,Ansible要比SaltStack简单很多。
三、Ansible
—基于 Pythonparamiko 开发,分布式,无需客户端,轻量级,配置语法使用 YMAL 及 Jinja2 模板语言,更强的远程命令执行操作

Ansible 是一个简单的自动化运维管理工具,可以用来自动化部署应用、配置、编排 task(持续 交付、无宕机更新等),采用 paramiko 协议库(fabric 也使用这个),通过 SSH 或者 ZeroMQ 等连 接主机

四、CF引擎
CF引擎可以看作是配置管理之父。1993年诞生的CF引擎,彻底改变了我们对于服务器设置和配置的方式。一开始CF引擎是一项开源项目,2008年发布第一个商务版本,自此实现了商业化。CF引擎是用C语言编写的,依赖物很少,而且运行速度极快。但一般的技术人员不会使用CF 引擎。必须是懂得C语言的开发人员才能够管理CF引擎。

特点:
使用维护困难

五、Chef
该工具确实解决了Puppet的一些小问题,但只是暂时的。随着Puppet和Chef逐渐发展流行,两个工具进入了“零和竞争”的状态。只要一方开发出新的功能或有了新的改进,另一方就会立刻模仿并进行相同的改动。这样一来,两个工具各自的功能都越来越多,复杂性也越来越高,相应的学习起来的难度也越来越大。
Puppet和Chef工具都很成熟,应用都很广泛(尤其是在商业环境中),开源社区的贡献也都很多。唯一的问题就是,两款工具对于我们想要实现的东西来说过于复杂。
这两款工具在设计之初就没有充分考虑到容器,它们也不会想到这场“博弈”最终会因为Docker而发生变化,因为那个时候Docker还没有出现。

今天我们可能会用到很多部署工具,Docker Compose,Mesos,Kubernetes,以及DockerSwarm只是日益涌现的众多配置管理工具的一部分。在这种背景下,
我们对于配置管理的选择应当注重简洁性和不可变性,而不是其他东西。语法应当简单易读,即便是从来没有用过工具的人都应当可以看懂。

SaltStack 的工作原理
SaltStack 采用 C/S 结构来对云环境内的服务器操作管理及配置管理。为了更好的理解它的工作方式及管理模型,本章将通过图形方式对其原理进行阐述。

SaltStack 客户端(Minion)在启动时,会自动生成一套密钥,包含私钥和公钥。之后将公钥发送给服务器端,服务器端验证并接受公钥,以此来建立可靠且加密的通信连接。同时通过消息队列 ZeroMQ 在客户端与服务端之间建立消息发布连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值