saltstack

简介

saltstack是一个新的基础平台管理工具,只需要花费几分钟即可运行起来,可以支撑管理上万台服务器的规模,数秒钟即可完成数据的传递。

saltstack能够维护预定义状态的远程节点,也可以在远程节点执行命令和查询数据;开发的目的是为远程执行提供孔的解决方案,并使远程执行变得更好、更快、更简单。
saltstack使用python开发,同时也支持restAPI,方便二次开发以及和其它普通集成,同时官方也发布了一个web管理界面halite。

优势

  1. 速度快,saltstack使用消息队列zeroMQ传输数据,比ansible快大约40倍。
  2. C/S架构,执行信息比较稳定,不同意丢失信息或出现主机失联的情况。
  3. python开发,方便理解和自定义模块。

    架构

    saltstack中服务端叫做master,客户端叫做minion,都是以demon模式运行,一直监听配置文件中定义的ret_port(saltstack客户端与服务端通信的端口,负责接收客户端发送过来的结果,默认4506端口)和publish_port(saltstack的消息发布系统,默认4505端口)的端口。当minion运行时会自动连接到配置文件中定义的master地址ret_port端口进行连接认证。

    安装

    centos7.3.1611为例,使用yum安装。也可以通过源码编译、pip、salt-bootstrap等方式安装。

    关闭防火墙

    1
    2
    systemctl stop firewalld
    systemctl disable firewalld

epel源配置

yum安装salstack使用epel源。
yum install epel-release

安装master

1
yum install salt-master

安装minion

1
yum install salt-minion

客户端中配置master地址

1
2
vi /etc/salt/minion +16
master: 192.168.145.129

也可以使用sed命令实现

1
sed -i 's@#manster:.*@manster: 192.168.145.219@' /etc/salt/minion

启动服务

master

1
2
systemctl enable salt-master
systemctl start salt-master

minion

1
2
systemctl enable salt-minion
systemctl start salt-minion

配置

启动服务之后,客户端的/etc/salt下面产生一个minion_id文件(minion配置文件中id,不配置默认为主机名)同时还会产生一个pki文件,里面存放minion的公钥和私钥。
master

1
2
3
4
5
6
7
8
9
10
11
12
[root@master ~]# tree -L 3 /etc/salt
/etc/salt
├── master
└── pki
└── master
├── master.pem
├── master.pub
├── minions
├── minions_autosign
├── minions_denied
├── minions_pre
└── minions_rejected

minion

1
2
3
4
5
6
7
8
9
[root@slave ~]# tree -L 3 /etc/salt
/etc/salt
├── minion
├── minion.d
├── minion_id
└── pki
└── minion
├── minion.pem
└── minion.pub

master与minion认证

minion在第一次启动时,会在/etc/salt/pki/minion/(该路径在/etc/salt/minion里面设置)下自动生成minion.pem(private key)和 minion.pub(public key),然后将 minion.pub发送给master。master在接收到minion的public key后,通过salt-key命令accept minion public key,这样在master的/etc/salt/pki/master/minions下的将会存放以minion id命名的 public key,然后master就能对minion发送指令了。
认证命令使用salt-key --help可以看到详细使用方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@master ~]# salt-key -L  #查看当前证书签证情况
Accepted Keys:
Denied Keys:
Unaccepted Keys:
slave
Rejected Keys:
[root@master ~]# salt-key -A -y #接受所有证书
The following keys are going to be accepted:
Unaccepted Keys:
slave
Key for minion slave accepted.
[root@master ~]# salt-key -L
Accepted Keys:
slave
Denied Keys:
Unaccepted Keys:
Rejected Keys:

其他用法
salt-key -D 删除所有认证主机证书
salt-key -d id -y 删除指定id的证书
salt-key -a id 接受指定id的证书

远程执行

  1. -E, –pcre,通过正则表达式进行匹配
    salt -E 'web(9|10)*' test.ping -t 1
  2. -L, –list, 主机id进行过滤
    salt -L "*app*" cmd.run "df -h"
  3. -G, –grain, 根据被控主机的grains信息进行过滤
    salt -G 'role:nginx' cmd.run "ls /export"
  4. -I, –pillar, 根据被控主机的pillar信息进行过滤
    salt -I 'myname:xiang' test.ping -t 5
  5. -S, –ipcidr, 根据minion的ip地址进行匹配
    salt -S 192.168.1.1 test.ping
    salt -S 192.168.1.0/24 test.ping
    salt -S 192.168.0.0/16 test.ping
    salt -S 192.0.0.0/8 test.ping
  6. 检查客户端是否挂掉
    salt-run manage.status |head
    salt-run manage.down

    配置文件

    master和minion配置文件分别为/etc/salt/master/etc/salt/minion,内容基本一致,主要配置项说明。
  • interface
    默认是0.0.0.0(所有网络接口都可以访问)。
    绑定本地接口
    interface: 192.168.0.1
  • publish_port
    默认4505,提供服务的端口。
    publish_port: 4505
  • user
    默认是root
    user: root
  • ret_port
    默认是4506,返回服务器使用的端口。
    返回服务器指salt接收执行返回结果和命令执行状况的服务器。
    ret_port: 4506
  • auto_accept
    默认是False。设置为True之后master将会自动接收所有来自minion端的公钥请求。
    auto_accept: False

    模块介绍

  • Runner模块
    在master端执行salt-run
    使用案例
    检测各minion端是否在线 salt-run manage.status
  • Module模块
    通过master同步到minion端,在minion端执行salt-call saltutil.sync_modules
    salt-call saltutil.sync_all:包括beacons\clouds\engines\grains\log_handler\modiles\output\proxymodules\renderers\returners\sdb\states\utils。
  • cmd模块
    功能:实现远程的命令行调用执行(默认具备root操作权限)
    示例:
    salt '*' cmd.run "df -h"
  • ping模块
    salt '*' test.ping -t 5
  • cp模块
    功能:实现远程文件、目录的复制,以及下载URL文件等操作
    示例:
    1
    2
    3
    file_roots:  
    base:
    - /export/salt/root

salt根目录:在master中file_roots定义的路径,salt://test.txt相当于/export/salt/root/test.txt
salt 'wms5test1.app.172.17.23.176' cp.get_file salt://nscd.conf /tmp/aaa.txt

  • cron模块
    功能:实现minion端主机的crontab操作
    示例:

    1
    2
    3
    salt '*' cron.raw_cron root     (查看定时任务)
    salt '*' cron.set_job root '*' '*' '*' '*' 1 /export/scripts/rm_log.sh
    salt '*' cron.rm_job root /export/scripts/rm_log.sh
  • dnsutil模块
    功能:实现minion端主机通用的DNS操作
    示例:

    1
    2
    salt '*' dnsutil.hosts_append /etc/hosts 127.0.0.1 aaa.com
    salt '*' dnsutil.hosts_remove /etc/hosts aaa.com
  • file模块
    功能:实现minion端主机常见的文件操作,包括文件读写、权限、查找、校验
    示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    salt '*' file.chown /etc/passwd root root
    salt '*' file.copy /path/to/src /path/to/dst
    salt '*' file.file_exists /etc/hosts
    salt '*' file.directory_exists /etc/
    salt '*' file.get_mod /etc/passwd
    salt '*' file.set_mod /etc/passwd 0644
    salt '*' file.mkdir /tmp/test
    salt '*' file.sed /export/servers/nginx/conf/nginx.conf 'debug' 'warn'
    salt '*' file.append /tmp/test.txt "welcome xiang"
    salt '*' file.remove /tmp/1.txt
  • network模块
    功能:实现minion端主机网络信息查看
    示例:

    1
    2
    3
    salt '*' network.dig www.qq.com
    salt '*' network.ping www.qq.com
    salt '*' network.ip_addrs
  • pkg包管理模块
    功能:实现minion端主机程序包管理,如:yum等
    示例:

    1
    2
    3
    salt '*' pkg.install php
    salt '*' pkg.remove php
    salt '*' pkg.upgrade (升级所有的软件包)
  • service模块
    功能:实现minion端主机服务管理
    示例:

    1
    2
    3
    salt '*' service.enable nginx
    salt '*' service.disable nginx
    salt '*' service.restart nginx
  • Grains模块
    Grains在minion上定义的。
    它是在minion启动时搜集一些信息,如操作系统类型,网卡,内核版本,cpu架构等。
    salt "*" grains.ls 列出所有grains项目名字
    salt "*app.*" grains.items 列出所有grains项目以及值
    grains的信息并不是动态的,并不会实时变化,它只是在minion启动时收集到的。
    我们可以根据grains收集到的一些信息,做一些配置管理工作
    在minion上

    1
    2
    3
    vim /etc/salt/grains
    role: nginx
    env: test

重启service
systemctl restart salt-minion
获取grians:
salt "*" grains.item role env
或者:
salt -G "*" role:nginx cmd.run "hostname“
salt ‘*’grains.items
上面使用的是在minion端进行配置,但是机器多了配置起来比较麻烦。
下面在master端进行配置,然后分发给minion端。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mkdir /srv/salt/_grains
cd /srv/salt/_grains/
vi mytest.py

#!/usr/bin/env python
# _*_ coding:utf-8 _*_

import os

def my_test():
grains = {}
grains['say'] = 'hello world'
return grains

def my_test1():
grains = {}
with os.popen('free -m') as f:
grains['mem_usage'] = f.read()
return grains

同步至客户端
salt '*' saltutil.sync_all
master端刷新模块
salt '*' sys.reload_modules
master查看客户端自定义的监控项
salt "*" grains.item say
salt "*" grains.item mem_usage

  • Pillar模块
    pillar 和 grains 不一样,是在 master 上定义的,并且是针对 minion 定义的一些信息。像一些比较重要的数据(密码)可以存在 pillar 里,还可以定义变量等。
    首先我们查看master端pillars组件是否在开启状态
    查看/etc/salt/master pillar_ops: True 就代表pillars在开启状态,否则我们手动修改。
    新的版本默认已经开启。
    查看minion端的pillar信息
    1
    2
    3
    [root@master minions]# salt '*' pillar.items
    slave:
    ----------

master端自定义配置pillar

1
2
3
4
5
6
7
8
9
10
11
12
[root@master ~]# vi /etc/salt/master +529    // 找到如下内容,去掉#号
pillar_roots:
base:
- /srv/pillar
[root@master ~]# mkdir /srv/pillar
[root@master ~]# vi /srv/pillar/test.sls // 自定义配置文件,内容如下
conf: /etc/mum.conf
myname: primum est
[root@master ~]# vi /srv/pillar/top.sls // 总入口文件,内容如下
base:
'client1':
- test

重启master
systemctl restart salt-master
注意:当更改完 pillar 配置文件后,我们可以通过刷新 pillar 配置来获取新的 pillar 状态。
salt '*' saltutil.refresh_pillar
验证

1
2
3
4
5
6
7
[root@master pillar]# salt 'slave' pillar.items
slave:
----------
conf:
/etc/mum.conf
myname:
primum est

上述简单介绍了一部分模块的内容,更多更详细可以点击SALTSTACK查看官方文档介绍。

Recommended Posts