当前位置: 首页 > news >正文

SaltStack 基础

SaltStack 基础

  • 一、SaltStack 基础
  • 二、SaltStack 原理
  • 三、SaltStack部署
    • 1、基础环境布置
    • 2、安装master
    • 3、安装minion
    • 4、配置master
    • 5、配置minion
    • 6、master 端查看 minion 秘钥
  • 四、SaltStack基本命令使用
    • 1、salt命令格式
    • 2:在 Master 端测试 Minion
    • 3、目标定位
    • 4、拷贝文件
  • 五、远程执行模块和函数
    • 1、模块和函数的查询
    • 2、远程命令执行模块 --cmd
    • 3、软件包管理模块 --pkg
    • 4、服务管理模块 --service
    • 5、文件管理模块 --file
  • 六、grains 的使用
    • 1、列出 minion 主机上的 grains 项
    • 2、列出 minion 主机上的 grains 项及其对应的值
    • 3、grains 基本用法
    • 4、自定义 grains 键值
    • 5、使用JSON格式定义多个值
    • 6、在minion端添加
  • 七、pillar 的使用
    • 1、列出 minion 上的 pillar 详细信息
    • 2、自定义pillar
  • 八、saltstack 目录与文件同步
    • 1、SaltStack 同步方式
    • 2、目录同步

一、SaltStack 基础

在生产环境中,服务器往往不只是一台,有可能是成千上万台。对于运维人员来说,如果单独的对每台服务器进行管理,工作难度比较大。这时部署自动化运维就可以尽可能安全、高效的完成这些工作。

一般,会把自动化运维工具划分为两类:一类是需要使用代理工具的,也就是基于专用的 Agent 程序来完成管理功能,如:SaltStack、Puppet、Func、Zabbix 等;另外一类是不需要配置代理工具的,可以直接基于 SSH 服务来完成管理功能,如:Ansible、Fabric 等。本章将主要介绍自动化运维工具 SaltStack 是如何实现自动化运维部署的。下面是几款功能类似的自动化运维工具。

  • SaltStack:是一个服务器基础设施管理工具,它具有配置管理、远程执行、监控等功能。SaltStack 由 Python语言编写,是非常简单易用和轻量级的管理工具。
  • Ansible:是基于 Python开发的,集合了众多优秀运维工具的优点,实现了批量运行命令、部署程序、配置系统等功能的自动化运维管理工具。默认通过 SSH 协议进行远程命令执行或下发配置,无需部署任何客户端代理软件,从而使得自动化环境部署变得更加简单。可同时支持多台主机并行管理,使得管理主机更加便捷。
  • Puppet:是基于 Ruby 开发的,支持 Linux、Unix、Windows平台的自动化运维管理工具,可以针对用户、系统服务、配置文件、软件包等进行管理,有很强的扩展性,但远程执行命令相对较弱。

在这里插入图片描述
通过部署 SaltStack 环境,可以在成千上万台服务器上批量执行命令,对于不同的业务进行集中管理、分发文件、采集数据、软件包管理等。有利于运维人员提高工作效率、规范 业务配置和操作。

二、SaltStack 原理

SaltStack 由 Master 和 Minion 构成,Master 是服务器端,表示一台服务器,Minion 是客户服务器端,表示多台服务器。

在 Master 上发送命令给符合条件的 Minion,Minion 就会执行相应的命令。Master 和 Minion 之间是通过 ZeroMQ(消息队列)进行通信。

SaltStack 的 Master 端监听 4505 与 4506 端口,4505 为 SaltStack 的消息发布端口,4506 为 SaltStack 客户端与服务端通信的端口。SaltStack 客户端程序并不监听端口,当客户端启动后,会主动连接 Master 端注册,然后一直保持该 TCP 连接,而 Master 通过这条 TCP 连接对客户端进行控制。如果连接断开,Master 对客户端将不能进行控制。但是,当客户端检查到连接断开后,会定期的向 Master 端请求注册连接。

三、SaltStack部署

在这里插入图片描述

1、基础环境布置

(1) 关闭防火墙及内核

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config

(2) 修改主机名
192.168.10.101

hostnamectl set-hostname master
bashcat <<EOF >> /etc/hosts
192.168.10.101 master
192.168.10.102 web01
192.168.10.103 web02
EOF

192.168.10.102

hostnamectl set-hostname web01
bashcat <<EOF >> /etc/hosts
192.168.10.101 master
192.168.10.102 web01
192.168.10.103 web02
EOF

192.168.10.103

hostnamectl set-hostname web02
bashcat <<EOF >> /etc/hosts
192.168.10.101 master
192.168.10.102 web01
192.168.10.103 web02
EOF

2、安装master

yum -y install salt-3006.4-0.x86_64.rpm
yum -y install salt-master-3006.4-0.x86_64.rpm

扩展 saltstack 的可选组件
在这里插入图片描述

3、安装minion

102、103

yum -y install salt-3006.4-0.x86_64.rpm
yum -y install salt-minion-3006.4-0.x86_64.rpm

4、配置master

vim /etc/salt/master
interface: 192.168.10.101
auto_accept: True
file_roots:base:- /srv/saltnodegroups:group1: 'web01'group2: 'web02'pillar_opts: True
pillar_roots:base:- /srv/pillar# 绑定的监听 IP,Salt Master 服务通过此 IP 提供管理能力
interface: 192.168.10.101  
# 是否自动接受 Minion 端的密钥认证(生产环境慎用,可手动管理更安全)
auto_accept: True  
# 状态文件(SLS)根目录配置,'base' 环境对应路径
file_roots:  base:- /srv/salt  
# 节点分组,将 Minion 归类,方便批量管理(如 'web01' 等 Minion 归属 group1)
nodegroups:  group1: 'web01'group2: 'web02'  
# 是否启用 Pillar(用于传递敏感/动态数据给 Minion,开启后加载 pillar_roots 配置)
pillar_opts: True  
# Pillar 数据文件根目录配置,'base' 环境对应路径
pillar_roots:  base:- /srv/pillar  

/srv/sale
开启 saltstack 文件根目录位置,注意这个目录默认没有创建,需要自己手动创建。

/srv/pillar
#pillar 的主目录,需要自己创建

在设置主机组的时候可以同时写多个主机。
group1: ‘web01’ 组中有多个成员就用逗号隔开 -->group1: ‘web01,web03’

创建SaltStack的根目录,以及pillar的主目录

mkdir /srv/salt
mkdir /srv/pillar

启动master

systemctl start salt-master
systemctl enable salt-master

5、配置minion

vim /etc/salt/minion

192.168.10.102

master: 192.168.10.101
id: web01

192.168.10.103

master: 192.168.10.101
id: web02

如果修改了 minion 端的 id,minion 会重新注册,向 master 发送新的 key,老的注册信息就失效了,但此时 master 仍然会连接老的 minion,于是就会报错。
解决方法:可以删除掉老的 minion 注册信息,目录 /etc/salt/pki/master/minions,默认会使用 minion 端的 ip 地址作为 key 名称。将以前注册的 ID 删掉,即可。

启动minion

192.168.10.102,192.168.10.103

systemctl start salt-minion
systemctl enable salt-minion

当 Minion 启动后,会自动生成公钥私钥,并将公钥发送到 Master 端。Minion 不监听端口,全靠和 Master 保持长连接,可通过 netstat -an | grep ES 命令查看是否连接成功。至此 SaltStack 安装完成。

6、master 端查看 minion 秘钥

在 minion 启动后,会连接 master,并且会请求 master 为其签发证书,待证书签发完成后,代表 master 可以信任该 minion,并且 minion 和 master 端的通信是经过加密的。我们可以通过 salt-key 命令管理 minion 秘钥。
(1) 已接受的密钥(Accepted Keys):

salt-key -L

请添加图片描述
(2) 获取minion端的指纹码(摘要值)

salt-key -f "*"

请添加图片描述
(3) 验证
请添加图片描述
请添加图片描述

四、SaltStack基本命令使用

1、salt命令格式

(1) 使用命令帮助

salt --help
man salt

(2) 完整命令格式

salt --summary "*" cmd.run 'date'
salt -v "*" cmd.run 'date'
salt --out=json "*" cmd.run 'date'###选项注释如下###
--summary:显示命令的摘要信息
-v or --verbose:显示命令的详细描述信息
--out:可控制 salt 执行后的输出结果格式,例如 --out=json|raw|nested|quiet 等

请添加图片描述

2:在 Master 端测试 Minion

(1) 测试模块 --test
在 saltstack 中,有很多模块为运维人员提供了各种功能,其中用户环境测试的有个 test 模块,该模块提供了一系列专用的测试函数,利用这些测试函数,我们可以快速的对运维环境进行各项测试任务。

salt '*' test.ping

请添加图片描述
(2) 查看模块下的函数
test 模块实际上还包含许多其他有用的函数,如何知道这些函数,就需要 sys 模块的 list_functions 函数来实现了,sys.list_functions 用来查看指定模块所有的函数,其他函数的用法此处不在多做介绍,大家可以自行学习。

salt web01 sys.list_functions test

请添加图片描述

3、目标定位

在前面的例子中,对远程主机进行控制时,我们可以用主机的名字定位远程 minion 主机。但是在实际环境中,通常我们控制着成百上千的 minion 端主机,那么在不确定远程主机的准确名称的时候,或者要批量对多台主机进行控制时,又该如何灵活的定位所需的服务器呢?这里就可以使用全局匹配和正则匹配的方法

(1) 全局匹配
在这里插入图片描述

salt '*' test.ping
salt 'we*' test.ping
salt 'web??' test.ping
salt '[a-z]eb??' test.ping

请添加图片描述
(2)正则表达式匹配
如需执行更为复杂的匹配,可使用正则表达式。salt 使用 Python 的 re 正则表达式模块,可解析正则表达式(PCRE),正则表达式匹配需配合命令行选项-E或–pcre 。

常用正则表达式含义如下,先介绍元字符:正则表达式里有很多元字符,用于表示特殊含义或功能,元字符表达式及含义如下表:

在这里插入图片描述
转义字符:
如果一些特殊功能的字符、元字符,不希望它有特定功能,而就是希望使用这个字符的话,可以采用在前面加斜杠 “\” 进行转义的方法。
在这里插入图片描述
特定字符集:
正则表达式中的一些表示方法,可以同时匹配某个预定义字符集中的任意一个字符。
在这里插入图片描述
完全匹配

salt -E "web01" test.ping

请添加图片描述
全局匹配

salt -E ".*" test.ping

请添加图片描述
以特定字符开头或结尾匹配

salt -E "^web.*" test.ping

请添加图片描述
(3) 列表匹配
有时候,我们只想匹配一个指定列表里面的主机并进行远程操作,这时可能全局匹配和正则匹配的方式都无法很好的完成任务,这种情况我们可以直接使用 -L 选项进行列表匹配
如果需要以组为单位控制整个主机组所有的主机,可以使用选项 -N

salt -N group1 test.ping

请添加图片描述
以下是提取的文字内容:
这里的 group1 是我们在 master 配置文件中指定的主机组的名称:
nodegroups:
group1: ‘web01’
group2: ‘web02’

4、拷贝文件

salt-cp '*' /etc/hosts /opt
salt "*" cmd.run 'cat /opt/hosts'

请添加图片描述

五、远程执行模块和函数

远程执行命令的最后一部分是我们需要运行的模块以及相关函数和对应的执行参数。模块可以认为是函数的逻辑分组,一系列的函数可以组合在一起构成一个模块。接下来列举一些常见的模块的基本用法,以体验 saltstak 的强大功能。

1、模块和函数的查询

(1) 列出 minion 可用模块
模块为运维人员提供了很多功能,那么 minion 都可以使用哪些模块呢,我们可以使用 “sys.list_modules” 对模块进行查询。

salt "web01" sys.list_modules

请添加图片描述
(2) 列出某一模块的可用函数
不同的模块,他们的用法也各有区别,具体的用法体现在模块中的函数,那么某一个模块又有哪些函数构成,就可以使用 “sys.list_functions” 进行查询。

salt "web01" sys.list_functions cmd

请添加图片描述
(3) 列出某一函数的具体用法
如此多的函数,到底大家怎么使用,我们就可以是 “sys.doc” 说明文档进行查看,以获取详细的帮助功能。

salt web01 sys.doc cmd.run

请添加图片描述

2、远程命令执行模块 --cmd

(1) 如需到多台主机上同时执行一条相同的命令:cmd.run

salt "*" cmd.run "ps aux | wc -l"

请添加图片描述
(2) 显示更详细的执行信息的函数:cmd.run_all

salt "*" cmd.run_all "ps aux | wc -l"

请添加图片描述
(3) 查看所有主机的磁盘信息,cmd.run 执行单个命令

salt "*" cmd.run 'dnf -h'

请添加图片描述
(4) 查看所有主机的磁盘信息,并设置该命令执行的超时控制

salt "*" cmd.run 'dnf -h' -t 5

请添加图片描述
(5) 将本地脚本在远程主机上执行

echo 'ls -l' > /srv/salt/aaa.sh
salt '*' cmd.script salt://aaa.sh /opt

请添加图片描述

3、软件包管理模块 --pkg

(1) 安装一个软件包

salt '*' pkg.install "httpd"

请添加图片描述
(2) 查看已安装软件包

salt '*' pkg.version "httpd"

请添加图片描述
(3) 卸载

salt '*' pkg.remove "httpd"

请添加图片描述

4、服务管理模块 --service

服务管理也是系统管理员需要维护的一项重要任务,通过 salt 管理 minion 上的服务将会变得很简单。我们使用 service 模块,该模块包含了 service.start、service.status、service.stop 等。如果 service.status 远程执行模块函数输出 True 的结果,则表示该服务正在运行;如果输出的是 False,则表示该服务停止。启动或停止一个服务时,True 的结果意味着命令执行成功。

(1) 启动

salt '*' service.start httpd

请添加图片描述
(2) 查看状态

salt '*' service.status httpd

请添加图片描述
(3) 停止

salt '*' service.stop httpd

请添加图片描述
(4) 重启

salt '*' service.restart httpd

请添加图片描述
(5) 重载

salt '*' service.reload httpd

请添加图片描述

5、文件管理模块 --file

对于文件管理,salt 提供了 file 模块。

关于 file 模块的使用方式,可以使用命令 “salt web01 sys.list_functions file” 进行查看。这里举几个例子。

(1) 文件信息的查询

salt 'web01' file.stats /etc/passwd

请添加图片描述
(2) 创建文件

salt 'web01' file.touch /opt/aaa
salt "web01" cmd.run 'ls -l /opt/'

请添加图片描述
(3) 创建目录

salt 'web01' file.mkdir /opt/bbb
salt "web01" cmd.run 'ls -l /opt/'

请添加图片描述
(4) 修改文件归属

salt 'web01' file.chown /opt/aaa root zhangsan
salt "web01" cmd.run 'ls -l /opt/'

请添加图片描述
(5) 删除

salt "web01" cmd.run 'ls -l /opt/'
salt 'web01' file.rmdir /opt/bbb
salt 'web01' file.remove /opt/aaa

请添加图片描述
file.remove 既可以删除目录,也可删除文件,删除目录时为递归删除。

六、grains 的使用

Grains 是 SaltStack 的一个组件,其存放着 minion 启动时收集到的信息。用于查询 minion 端的 IP、FQDN 等信息。
Grains 是 SaltStack 组件中非常重要的组件之一,存放在 SaltStack 的 minion 端。grains 是由 minion 返回给 master 的数据,这些数据是 minion 端的,并且是以键值对的形式存储的。我们在做配置部署的过程中会经常使用它,Grains 是 SaltStack 记录 minion 的一些静态信息的组件。可简单理解为 Grains 记录着每台 minion 的一些常用属性,比如 CPU、内存、磁盘、网络信息等。我们可以通过 grains.items 查看某台 minion 的所有 Grains 信息。
当 salt-minion 启动时会把收集到的数据静态存放在 Grains 当中,只有当 minion 重启时才会进行数据的更新。由于 grains 是静态数据,因此不推荐经常去修改它。
应用场景:
信息查询,可用作 CMDB。

在 target 中使用,匹配 minion。

在 state 系统中使用,配置管理模块。

1、列出 minion 主机上的 grains 项

salt 'web01' grains.ls

请添加图片描述

2、列出 minion 主机上的 grains 项及其对应的值

salt 'web01' grains.items

请添加图片描述

3、grains 基本用法

通过下面的命令可以查看被控机 web01 主机的 grains 值

salt 'web01' grains.item ipv4
salt 'web01' grains.item nodename
salt 'web01' grains.item os
salt 'web01' grains.item num_cpus

请添加图片描述

4、自定义 grains 键值

对于 minion 端没有的 grains 数据,用户也可以自定义 minion 端的 grains 键值,如下所示:

salt 'web01' grains.set name lisi
salt 'web01' grains.item name

请添加图片描述

5、使用JSON格式定义多个值

salt 'web01' grains.set lisi '["man","18"]'
salt 'web01' grains.item lisi

请添加图片描述

6、在minion端添加

cd /etc/salt/
echo "id: admin">>grains

请添加图片描述

salt 'web01' grains.item id

请添加图片描述

七、pillar 的使用

很强大的功能,它可以指定一些信息到指定的 minion 上,不像 grains 一样是分发到所有 Minion 上的,它保存的数据可以是动态的,Pillar 以 sls 来写的,格式是键值对。与 grains 不同的是,pillar 的数据是存储在 master 端的。每个 minion 只能看到自己的 pillar 信息,grains 可以看做是主机的 metadata(元数据),例如 CPU 的数量;而 pillar 则是主机所需的数据(例如数据库的密码)。

总之,一个 minion 可以告诉 master 该 minion 的 grains 数据,而 minion 需要从 master 端索要 pillar 数据。

适用情景:

比较敏感的数据,比如密码,key 等
特殊数据到特定 Minion 上
动态的内容
其他数据类型

1、列出 minion 上的 pillar 详细信息

salt 'web01' pillar.items

请添加图片描述

2、自定义pillar

(1) 为每隔minion编写对应的sls文件

cd /srv/pillar/cat <<EOF> test1.sls
name: zhangsan
pass: pwd123
EOFcat <<EOF> test2.sls
name: lisi
pass: pwd123
EOFcat <<EOF> top.sls
base:'web01':- test1'web02':- test2
EOF

·sls 代表 SaltStack 文件,是一种 yaml 格式的描述文件,SLS 描述了系统的目标状态,由格式简单的数据构成。这经常被称作配置管理,top.sls 是配置管理的入口文件,一切都是从这里开始,在 master主机上,默认存放在 /srv/salt/ 目录,如果是自定义 pillar 数据,需要放置在 /srv/pillar 目录下。top.sls 默认从 base 标签开始解析执行,下一级是操作的目标,可以通过正则,grain 模块,或分组名,来进行匹配,再下一级是要执行的 state 文件,不包换扩展名。

(2) 更新 pillar 数据

salt '*' saltutil.refresh_pillar

请添加图片描述

(3) 列出所有的pillar

salt '*' pillar.ls

请添加图片描述
(4) 查看自定义pillar对应的信息

salt '*' pillar.item name

请添加图片描述

八、saltstack 目录与文件同步

在进行自动化运维过程中,我们经常会将某一个文件或整个目录中所有的文件同步到远程主机,这个需求我们可以通过各种方式实现,比如 rsync,scp 等。在 saltstack 中,我们也可以借助它的同步功能,帮助我们灵活的实现这种同步需求。

1、SaltStack 同步方式

可以在 master 端执行 salt ‘’ state.highstate 手动推送。
可以在 minion 端执行 salt-call state.highstate 手动拉取。
也可以将 salt-call state.highstate 命令放在 Minion 端的定时任务中,来进行自动请求同步。
也可以将 salt '
’ state.highstate 命令放在 Master 端的定时任务中,来进行自动推送到所有机器。
SaltStack 有两种同步对象:
同步目录
同步文件

2、目录同步

(1) 创建 SaltStack 分发目录

vim /srv/salt/top.sls
base:"*":- zabbix.zabbix

(2) 创建出需要同步的目录

mkdir -p /srv/salt/zabbix/zabbix_scripts

备注:
在 top.sls 文件中指定 web 开头主机访问 zabbix.sls 文件里面定义的内容。
zabbix.zabbix 代表 /srv/salt/ 目录下有个子目录 zabbix,这个子目录下有个 zabbix.sls 文件。

(3) 创建sls文件

vim /srv/salt/zabbix/zabbix.sls
/usr/local/zabbix/scripts:file.recurse:- source: salt://zabbix/zabbix_scripts- dir_mode: 755- file_mode: 744

备注:

/usr/local/zabbix/scripts: 指定 Minion 端同步后生成的目录
file.recurse:
-source: salt://zabbix/zabbix_scripts 指定要 Master 端同步的原始目录
-dir_mode: 755 用 dir_mode 设置目录的权限
-file_mode: 744 用 file_mode 来设置文件的权限
file 字段的其他写法:
file.managed 保证文件存在,并且为对应的状态
file.recurse 保证目录存在,并且为对应状态
file.absent 确保文件不存在,如果存在则删除

(4) 同步数据
在 master 端推送

salt '*' state.highstate

请添加图片描述
minion拉取

salt-call state.highstate

请添加图片描述

http://www.xdnf.cn/news/1304551.html

相关文章:

  • 【机器人-基础知识】ROS常见功能架构
  • 考研复习-计算机组成原理-第七章-IO
  • OpenCV---morphologyEx形态学操作
  • Jenkins+Python自动化持续集成详细教程
  • 【JavaEE】多线程 -- 死锁问题
  • Unity输入系统:旧版Input_System
  • 链路聚合与软件网桥配置
  • Mac(一)常用的快捷键整理
  • JavaScript(JS)DOM(四)
  • 【数据分享】2022 年黑龙江省小麦、玉米和水稻幼苗影像数据集
  • Python基础(Flask①)
  • 基于机器学习的赌博网站识别系统设计与实现
  • 数据结构——顺序表单链表oj详解
  • 8.15 机器学习(2)K最近邻算法
  • k8s注意事项
  • Nginx反向代理Tomcat实战指南
  • 8月4日实训考察:重庆五一职院走进成都国际影像产业园
  • PCA降维 提升模型训练效率
  • 【科研绘图系列】R语言绘制多种饼图
  • nVidia Tesla P40使用anaconda本地重编译pytorch3d成功加载ComfyUI-3D-Pack
  • 前端动画库之gsap
  • 深入解析五大通信协议:TCP、UDP、HTTP_HTTPS、WebSocket与GRPC
  • Al大模型-本地私有化部署大模型-大模型微调
  • 腾讯位置商业授权微信小程序逆地址解析(坐标位置描述)
  • day29-进程和线程(2)
  • C语言:指针(5)
  • lcm通信库介绍与使用指南
  • 使用Docker容器化Python测试Pytest项目并配置GitHub Actions CI/CD流程
  • Pytest项目_day16(yaml和parametrize结合)
  • week1-[循环嵌套]蛇