Salt上手指南

Salt概述

Salt 是一个基于python开源的基础设施管理和自动化工具,一般用于配置管理、远程执行和云管理,并且可以与其他自动化工具和脚本集成

  • 配置管理:SaltStack 可以管理系统配置,确保所有系统的一致性
  • 远程执行:SaltStack可以在多台服务器上并行执行命令,类似于Ansible,可用于软件安装、服务管理等
  • 云管理:多个云提供商支持,可以对云资源的创建、配置和销毁实现自动化和管理
  • 模块化:SaltStack 的模块丰富,可用于多种操作系统和应用程序,用户也可自定义模块

官方的一张很好看的图片

Features of Salt

Salt与Ansible

Salt的优点:

  1. 实时性更强,基于事件架构
  2. 速度更快,使用 ZeroMQ 作为通信中间件,支持高并发和快速的命令执行
  3. 模块丰富,现成模块多,支持多种操作系统和应用程序

Salt的缺点:

  1. 依赖于特定的通信机制,需要部署 Salt Master 和 Minion。并且依赖 ZeroMQ,增加了一些部署和维护的复杂性
  2. 系统资源占用较高,大规模使用时需要注意系统资源分配(因为它的实时通信和实时状态管理的特点)

Ansible的优点:

  1. 上手简单,YAML语法,无需客户端(最大的优点)
  2. 系统占用低,轻量级,仅需要 Python 环境和 SSH访问权限(如果以Salt SSH系统作为 minion通信方式课可以做到目标系统无客户端,Salt也支持 YAML 语法)

Ansible的缺点:

  1. 性能相对较差,在大规模集群中不如 SaltStack,因为使用 SSH 通信,相较于ZeroMQ,速度与并发能力有限
  2. 实时性不足,无法实时进行状态监控

它们两者的社区和文档资源都很丰富

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位安装

推荐文章:Linux CentOS9安装配置-CSDN博客

准备工作

主机名主机IP服务
node1192.168.84.5salt-master
node2192.168.84.6salt-minion
node3192.168.84.7salt-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.pingTrue列出每个连接的 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

  • 16
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值