saltstack 自动化运维工具

saltstack 自动化运维工具

saltstack 官网

SaltStack采用C/S模式,server端就是salt的master,client端就是minion,minion与master之间通过ZeroMQ消息队列通信minion上线后先与master端联系,把自己的pub key发过去,这时master端通过salt-key –L命令就会看到minion的key,接受该minion-key后,也就是master与minion已经互信master可以发送任何指令让minion执行了,salt有很多可执行模块,比如说cmd模块,在安装minion的时候已经自带了,它们通常位于你的python库中

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

master端口:4505

minion端口:4506

SaltStack组件介绍

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

SaltStack部署

部署规划

host IP role
k8s-master01 192.168.100.100 master
k8s-node01 192.168.100.101 minion

环境准备
实验的机器分别对hosts文件进行修改。

1
2
3
4
5
6
[root@node-01 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.100 k8s-master01
192.168.100.101 k8s-node01

添加SaltStack源
分别对机器添加源。

1
2
sudo rpm --import https://repo.saltproject.io/py3/redhat/7/x86_64/latest/SALTSTACK-GPG-KEY.pub
curl -fsSL https://repo.saltproject.io/py3/redhat/7/x86_64/latest.repo | sudo tee /etc/yum.repos.d/salt.repo

安装SaltStack
node-01执行

1
yum -y install salt-master salt-minion

node-02、node-03执行

1
yum -y install salt-minion

配置SaltStack

master 修改 /etc/salt/master

1
2
3
4
5
# egrep -v '^#|^$' /etc/salt/master
interface: 192.168.100.100

#systemctl restart salt-master
#systemctl enables salt-minion

minion 修改 /etc/salt/minion

1
2
3
4
5
# egrep -v '^#|^$' /etc/salt/minion
master: 192.168.100.100

#systemctl restart salt-minion
#systemctl enables salt-minion

列出master上的密钥及认证

1
2
3
4
5
6
7
8
9
10
11
12
[root@k8s-master01 ~]#  salt-key -a k8s-node01
The following keys are going to be accepted:
Unaccepted Keys:
k8s-node01
Proceed? [n/Y] y
Key for minion k8s-node01 accepted.
[root@k8s-master01 ~]# salt-key
Accepted Keys:
k8s-node01
Denied Keys:
Unaccepted Keys:
Rejected Keys:

验证存活主机

1
2
3
#  salt '*' test.ping
k8s-node01:
True

salt常用命令

  1. salt 该命令执行salt的执行模块,通常在master端运行,也是我们最常用到的命令

    1
    2
    salt [options] '<target>' <function> [arguments]
    如: salt '*' test.ping
  2. salt-run 该命令执行runner(salt带的或者自定义的,runner以后会讲),通常在master端执行,比如经常用到的manage

    1
    2
    3
    4
    salt-run [options] [runner.func]
    salt-run manage.status #查看所有minion状态
    salt-run manage.down #查看所有没在线minion
    salt-run manged.up #查看所有在线minion
  3. salt-key 密钥管理,通常在master端执行

    在master端/etc/salt/master配置auto_accept: True #如果对Minion信任,可以配置master自动接受请求

    1
    2
    3
    4
    5
    6
    7
    salt-key [options]
    salt-key -L #查看所有minion-key
    salt-key -a <key-name> #接受某个minion-key
    salt-key -d <key-name> #删除某个minion-key
    salt-key -r <key-name> #注销掉指定key(该状态为未被认证)
    salt-key -A #接受所有的minion-key
    salt-key -D #删除所有的minion-key
  4. salt-call 该命令通常在minion上执行,minion自己执行可执行模块,不是通过master下发job

    1
    2
    3
    salt-call [options] <function> [arguments]
    salt-call test.ping ##自己执行test.ping命令
    salt-call cmd.run 'ifconfig' ##自己执行cmd.run函数
  5. salt-cp 分发文件到minion上,不支持目录分发,通常在master运行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    salt-cp [options] '<target>' SOURCE DEST
    salt-cp '*' testfile.html /tmp
    salt-cp 'test*' index.html /tmp/a.html

    [root@k8s-master01 ~]# salt-cp -N test1 nginx.yaml /tmp
    k8s-node01:
    ----------
    /tmp/nginx.yaml:
    True
    [root@k8s-master01 ~]# salt -N test1 cmd.run 'ls -l /tmp'
    k8s-node01:
    total 4
    -rw-r--r-- 1 root root 530 Jul 5 14:10 nginx.yaml
    drwx------ 2 root root 6 Jun 30 22:12 vmware-root_702-2722304542
    drwx------ 2 root root 6 Jun 30 21:51 vmware-root_705-4256479617
    drwx------ 2 root root 6 Jul 4 19:12 vmware-root_709-4248287236
    drwx------ 2 root root 6 Jun 30 21:48 vmware-root_740-2999460834
    [root@k8s-master01 ~]#

    salt主机分组管理

nodegroups 其实就是对Minion分组

首先在master的配置文件中对其分组,推荐写到/etc/salt/master.d/中一个独立的配置文件中,比如nodegroup.conf

  • G – 针对 Grains 做单个匹配,例如:G@os:Ubuntu
  • E – 针对 minion 针对正则表达式做匹配,例如:E@web\d+.(dev|qa|prod).loc
  • P – 针对 Grains 做正则表达式匹配,例如:P@os:(RedHat|Fedora|CentOS)
  • L – 针对 minion 做列表匹配,例如:L@minion1.example.com,minion3.domain.com or bl*.domain.com
  • I – 针对 Pillar 做单个匹配,例如:I@pdata:foobar
  • S – 针对子网或是 IP 做匹配,例如:S@192.168.1.0/24 or S@192.168.1.100
  • R – 针对客户端范围做匹配,例如: R@%foo.bar
1
2
3
4
5
6
7
#写到master中也是这个格式,master.d中*.conf是默认动态加载的
[root@k8s-master01 ~]# cat /etc/salt/master.d/nodegroup.conf
nodegroups:
test1: 'E@k8s*'
[root@k8s-master01 ~]# salt -N test1 test.ping #-N指定groupname
k8s-node01:
True

模块

官网模块说明

salt ‘*’ sys.doc cmd 查看方法

cmd模块

在Million上执行命令或者脚本

1
# salt -N test1 cmd.run 'df -h'

test模块

1
2
3
[root@k8s-master01 ~]# salt -N test1 test.ping
k8s-node01:
True

cp模块

实现远程文件、目录的复制,以及下载URL文件等操作,默认salt的仓库目录在/srv/salt,如果没有,请创建该目录

开启文件服务器

1
2
3
4
5
6
7
[root@k8s-master01 ~]# egrep -v '^#|^$' /etc/salt/master
interface: 192.168.100.100
file_roots:
base:
- /srv/salt

[root@k8s-master01 ~]# systemctl restart salt-master

测试推送文件和目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
[root@k8s-master01 ~]# echo 111 > /srv/salt/test.txt
[root@k8s-master01 ~]# cat /srv/salt/test.txt
111
[root@k8s-master01 ~]# salt -N test1 cp.get_file salt://test.txt /tmp
k8s-node01:
/tmp/test.txt
[root@k8s-master01 ~]# salt -N test1 cmd.run 'ls -l /tmp'
k8s-node01:
total 8
-rw-r--r-- 1 root root 530 Jul 5 14:10 nginx.yaml
-rw-r--r-- 1 root root 4 Jul 5 14:28 test.txt
drwx------ 2 root root 6 Jun 30 22:12 vmware-root_702-2722304542
drwx------ 2 root root 6 Jun 30 21:51 vmware-root_705-4256479617
drwx------ 2 root root 6 Jul 4 19:12 vmware-root_709-4248287236
drwx------ 2 root root 6 Jun 30 21:48 vmware-root_740-2999460834


[root@k8s-master01 ~]# mkdir /srv/salt/sourceFolder
[root@k8s-master01 ~]# echo s1 >/srv/salt/sourceFolder/s1.txt
[root@k8s-master01 ~]#
[root@k8s-master01 ~]# ll /srv/salt/sourceFolder
总用量 4
-rw-r--r-- 1 root root 3 7月 5 14:32 s1.txt
[root@k8s-master01 ~]# salt -N test1 cp.get_dir salt://sourceFolder /tmp
k8s-node01:
- /tmp/sourceFolder/s1.txt
[root@k8s-master01 ~]# salt -N test1 cmd.run 'ls -l /tmp'
k8s-node01:
total 8
-rw-r--r-- 1 root root 530 Jul 5 14:10 nginx.yaml
drwxr-xr-x 2 root root 20 Jul 5 14:32 sourceFolder
-rw-r--r-- 1 root root 4 Jul 5 14:28 test.txt
drwx------ 2 root root 6 Jun 30 22:12 vmware-root_702-2722304542
drwx------ 2 root root 6 Jun 30 21:51 vmware-root_705-4256479617
drwx------ 2 root root 6 Jul 4 19:12 vmware-root_709-4248287236
drwx------ 2 root root 6 Jun 30 21:48 vmware-root_740-2999460834

下载URL内容到被控主机指定位置(/tmp/index.html)

1
salt '*' cp.get_url http://www.slashdot.ort /tmp/index.html

file模块

被控主机常见的文件操作,包括文件读写、权限、查找、校验,推送文件

1
salt '*' file.copy /path/to/src /path/to/dst

cron模块


saltstack 自动化运维工具
https://www.lqy672.com/2023/07/20/自动化运维工具saltstack/
作者
liuqy
发布于
2023年7月20日
许可协议