共计 9857 个字符,预计需要花费 25 分钟才能阅读完成。
SaltStack是基于Python开发的一套C/S架构配置管理工具,他的底层使用ZeroMQ
消息队列pub/sub方式通信,使用SSL证书签发的方式进行认证管理;
Python客户端接口
为了允许简单的扩展,Salt执行程序可以写为纯Python模块。数据从Salt执行过程中收集到可以发送回master服务端,或者发送到任何任意程序。Salt可以从一个简单的Python API调用,或者从命令行被调用,所以Salt可以用来执行一次性命令,也可以作为一个更大的应用程序的一个组成部分。
特点
SaltStack是用Python语言开发的(模块可以自定义开发)
三种运行模式
Local(本地)
Master(主节点)/Minion(奴隶)
Salt SSH(Web SSH)
三大功能
远程执行(多台机器批量执行)
配置管理(状态管理)
云管理(支持阿里云,AWS等)
基本原理
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库中,locate salt | grep /usr/ 可以看到salt自带的所有东西。
这些模块是python写成的文件,里面会有好多函数,如cmd.run,当我们执行salt ‘*‘ cmd.run ‘uptime’的时候,master下发任务匹配到的minion上去,minion执行模块函数,并返回结果。master监听4505和4506端口,4505对应的是ZMQ的PUB system,用来发送消息,4506对应的是REP system是来接受消息的。
测试环境
所有主机的SElinux
与firewall
均已关闭,系统采用的是CentOS 7.2
主机分布
IP
主机名
角色
192.168.56.11
linux-node1.example.com
SaltStack master
192.168.56.12
linux-node2.example.com
SaltStack minion
系统环境
1
2
3
4
5
6
7
8
9
[root@linux-node1 ~]
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.56.11 linux-node1 linux-node1.example.com
192.168.56.12 linux-node2 linux-node2.example.com
[root@linux-node1 ~]
CentOS Linux release 7.2.1511 (Core)
[root@linux-node1 ~]
Linux linux-node1.example.com 3.10.0-327.22.2.el7.x86_64
安装SaltStack Master/Minion
SaltStack官方提供了自己的yum源,地址: https://repo.saltstack.com/
Master
与Minion
两台机器都执行
1
yum -y install https://repo.saltstack.com/yum/redhat/salt-repo-latest-1.el7.noarch.rpm
1
2
3
[root@linux-node1 ~]
[root@linux-node1 ~]
Created symlink from /etc/systemd/system/multi-user.target.wants/salt-master.service to /usr/lib/systemd/system/salt-master.service.
1
2
3
[root@linux-node2 ~]
[root@linux-node2 ~]
Created symlink from /etc/systemd/system/multi-user.target.wants/salt-minion.service to /usr/lib/systemd/system/salt-minion.service.
配置SaltStack Master/Minion
SaltStack Master默认不需要做任何配置就可以启动,后续的文章当中会对Master进行一些配置.
1
2
3
[root@linux-node1 ~]
[root@linux-node1 ~]
tcp 0 0 0.0.0.0:4505 0.0.0.0:* LISTEN 1569/python
Minion需要指定Master的IP地址或者主机名
1
2
[root@linux-node2 ~]
16 master: 192.168.56.11
1
2
3
4
5
[root@linux-node2 ~]
[root@linux-node2 ~]
root 1547 1 0 18:49 ? 00:00:00 /usr/bin/python /usr/bin/salt-minion
root 1552 1547 2 18:49 ? 00:00:00 /usr/bin/python /usr/bin/salt-minion
root 1556 1552 0 18:49 ? 00:00:00 /usr/bin/python /usr/bin/salt-minion
Master认证管理Minion
所有的salt-minion
都需要得到salt-master
的认证才可以进行管理,minion
只要在配置文件中指定了master
的IP地址,那么在启动minion
的时候就会向master发起请求,master
会进行请求的审批,是否管理Minion
.
minion
在启动的时候会在/etc/salt/pki/minion/
目录下生成公钥与私钥,并且把公钥minion.pub
发送个Master
,如果master
同意,那么master
就可以管理这台minion
了.
1
2
[root@linux-node2 ~]
minion.pem minion.pub
master秘钥存放目录/etc/salt/pki/master/
1
2
3
4
5
6
7
8
9
10
11
12
[root@linux-node1 ~]
/etc/salt/pki/master/
├── master.pem
├── master.pub
├── minions
├── minions_autosign
├── minions_denied
├── minions_pre
│ └── linux-node2.example.com
└── minions_rejected
5 directories, 3 files
1
2
3
4
5
6
[root@linux-node1 ~]
Accepted Keys:
Denied Keys:
Unaccepted Keys:
linux-node2.example.com
Rejected Keys:
命令参数
参数
说明
-A
同意所有主机
-a
同意某个主机,支持正则
-D
删除所有主机
-d
删除某个主机,支持正则
-R
拒绝所有主机
-r
拒绝某个主机,支持正则
-F
显示所有等待认证的主机key信息
-f
显示指定等待认证的主机key信息,支持正则
-L
列出所有的主机
同意指定主机
1
2
3
4
5
6
[root@linux-node1 ~]
The following keys are going to be accepted:
Unaccepted Keys:
linux-node2.example.com
Proceed? [n/Y] Y
Key for minion linux-node2.example.com accepted.
更多的用法请help
同意之后Master
会把自己的公钥发送给Minion
,并存放在/etc/salt/pki/minion/
目录下
1
2
[root@linux-node2 ~]
minion_master.pub minion.pem minion.pub
Master/Minion秘钥存放目录
master 秘钥对默认存储在/etc/salt/pki/master/master.pub
/etc/salt/pki/master/master.pem
master 端认证的公钥存储在:/etc/salt/pki/master/minions/
minion 秘钥对默认存储在:/etc/salt/pki/minion/minion.pub
/etc/salt/pki/minion/minion.pem
minion 存放的master公钥:/etc/salt/pki/minion/minion_master.pub
minion_id 默认存储在:/etc/salt/minion_id
salt常用命令
salt 该命令执行salt的执行模块,通常在master端运行,也是我们最常用到的命令
1
2
salt [options] '<target>' <function > [arguments]
salt-run该命令执行runner(salt带的或者自定义的,runner以后会讲),通常在master端执行,比如经常用到的manage
1
2
3
4
salt-run [options] [runner.func]
salt-run manage.status
salt-run manage.down
salt-run manged.up
salt-key密钥管理,通常在master端执行
1
2
3
4
5
6
salt-key [options]
salt-key -L
salt-key -a <key-name>
salt-key -d <key-name>
salt-key -A
salt-key -D
salt-call 该命令通常在minion上执行,minion自己执行可执行模块,不是通过master下发job
1
2
3
salt-call [options] <function > [arguments]
salt-call test.ping
salt-call cmd.run 'ifconfig'
salt-cp 分发文件到minion上,不支持目录分发,通常在master运行
1
salt-cp [options] '<target>' SOURCE DEST
把master的文件/tmp/yum.log
拷贝到minion的/tmp/
下
1
2
3
4
5
[root@linux-node1 ~]
linux-node2.example.com:
----------
/tmp/yum.log:
True
远程执行
远程执行相对来说比较简单,其实就是通过salt-master的模块让minion执行某个方法或者指定的shell命令
1
2
3
[root@linux-node1 ~]
linux-node2.example.com:
True
指令说明
参数
描述
salt
salt命令
‘*’
minion主机,同样支持正则
test
模块
ping
模块中的某个方法
让minion
执行一个w
命令
1
2
3
4
[root@linux-node1 ~]
linux-node2.example.com:
19:13:29 up 37 min, 0 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
状态(配置)管理
saltstack配置管理的sls
包括saltstack
的配置文件都是用YAML语法格式.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@linux-node1 ~]
452
453
454
455
456
457
458
459
460
461
462
463 file_roots:
464 base:
465 - /srv/salt
创建/srv/salt
目录
重启salt-master
1
2
3
4
5
6
7
8
9
10
11
12
[root@linux-node1 ~]
apache-install:
pkg.installed:
- names:
- httpd
- httpd-tools
apache-service:
service.running:
- name: httpd
- enable : True
- reload: True
1
2
[root@linux-node2 ~]
[root@linux-node2 ~]
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
[root@linux-node1 ~]
linux-node2.example.com:
----------
ID: apache-install
Function: pkg.installed
Name: httpd
Result: True
Comment: The following packages were installed/updated: httpd
Started: 19:57:10.727251
Duration: 16091.461 ms
Changes:
----------
httpd:
----------
new:
2.4.6-40.el7.centos.1
old:
httpd-tools:
----------
new:
2.4.6-40.el7.centos.1
old:
mailcap:
----------
new:
2.1.41-2.el7
old:
----------
ID: apache-install
Function: pkg.installed
Name: httpd-tools
Result: True
Comment: Package httpd-tools is already installed
Started: 19:57:26.824291
Duration: 0.862 ms
Changes:
----------
ID: apache-service
Function: service.running
Name: httpd
Result: True
Comment: Service httpd has been enabled, and is running
Started: 19:57:26.892530
Duration: 169.878 ms
Changes:
----------
httpd:
True
Summary for linux-node2.example.com
------------
Succeeded: 3 (changed=2)
Failed: 0
------------
Total states run: 3
linux-node2
正在用python执行yum安装软件包
1
2
3
[root@linux-node2 ~]
root 15527 15517 12 03:49 ? 00:00:01 /usr/bin/python /usr/bin/yum -y install httpd
root 15540 1422 0 03:50 pts/0 00:00:00 grep --color=auto yum
1
2
3
4
5
6
7
8
9
10
11
[root@linux-node2 ~]
httpd-2.4.6-40.el7.centos.1.x86_64
httpd-tools-2.4.6-40.el7.centos.1.x86_64
[root@linux-node2 ~]
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 16166 root 4u IPv6 37219 0t0 TCP *:http (LISTEN)
httpd 16167 apache 4u IPv6 37219 0t0 TCP *:http (LISTEN)
httpd 16168 apache 4u IPv6 37219 0t0 TCP *:http (LISTEN)
httpd 16169 apache 4u IPv6 37219 0t0 TCP *:http (LISTEN)
httpd 16171 apache 4u IPv6 37219 0t0 TCP *:http (LISTEN)
httpd 16172 apache 4u IPv6 37219 0t0 TCP *:http (LISTEN)
top.sls高级状态
哪些机器执行哪些状态,top.sls
必须放在base
环境下
1
2
3
4
[root@linux-node1 ~]
base:
'*' :
- apache
minion卸载httpd httpd-tools软件包
1
2
3
4
5
6
[root@linux-node2 ~]
[root@linux-node2 ~]
Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.
[root@linux-node2 ~]
[root@linux-node2 ~]
[root@linux-node2 ~]
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
[root@linux-node1 ~]
linux-node2.example.com:
----------
ID: apache-install
Function: pkg.installed
Name: httpd
Result: True
Comment: Package httpd is already installed
Started: 19:59:31.765356
Duration: 585.161 ms
Changes:
----------
ID: apache-install
Function: pkg.installed
Name: httpd-tools
Result: True
Comment: Package httpd-tools is already installed
Started: 19:59:32.350668
Duration: 0.399 ms
Changes:
----------
ID: apache-service
Function: service.running
Name: httpd
Result: True
Comment: The service httpd is already running
Started: 19:59:32.351471
Duration: 23.968 ms
Changes:
Summary for linux-node2.example.com
------------
Succeeded: 3
Failed: 0
------------
Total states run: 3
1
2
3
4
5
6
7
8
9
10
11
[root@linux-node2 ~]
httpd-tools-2.4.6-40.el7.centos.1.x86_64
httpd-2.4.6-40.el7.centos.1.x86_64
[root@linux-node2 ~]
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 16384 root 4u IPv6 38301 0t0 TCP *:http (LISTEN)
httpd 16385 apache 4u IPv6 38301 0t0 TCP *:http (LISTEN)
httpd 16386 apache 4u IPv6 38301 0t0 TCP *:http (LISTEN)
httpd 16387 apache 4u IPv6 38301 0t0 TCP *:http (LISTEN)
httpd 16388 apache 4u IPv6 38301 0t0 TCP *:http (LISTEN)
httpd 16389 apache 4u IPv6 38301 0t0 TCP *:http (LISTEN)
本篇初始SaltStack就先到这儿把,继续写数据系统
….