文章目录
Salt概述
Salt 是一个基于python开源的基础设施管理和自动化工具,一般用于配置管理、远程执行和云管理,并且可以与其他自动化工具和脚本集成
- 配置管理:SaltStack 可以管理系统配置,确保所有系统的一致性
- 远程执行:SaltStack可以在多台服务器上并行执行命令,类似于Ansible,可用于软件安装、服务管理等
- 云管理:多个云提供商支持,可以对云资源的创建、配置和销毁实现自动化和管理
- 模块化:SaltStack 的模块丰富,可用于多种操作系统和应用程序,用户也可自定义模块
官方的一张很好看的图片
Salt与Ansible
Salt的优点:
- 实时性更强,基于事件架构
- 速度更快,使用 ZeroMQ 作为通信中间件,支持高并发和快速的命令执行
- 模块丰富,现成模块多,支持多种操作系统和应用程序
Salt的缺点:
- 依赖于特定的通信机制,需要部署 Salt Master 和 Minion。并且依赖 ZeroMQ,增加了一些部署和维护的复杂性
- 系统资源占用较高,大规模使用时需要注意系统资源分配(因为它的实时通信和实时状态管理的特点)
Ansible的优点:
- 上手简单,YAML语法,无需客户端(最大的优点)
- 系统占用低,轻量级,仅需要 Python 环境和 SSH访问权限(如果以Salt SSH系统作为 minion通信方式课可以做到目标系统无客户端,Salt也支持 YAML 语法)
Ansible的缺点:
- 性能相对较差,在大规模集群中不如 SaltStack,因为使用 SSH 通信,相较于ZeroMQ,速度与并发能力有限
- 实时性不足,无法实时进行状态监控
它们两者的社区和文档资源都很丰富
SaltStack 更适合大规模、需要实时管理和复杂自动化的场景
Ansible 则更适合中小规模的自动化任务和配置管理
Salt的组件
- Salt Master:中央管理节点,负责发送命令和接收结果
- Salt Minion:被管理的节点,执行从 Master 接收到的命令
- SLS 文件:Salt State file,用于定义配置和状态
- Pillar:用于存储和管理配置信息和机密数据
- Grains:收集 Minion 上的静态信息,如操作系统、主机名等
- Reactor:基于事件驱动的系统,可以根据事件自动触发操作
SaltStack的安装
官方安装手册:Manual install directions by operating system - Salt install guide (saltproject.io)
本文章采用 CentOS 7 x86_64位安装
准备工作
主机名 | 主机IP | 服务 |
---|---|---|
node1 | 192.168.84.5 | salt-master |
node2 | 192.168.84.6 | salt-minion |
node3 | 192.168.84.7 | salt-minion |
node1、node2、node3 三台主机都要执行
引入GPG公钥,用于检验安装包是否被更改
sudo rpm --import https://repo.saltproject.io/salt/py3/redhat/7/x86_64/SALT-PROJECT-GPG-PUBKEY-2023.pub
获取 SaltStack 的 YUM 仓库配置文件
curl -fsSL https://repo.saltproject.io/salt/py3/redhat/7/x86_64/latest.repo | sudo tee /etc/yum.repos.d/salt.repo
清除yum存储元数据
sudo yum clean expire-cache
安装salt-master端
在 node1 执行
#安装 master
yum install -y salt-master
#启动master服务
systemctl start salt-master
#检查master服务状态
systemctl status salt-master
#设置master服务自启动
systemctl enable salt-master
salt-master
正常启动的情况
安装salt-minion端
三个节点都要安装 salt-minion
分别在 node1 node2 node3 执行
#安装 salt-minion 端
yum install -y salt-minion
#启动 salt-minion 服务
systemctl start salt-minion
#检查 salt-minion 服务的状态
systemctl status salt-minion
#设置 salt-minion 服务自启动
systemctl enable salt-minion
salt-minion
正常启动的情况
配置SaltStack的主从节点
官方文档:https://docs.saltproject.io/salt/install-guide/en/latest/topics/configure-master-minion.html
配置文档:https://docs.saltproject.io/en/latest/ref/configuration/minion.html
配置 Salt Master 网络
在 node1 节点目录 /etc/salt/master.d
中创建 network.conf
#/etc/salt/master.d/network.conf
# 绑定 master 节点的IP
interface: 192.168.84.5
# The Request/Reply port
ret_port: 4506
# The port minions bind to for commands, aka the publish port
publish_port: 4505
配置Salt Master 进程
在 node1 节点目录 /etc/salt/master.d
中创建 thread_options.conf
#/etc/salt/master.d/thread_options.conf
worker_thread: 3
对于进程数的要求:
- 每 200 个 Minion 使用一个工作进程(worker_thread)
- 工作进程(worker_thread)的值不可超过可用 CPU 核心的 1.5 倍
查看 CPU 核心数的命令:lscpu
连接 Salt
在 node1 node2 node3 节点目录 /etc/salt/minion.d/
中创建文件 master.conf
三个节点都要创建
#/etc/salt/minion.d/master.conf
master: 192.168.84.5
重新启动 Salt
重新启动 node1 的 salt-master和salt-minion 服务
#重启salt-master服务
systemctl restart salt-master
#重启salt-minion服务
systemctl restart salt-minion
重新启动 node2 node3 的 salt-minion 服务
systemctl restart salt-minion
设置连接情况
重新生成 Minion 密钥
在需要重新生成 salt-key 的节点执行以下三条命令
比如使用
salt-key -d node2
删除 node2 节点后想在 node1 中重新连接 node2 节点重新生成某节点的 salt-key 前务必现在 master 节点中删除该连接节点
systemctl stop salt-minion
rm -f /etc/salt/pki/minion/minion.pem /etc/salt/pki/minion/minion.pub
systemctl start salt-minion
查看 node1 master节点的连接情况
salt-key -L
可以看到带链接的 minion 节点
设置允许 node2 主机连接
salt-key -a node2
设置允许所有主机连接
salt-key -A
此时 node1 node2 node3 节点均已连接到 node1 master节点
远程执行shell命令
第一条Salt命令
查看 node2 node3 节点上的 Salt 版本
#查看node2上的Salt版本
salt node2 test.version
#查看node3上的Salt版本
salt node3 test.version
#查看所有连接到node1的Salt版本
salt \* test.version
命令 | 描述 |
---|---|
salt \* test.ping | True 列出每个连接的 minion,如果 minion 已启用,则返回一个值 |
salt \* disk.usage | 列出每个 Minion 的磁盘及其当前磁盘容量的信息 |
salt \* pkg.list_pkgs | 列出所有 minions 上当前安装的软件包以及软件包版本号 |
salt \* pkg.version [package-name] | 列出所有连接的 minions 的某个软件包的版本 |
salt \* grains.get os_family | 列出所有已连接 minions 的操作系统系列 |
salt \* service.get_all | 列出所有已连接的 minions 上已安装的服务 |
salt \* service.get_enabled | 列出所有已连接的 minions 上已安装和启用的服务 |
使用Salt执行Shell命令
使用 cmd.run
命令实现
- 指定格式查看日期
salt \* cmd.run 'date +"%Y-%m-%d %H:%M:%S"'
- 列出
var/log
目录下的文件
需要注意的是 Salt cmd.run 中的 ‘ ’ 内的命令仅支持 Linux 原生命令,像是
ll
命令必须写为ls -a
salt \* cmd.run 'ls -a /var/log'
使用SLS状态文件
通过 SLS 状态文件创建一个 /tmp/managed-file.txt 文件
默认情况下,Salt Master 在 /srv/salt
目录下查找 SLS 文件 ,可在 Salt Master 的配置文件修改file_roots 属性
配置文档:https://docs.saltproject.io/en/latest/ref/configuration/minion.html
步骤:
- 在
/etc/salt/master.d
目录下创建file_roots.conf
文件并写入以下内容
file_roots:
base:
- /srv/salt
base下的目录为 sls 文件所在的执行目录,所有的 sls 文件默认在这个指定目录执行
-
重启 master 服务,在 node1 执行
systemctl restart salt-master
,更新配置后一定要更新配置的服务,这很重要 -
在
/srv/salt/
目录下创建文件fishpie.sls
,写入以下内容
add_example_file:
file.managed:
- name: /tmp/managed-file.txt
- makedirs: True
- contents: Yay!
add_example_file 部分为标识符,名称自定义,见名知意
file.managed 是您正在调用的 Salt State 模块和函数
name 参数列出文件的目录路径和名称
contents 参数将指定文本添加到指定文件
模块与函数:https://docs.saltproject.io/en/latest/ref/states/all/salt.states.file.html#salt.states.file.managed
注意格式缩进问题
- 执行文件 fishpie.sls 文件
salt-call state.apply fishpie
指定文件名即可,千万千万不要加 .sls
后缀
此时如果更改 fishpie.sls
文件的内容,比如更改文本的内容
居然是谏言:
file.managed:
- name: /tmp/managed-file.txt
- makedirs: True
- contents: Hello World!
可以看到 ID 与 文本内容 的变化
Salt对应用的配置
Salt安装配置MySQL
使用 SLS 文件为 node2 node3 安装MySQL服务,并设置 root 用户的密码为 Str0ngP@ssw0rd
MySQL服务器包在CentOS 7的默认存储库中不可用。CentOS 7已经转向使用MariaDB作为默认的MySQL兼容数据库
- 创建文件
/srv/salt/mysql/init.sls
# /srv/salt/mysql/init.sls
mariadb:
pkg.installed:
- name: mariadb-server
mariadb_service:
service.running:
- name: mariadb
- enable: True
- watch:
- pkg: mariadb
mariadb_root_password:
cmd.run:
- name: |
mysqladmin -u root password 'Str0ngP@ssw0rd'
- unless: mysql -u root -p'Str0ngP@ssw0rd' -e 'show databases;'
- require:
- service: mariadb_service
- node1 master 节点应用此 SLS 文件
salt \* state.apply mysql
执行成功会出现
注:由于作者的 node1 已经安装了mysql服务,此处的node1节点会出现问题
- 检验 MySQL 的安装与配置
salt \* cmd.run 'mysql -uroot -pStr0ngP@ssw0rd -e "SHOW DATABASES;"'
Salt安装配置Redis
为 node1 node2 node3 安装配置 Redis,并设置密码为 123456
- 创建文件
/srv/salt/redis/init.sls
redis:
pkg.installed:
- name: redis
redis_service:
service.running:
- name: redis
- enable: True
- watch:
- pkg: redis
redis_configuration:
file.managed:
- name: /etc/redis.conf
- source: salt://redis/files/redis.conf
- user: root
- group: root
- mode: 644
- require:
- pkg: redis
redis_password:
cmd.run:
- name: |
redis-cli CONFIG SET requirepass '123456'
- unless: redis-cli -a '123456' ping
- require:
- service: redis_service
- 创建Redis配置文件
srv/salt/redis/files/redis.conf
bind 127.0.0.1
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/redis_6379.pid
logfile "/var/log/redis_6379.log"
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
- 在 node1 master节点应用此 SLS 文件
salt \* state.apply redis
执行成功后截图
此时在node2 node3中可以发现已经存在 Redis命令
Salt安装配置Nginx
使用 SLS 文件为 node1 node2 node3 安装配置 Nginx
- 创建文件
/srv/salt/nginx/init.sls
nginx:
pkg.installed:
- name: nginx
nginx_service:
service.running:
- name: nginx
- enable: True
- watch:
- pkg: nginx
nginx_configuration:
file.managed:
- name: /etc/nginx/nginx.conf
- source: salt://nginx/files/nginx.conf
- user: root
- group: root
- mode: 644
- require:
- pkg: nginx
nginx_default_site:
file.managed:
- name: /etc/nginx/conf.d/default.conf
- source: salt://nginx/files/default.conf
- user: root
- group: root
- mode: 644
- require:
- pkg: nginx
- 创建 Nginx 配置文件
/srv/salt/nginx/files/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
}
- 创建 Nginx 默认站点配置文件
default.conf
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
- 应用此 SLS 文件
salt \* state.apply nginx
注:还是推荐在需要的节点上手动安装 Nginx