初探SaltStack

3,584次阅读
没有评论

共计 9857 个字符,预计需要花费 25 分钟才能阅读完成。

 

初探SaltStack

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就先到这儿把,继续写数据系统….

正文完
请博主喝杯咖啡吧!
post-qrcode
 
admin
版权声明:本站原创文章,由 admin 2016-07-16发表,共计9857字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码