Saltstack概述

1. 简介

SaltStack是基础架构管理的一种自动化工具。部署轻松,在几分钟内可运行起来,扩展性好,很容易管理上万台服务器,速度够快。与服务器之间的交流,以毫秒为单位。SaltStack提供了一个动态基础设施通信总线用于编排,远程执行、配置管理等等。SaltStack项目于2011年启动,年增长速度较快,五年期固定基础设施编制和配置管理的开源项目。SaltStack社区致力于保持slat项目集中、友好、健康、开放。
官方介绍

常用自动化运维工具

  • Ansible:Python,Agentless,中小型应用环境,安全系数高
  • Saltstack:python,一般需要部署agent,执行效率更高,适合大型环境
  • Puppet:ruby,功能强大,配置复杂,适合大型环境
  • Fabric:python,agentless
  • Chef:ruby,国内应用少
  • Cfengine
  • func

1.1 saltstack的特点

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

1.2 saltstack架构

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

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

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

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

1.3 saltstack原理

Salt使用server-agent通信模型,服务端组件被称为Salt master,agent被称为Salt minion
Salt master主要负责向Salt minions发送命令,然后聚合并显示这些命令的结果。一个Salt master可以管理多个minion系统
Salt server与Salt minion通信的连接由Salt minion发起,这也意味着Salt minion上不需要打开任何传入端口(从而减少攻击)。Salt server使用端口4505和4506,必须打开端口才能接收到访问连接

Publisher (端口4505)所有Salt minions都需要建立一个持续连接到他们收听消息的发布者端口。命令是通过此端口异步发送给所有连接,这使命令可以在大量系统上同时执行。

Request Server (端口4506)Salt minios根据需要连接到请求服务器,将结果发送给Salt master,并安全地获取请求的文件或特定minion相关的数据值(称为Salt pillar)。连接到这个端口的连接在Salt master和Salt minion之间是1:1(不是异步)。

2. SaltStack四大功能与四大运行方式

SaltStack有四大功能,分别是:

  • 远程执行
  • 配置管理/状态管理
  • 云管理(cloud)
  • 事件驱动

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

SaltStack四大运行方式:

  • local本地运行
  • Master/Minion传统方式
  • Syndic分布式
  • Salt ssh

3. SaltStack组件介绍

Salt Master img 中心管理系统。此系统用于将命令和配置发送到在受管系统上运行的Salt minion。
Salt Minions img 被管理的系统。 该系统运行Salt minion,它从Salt master接收命令和配置。
Execution Modules img 从命令行针对一个或多个受管系统执行临时命令。 对以下管理场景有帮助:实时监控,状态和盘点一次性命令和脚本部署关键更新
Formulas (States) img 一种系统配置的声明性或命令式表示。
Grains img 系统变量。 Grains是有关底层受管系统的静态信息,包括操作系统,内存和许多其他系统属性。 您还可以为任何系统定义自定义grains。
Pillar img 用户定义的变量。 这些安全变量被定义并存储在Salt Master中,然后使用目标“分配”给一个或多个minions。 pilla数据存储诸如端口,文件路径、配置参数和密码之类的值。
Top File img 将formulas和pilla数据与Salt minions匹配。
Runners img 在Salt master上执行的模块,用于执行支持任务。 Salt runners报告作业状态、连接状态、从外部API读取数据,查询连接的Salt minions等。例如,Orchestrate运行器协调跨多个系统的配置部署。
Returners img 将Salt minions返回的数据发送到另一个系统,例如数据库。 Salt Returners可以在Salt minion或Salt master上运行。
Reactor img 在SaltStack环境中发生特定事件时触发相应的响应。
Salt Cloud / Salt Virt img 在云提供商/虚拟机平台上运行的系统,立即对其进行管理。
Salt SSH img 在没有Salt minion的系统上通过SSH运行Salt

4. SaltStack配置管理入门

4 安装与最小化配置

环境说明:

主机类型 IP 要安装的应用
控制机 192.168.32.130 salt-master
salt-minion
salt-ssh
salt-syndic
salt-cloud
salt-api
被控机(node1) 192.168.32.135 salt-minion
被控机(node2) 192.168.32.140 salt-minion

4.1 在控制机上安装saltstack主控端软件

官方源地址:https://repo.saltstack.com/3000.html#rhel

#配置yum源
[root@localhost ~]# yum -y install yum install https://repo.saltstack.com/yum/redhat/salt-repo-3000.el7.noarch.rpm 
[root@localhost ~]# sudo yum clean expire-cache

#安装saltstack主控端
[root@localhost ~]# yum -y install salt-master salt-minion salt-ssh salt-syndic salt-cloud salt-api

#修改主控端的配置文件
[root@localhost ~]# sed -i '/^#master:/a master: 192.168.32.130' /etc/salt/minion
[root@localhost ~]# sed -n '/^master/p' /etc/salt/minion

#启动主控端的salt-master和salt-minion,并设置开机自启
[root@localhost ~]# systemctl enable --now salt-master salt-minion
Created symlink from /etc/systemd/system/multi-user.target.wants/salt-master.service to /usr/lib/systemd/system/salt-master.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/salt-minion.service to /usr/lib/systemd/system/salt-minion.service.

[root@localhost ~]# ss -tanl
State       Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN      0      128     *:4505                *:*                  
LISTEN      0      100    127.0.0.1:25                  *:*                  
LISTEN      0      128     *:4506                *:*                  
LISTEN      0      128     *:22                  *:*                  
LISTEN      0      100     [::1]:25                   [::]:*                  
LISTEN      0      128      [::]:22                   [::]:*     

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

#配置yum源
[root@salt-minion-1 ~]# yum install https://repo.saltstack.com/py3/redhat/salt-py3-repo-3001.el7.noarch.rpm
[root@salt-minion-1 ~]# yum -y install salt-minion

#修改被控端的配置文件,将master设为主控端的IP
[root@salt-minion-1 ~]# sed -i '/^#master:/a master: 192.168.32.130' /etc/salt/minion
[root@salt-minion-1 ~]# sed -n '/^master/p' /etc/salt/minion
master: 192.168.32.130

#启动受控端的salt-minion并设置开机自启
[root@salt-minion-1 ~]# systemctl enable --now salt-minion
Created symlink from /etc/systemd/system/multi-user.target.wants/salt-minion.service to /usr/lib/systemd/system/salt-minion.service.



4.3 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与外部系统进行整合的相关配置参数

5. SaltStack认证机制

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

Salt 的数据传输是通过 AES 加密,Master 和 Minion 之前在通信之前,需要进行认证。
Salt 通过认证的方式保证安全性,完成一次认证后,Master 就可以控制 Minion 来完成各项工作了。

  1. minion 在第一次启动时候,会在 /etc/salt/pki/minion/ 下自动生成 minion.pem(private key) 和 minion.pub(public key), 然后将 minion.pub 发送给 master
  2. master 在第一次启动时,会在 /etc/salt/pki/master/ 下自动生成 master.pem 和 master.pub ;并且会接收到 minion 的 public key , 通过 salt-key 命令接收 minion public key, 会在 master 的 /etc/salt/pki/master/minions目录下存放以 minion id 命令的 public key ;验证成功后同时 minion 会保存一份 master public key 在 minion 的 /etc/salt/pki/minion/minion_master.pub里。

Salt认证原理总结

minion将自己的公钥发送给master
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@master ~]# salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
192.168.32.130
192.168.32.135
192.168.32.140


#接受指定minion的新证书
[root@master ~]# salt-key -ya 192.168.32.135
The following keys are going to be accepted:
Unaccepted Keys:
192.168.32.135
Key for minion 192.168.32.135 accepted.
[root@master ~]# salt-key -L
Accepted Keys:
192.168.32.135
Denied Keys:
Unaccepted Keys:
192.168.32.130
192.168.32.140
Rejected Keys:


#接受所有minion的证书
[root@master ~]# salt-key -yA
The following keys are going to be accepted:
Unaccepted Keys:
192.168.32.130
192.168.32.140
Key for minion 192.168.32.130 accepted.
Key for minion 192.168.32.140 accepted.
[root@master ~]# salt-key -L
Accepted Keys:
192.168.32.130
192.168.32.135
192.168.32.140
Denied Keys:
Unaccepted Keys:
Rejected Keys:

6. SaltStack远程执行

#测试指定受控端192.168.32.135主机是否存活
[root@master ~]# salt "192.168.32.135" test.ping
192.168.32.135:
    True
[root@master ~]# salt "192.168.32.*" test.ping
192.168.32.140:
    True
192.168.32.130:
    True
192.168.32.135:
    True


[root@master ~]# salt '192.168.32.135' cmd.run hostname
192.168.32.135:
    node1

    
#测试所有受控端主机是否存活
[root@master ~]# salt '*' test.ping
[root@master ~]# salt '*' test.ping
192.168.32.135:
    True
192.168.32.140:
    True
192.168.32.130:
    True

复合命令执行

复合命令发送的函数和列表是多个的,根据命令行定义的顺序在指定的被控制端执行。

[root@master ~]# salt '192.168.32.135' cmd.run,test.ping,test.echo 'echo "1,2,3"' , , foo
192.168.32.135:
    ----------
    cmd.run:
        1,2,3
    test.echo:
        foo
    test.ping:
        True


#可以使用--args-separator选项更改分隔符:
[root@master ~]# salt --args-separator=: '192.168.32.135' cmd.run,test.ping,test.echo 'echo "1,2,3"' :: foo
192.168.32.135:
    ----------
    cmd.run:
        1,2,3
    test.echo:
        foo
    test.ping:
        True

7. 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      //perl正则匹配
    -L      //列表匹配 
    -S      //CIDR匹配网段
    -G      //grains匹配 --grain-pcre    //grains加正则匹配
    -N      //组匹配
    -R      //范围匹配
    -C      //综合匹配(指定多个匹配)
    -I      //pillar值匹配




#示例
[root@master ~]# salt -E '192.168.32.1\d*5' test.ping
192.168.32.135:
    True


[root@master ~]# salt -L "192.168.32.135,192.168.32.140" test.ping
192.168.32.135:
    True
192.168.32.140:
    True

[root@master ~]# salt -S '192.168.32.0/24' test.ping
192.168.32.140:
    True
192.168.32.135:
    True
192.168.32.130:
    True

[root@master ~]# salt -G 'os:centos' test.ping
192.168.32.135:
    True
192.168.32.140:
    True
192.168.32.130:
    True
[root@master ~]# salt -G 'ip_interfaces:ens33' test.ping
192.168.32.140:
    True
192.168.32.135:
    True
192.168.32.130:
    True



[root@master ~]# salt -N group1 test.ping
192.168.32.135:
    True
192.168.32.130:
    True


#此处的centos是一个组名,需要在master配置文件中定义nodegroups参数,且需要知道minion的id信息才能将其定义至某个组中
nodegroups:
  group1: 'L@192.168.32.130,192.168.32.135'
  
  
  
[root@master ~]# salt -C 'G@os:centos or S@192.168.32.0/24' test.ping
192.168.32.135:
    True
192.168.32.140:
    True
192.168.32.130:
    True
[root@master ~]# salt -C 'G@os:centos and S@192.168.32.0/24' test.ping
192.168.32.135:
    True
192.168.32.140:
    True
192.168.32.130:
    True

[root@master ~]# salt -C 'G@os:centos and S@192.168.32.0/24 and L@192.168.32.135' test.ping
192.168.32.135:
    True

posted @ 2020-08-17 22:42  EverEternity  阅读(881)  评论(0编辑  收藏  举报