SaltStack 自动化运维
SaltStack (salt)是一种新的基础设施管理方法开发软件、简单易部署、可伸缩的足以管理成千上万的服务器,和足够快的速度控制,与他们交流,以毫秒为单位。SaltStack 提供了一个动态基础设施通信总线用于编排、远程执行、配置管理等
SaltStack 是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,基于 Python 语言实现,结合轻量级消息队列(ZeroMQ)与 Python 第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack 和 PyYAML等)构建。
# salt docs
https://docs.saltstack.com/en/latest/
SaltStack 特性
(1)、部署简单、方便
(2)、支持大部分 UNIX/Linux 及 Windows 环境
(3)、主从集中化管理
(4)、配置简单、功能强大、扩展性强
(5)、主控端(master)和被控端(minion)基于证书认证,安全可靠
(6)、支持 API 及自定义模块,可通过 Python 轻松扩展
SaltStack 服务架构(C/S)
在 SaltStack 架构中服务器端叫 Master,客户端叫 Minion
部署环境:Debian 11
官网 Debian 下载文档:https://docs.saltproject.io/salt/install-guide/en/latest/topics/install-by-operating-system/debian.html#install-debian
# 配置 apt source
# 安装 salt
root@master:~# apt-get update
root@master:~# apt-get -y install salt-master salt-ssh salt-syndic salt-cloud salt-api
root@minion:~# apt-get update
root@minion:~# apt-get -y install salt-minion salt-ssh salt-syndic salt-cloud salt-api
# 启动 salt 服务
root@master:~# systemctl enable salt-master salt-syndic salt-api --now
root@minion:~# systemctl enable salt-minion salt-syndic salt-api --now
# 查看监听端口和 salt-key
# 由于 salt 的默认管理方式不是 ssh,所以 salt 关于此套 C/S 架构有专门的实现安全通信的方法,salt-key 就是实现 master 和 minion 安全通信的密钥
# salt-minion 配置 (172.16.201.11 为 master 节点 IP)
# salt-minion 的日志在 /var/log/salt/minion
# 在配置文件中修改 master 看到的 minion 名字
# key 的4种定义
- AcceptedKeys: 表示获得 salt 认可的 key
- DeniedKeys: 表示 salt 拒绝的 key(salt 自动操作产生的结果)
- UnacceptedKeys: 表示未获得 salt 认可的 key
- RejectedKeys: salt 吊销的 key(salt 手工操作产生的结果)
# salt-key 的目录树
# 查看 key 的指纹,只有 key 指纹一致时 master 和 minion 才可以通信
# remove key
# 删除旧 id 对应的 key , -d 表示删除 key,-y 表示确认删除
# 删除全部 key
root@master:~# salt-key -D -y
# 拒绝 minion 所有的 key
root@master:~# salt-key -R -y
# 恢复拒绝的 key
root@master:~# rm -rf /etc/salt/pki/master/minions_rejected/*
# 接受 minion 的 key
# -a 参数表示接受单个 key
# -A 参数表示接受所有的 key
# master 自动接受 minion key
# key 的黑白名单设置
# autosign_file 表示白名单,autoreject_file 表示黑名单
# salt-adhoc 测试
# salt 是核心命令,'*' 表示所有的 target,匹配所有被管理主机。test.ping 表示 salt 远程执行的一个模块中的一个用法,在这里面就表示的是 test (module) 模块里面的 ping
# salt 的命令结构
salt 参数 执行目标 salt模块的函数 远程执行的参数
例如:
# salt 一次性进行多次远程执行命令
# 列出 salt 命令的所有模块
root@master:~# salt debian11 sys.list_modules
# 列出某个模块下的函数 (以 cmd 模块为例)
# 设置 salt 远程执行结果的输出格式
# 查看 service 模块中 status 函数的用法文档
salt debian11 sys.doc service.status
# 查看所有远程主机 sshd 服务的状态
salt '*' service.status sshd
# 设置 sshd 服务下次开机不自动启动
salt '*' service.disable sshd
# 为 debian11 创建用户组并设置 gid 为 3456
salt debian11 group.add foo 3456
# 查看 debian11 远程主机 foo 用户组信息
salt debian11 group.info foo
# debian11 的 foo 用户组添加 test1 用户
salt debian11 group.adduser test1
# debian11 删除 foo 用户组
salt debian11 group.delete foo
# debian11 创建 sysop 用户并设置 uid 为 5678
salt debian11 user.add sysop 5678
# debian11 安装 tmux
salt debian11 pkg.install tmux
# debian11 卸载 apache2
salt debian11 pkg.remove apache2
# 从 salt-master 拷贝文件到所有 salt-minion
salt-cp '*' /root/salt-file /root
# 收集 debian11 的静态信息,类似于 ansible 的 setup 模块
salt debian11 grains.items --out=json
# 修改 salt-master 配置文件
# 在配置文件中定义了4个环境,分别是 base 环境,test 环境,dev 环境,prod 环境。必须要将写的状态文件(粗浅的理解为 ansible playbook)放入配置文件中指定的4个环境的路径中。在配置中定义的路径是这该环境的根路径,根路径下面还可以有子路径(子目录)
root@master:~# egrep -v '^#|^$' /etc/salt/master
auto_accept:true
file_roots:
base:
-/srv/salt/base
test:
-/srv/salt/test
dev:
-/srv/salt/dev
prod:
-/srv/salt/prod
# 创建对应的状态文件环境目录并重启服务生效
root@master:~# mkdir -p /srv/salt/{base,test,dev,prod}
root@master:~# systemctl restart salt-master
# salt 运维最重要的就是写 sls (salt state, 状态文件),和 ansible 的 playbook 一样都采用 yaml 文件格式