• 为了保证你在浏览本网站时有着更好的体验,建议使用类似Chrome、Firefox之类的浏览器~~
    • 如果你喜欢本站的内容何不Ctrl+D收藏一下呢,与大家一起分享各种编程知识~
    • 本网站研究机器学习、计算机视觉、模式识别~当然不局限于此,生命在于折腾,何不年轻时多折腾一下

初探SaltStack

Sql admin 3年前 (2016-07-16) 1602次浏览 0个评论 扫描二维码

 

a97a9af03e5aa20b94d0889d90ded41a80b35d_meitu_1

SaltStack 是基于 Python 开发的一套 C/S 架构配置管理工具,他的底层使用ZeroMQ消息队列 pub/sub 方式通信,使用 SSL 证书签发的方式进行认证管理;

Python 客户端接口

为了允许简单的扩展,Salt 执行程序可以写为纯 Python 模块。数据从 Salt 执行过程中收集到可以发送回 master 服务端,或者发送到任何任意程序。Salt 可以从一个简单的 Python API 调用,或者从命令行被调用,所以 Salt 可以用来执行一次性命令,也可以作为一个更大的应用程序的一个组成部分。

特点

  1. SaltStack 是用 Python 语言开发的(模块可以自定义开发)

三种运行模式

  1. Local(本地)
  2. Master(主节点)/Minion(奴隶)
  3. Salt SSH(Web SSH)

三大功能

  1. 远程执行(多台机器批量执行)
  2. 配置管理(状态管理)
  3. 云管理(支持阿里云,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 是来接受消息的。

测试环境

所有主机的SElinuxfirewall均已关闭,系统采用的是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 ~]# cat /etc/hosts
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 ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
[root@linux-node1 ~]# uname -a
Linux linux-node1.example.com 3.10.0-327.22.2.el7.x86_64 #1 SMP Thu Jun 23 17:05:11 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

安装 SaltStack Master/Minion

  • 配置 SaltStack 的 yum 源

SaltStack 官方提供了自己的 yum 源,地址: https://repo.saltstack.com/

MasterMinion两台机器都执行

1
yum -y install https://repo.saltstack.com/yum/redhat/salt-repo-latest-1.el7.noarch.rpm
  • 安装salt-master并设置开机自启动
1
2
3
[root@linux-node1 ~]# yum -y install salt-master
[root@linux-node1 ~]# systemctl enable salt-master
Created symlink from /etc/systemd/system/multi-user.target.wants/salt-master.service to /usr/lib/systemd/system/salt-master.service.
  • 安装salt-minion并设置开机自启动
1
2
3
[root@linux-node2 ~]# yum -y install salt-minion
[root@linux-node2 ~]# systemctl enable salt-minion
Created symlink from /etc/systemd/system/multi-user.target.wants/salt-minion.service to /usr/lib/systemd/system/salt-minion.service.

配置 SaltStack Master/Minion

  • 启动Master

SaltStack Master 默认不需要做任何配置就可以启动,后续的文章当中会对 Master 进行一些配置.

1
2
3
[root@linux-node1 ~]# systemctl start salt-master   
[root@linux-node1 ~]# netstat -tlnp | grep "4505"
tcp        0      0 0.0.0.0:4505            0.0.0.0:*               LISTEN      1569/python
  • 配置Minion

Minion 需要指定 Master 的 IP 地址或者主机名

1
2
[root@linux-node2 ~]# vim /etc/salt/minion
 16 master: 192.168.56.11  # 修改成 Master 的 IP 地址或者主机名
  • 启动Minion
1
2
3
4
5
[root@linux-node2 ~]# systemctl start salt-minion
[root@linux-node2 ~]# ps -ef | grep "minion" | grep -v "grep"
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 秘钥

minion在启动的时候会在/etc/salt/pki/minion/目录下生成公钥与私钥,并且把公钥minion.pub发送个Master,如果master同意,那么master就可以管理这台minion了.

1
2
[root@linux-node2 ~]# ls /etc/salt/pki/minion/
minion.pem  minion.pub
  • Master 秘钥

master 秘钥存放目录/etc/salt/pki/master/

1
2
3
4
5
6
7
8
9
10
11
12
[root@linux-node1 ~]# tree /etc/salt/pki/master/
/etc/salt/pki/master/
├── master.pem
├── master.pub
├── minions   # 已经同意的 minion 公钥存放在此目录
├── minions_autosign
├── minions_denied
├── minions_pre    # 等待同意的 minion 公钥存放在此目录,名字以 minion 配置文件中的 ID 命名
│   └── linux-node2.example.com   # 待认证的 minion ID 名称
└── minions_rejected

5 directories, 3 files
  • Master 审批 Minion
1
2
3
4
5
6
[root@linux-node1 ~]# salt-key
Accepted Keys:  # 已同意的 key
Denied Keys:  # 拒绝的 key
Unaccepted Keys:  # 未同意的 key
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 ~]# salt-key -a linux-node2.example.com
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

1
[root@linux-node1 ~]# salt-key --help

同意之后Master会把自己的公钥发送给Minion,并存放在/etc/salt/pki/minion/目录下

1
2
[root@linux-node2 ~]# ls /etc/salt/pki/minion/
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 '*' test.ping
  • 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
  • salt-key 密钥管理,通常在 master 端执行
1
2
3
4
5
6
salt-key [options]
salt-key -L              # 查看所有 minion-key
salt-key -a <key-name>   # 接受某个 minion-key
salt-key -d <key-name>   # 删除某个 minion-key
salt-key -A              # 接受所有的 minion-key
salt-key -D              # 删除所有的 minion-key
  • 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 函数
  • 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 ~]# salt-cp '*' /tmp/yum.log /tmp/
linux-node2.example.com:
    ----------
    /tmp/yum.log:
        True

远程执行

远程执行相对来说比较简单,其实就是通过 salt-master 的模块让 minion 执行某个方法或者指定的 shell 命令

  • 检测在线的 Minion
1
2
3
[root@linux-node1 ~]# salt '*' test.ping
linux-node2.example.com:
    True

指令说明

参数 描述
salt salt 命令
‘*’ minion 主机,同样支持正则
test 模块
ping 模块中的某个方法

minion执行一个w命令

1
2
3
4
[root@linux-node1 ~]# salt 'linux-node2.example.com' cmd.run 'w'  
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 ~]# vim /etc/salt/master
452 # Example:
453 # file_roots:
454 #   base:
455 #     - /srv/salt/
456 #   dev:
457 #     - /srv/salt/dev/services
458 #     - /srv/salt/dev/states
459 #   prod:
460 #     - /srv/salt/prod/services
461 #     - /srv/salt/prod/states
462 #
463 file_roots:
464   base:  # 环境,默认必须要有 base 环境
465     - /srv/salt  # 文件存放目录

创建/srv/salt目录

1
[root@linux-node1 ~]# mkdir /srv/salt

重启salt-master

1
[root@linux-node1 ~]# systemctl restart salt-master
  • 写一个安装并启动 apache 的状态配置
1
2
3
4
5
6
7
8
9
10
11
12
[root@linux-node1 ~]# vim /srv/salt/apache.sls
apache-install: # 名称
  pkg.installed: # pkg=模块,installed=方法
    - names:  # 安装软件的列表,CentOS 使用 yum 安装,Ubuntu 使用 apt-get 安装,
      - httpd  # 软件包 1
      - httpd-tools  # 软件包 2

apache-service:
  service.running:
    - name: httpd   # 服务
    - enable: True  # 开机自启动
    - reload: True
  • 检查 minion 是否安装 apache
1
2
[root@linux-node2 ~]# rpm -qa httpd httpd-tools
[root@linux-node2 ~]# lsof -i :80
  • 安装 apache
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 ~]# salt 'linux-node2.example.com' state.sls apache
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 ~]# ps -ef | grep "yum"
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 ~]# rpm -qa httpd httpd-tools
httpd-2.4.6-40.el7.centos.1.x86_64
httpd-tools-2.4.6-40.el7.centos.1.x86_64
[root@linux-node2 ~]# lsof -i :80
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 ~]# vim /srv/salt/top.sls    
base: # 环境
  '*':  # 主机
    - apache  # 执行的状态
  • minion 卸载 httpd httpd-tools 软件包
1
2
3
4
5
6
[root@linux-node2 ~]# systemctl stop httpd
[root@linux-node2 ~]# systemctl disable httpd
Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.
[root@linux-node2 ~]# yum -y remove httpd httpd-tools
[root@linux-node2 ~]# lsof -i :80
[root@linux-node2 ~]# rpm -qa httpd httpd-tools
  • 执行状态让 minion 安装并启动 httpd
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 ~]# salt '*' state.highstate
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 ~]# rpm -qa httpd httpd-tools
httpd-tools-2.4.6-40.el7.centos.1.x86_64
httpd-2.4.6-40.el7.centos.1.x86_64
[root@linux-node2 ~]# lsof -i :80              
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 就先到这儿把,继续写数据系统….


Deeplearn, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明初探 SaltStack
喜欢 (0)
admin
关于作者:
互联网行业码农一枚/业余铲屎官/数码影音爱好者/二次元

您必须 登录 才能发表评论!