> 文章列表 > 自动化运维工具SaltStack

自动化运维工具SaltStack

自动化运维工具SaltStack

1、简介

        Salt基于C/S架构,服务端叫Master,客户端叫Minion,Master与Minion之间通信是通过ZeroMQ消息队列。Master与Minion都以守护进程的方式运行,一直监听配置文件里面的ret_port端口(4506,接收Minion请求)和publish_port(4505,ZMQ的发布消息)。ZeroMQ使Salt能快速在成千上万台机器上进行各种操作。
        特点:简单易用,模块编写方便,社区活跃,解决问题速度快。可以执行任意命令(可以禁止某些命令执行),或则预定义的模块命令。针对单独独立服务器,或则同名一组服务器,或则相同角色,系统硬件信息,操作系统,当前版本等。

2、常用模块

        Salt常用模块:salt-master,salt-minion, salt-api, salt-ssh,salt-syndic。
Salt-master:控制minion执行Salt命令,获取minion执行命令结果。
Salt-minion:接收master下方的命令,并执行返回结果。
Salt-api: SaltStack官方提供的REST接口服务。
Salt-ssh: salt-ssh 是 0.17.0 新引入的一个功能,不需要minion对客户端进行管理,也不需要master。
Salt-syndic:隔离master与minion,使其不需要通讯,只需要与syndic都通讯就可以。

3、安装

        Saltstack安装
  Salt对于python版本(2.7+)和python模块有一定的要求,如果有外网可以使用yum进行模块的安装。
        yum install salt-master
        yum install salt-minion
        yum install salt-api

4、Saltstack配置

Master配置:
        给节点分组: /etc/salt/master
nodegroups:
 dwh: 'L@10.193.196.51,10.193.196.52‘
Minion配置:
        /etc/salt/minion ,末尾加上:master: 10.193.196.51(master的ip)
如果是分布式master配置添加多个:
master:
     - {master1}
     - {master2}
/etc/salt/minion_id: 加上(若没有该文件需要创建)加上一行minion本机IP
Api配置:
        创建salt-api用户: 
useradd -M -s /sbin/nologin salt-api 
echo "salt-api" | passwd salt-api —stdin
去掉ssl: /etc/salt/master.d/api.conf
rest_cherrypy:
   port: 8000
   disable_ssl: true
加上ssl:
rest_cherrypy:
   port: 8000
   ssl_crt: /etc/pki/tls/certs/localhost.crt
认证: /etc/salt/master.d/eauth.conf 
external_auth:  
  pam:  
    salt-api:  
      - .*  
      - '@wheel'  
      - '@runner‘

5、Saltstack启动检查

查看salt-minion节点,并签发证书,在salt-master节点执行以下命令。
# 输入
salt-key -L
# 输出
# 可见未签发证书的Minion节点,执行命令签发证书
 # 输入
salt-key -A -y              #添加salt-key
# 输出
The following keys are going to be accepted:
Unaccepted Keys:
datanode-1
datanode-2
datanode-3
datanode-4
namenode-1
Key for minion datanode-1 accepted.
Key for minion datanode-2 accepted.
Key for minion datanode-3 accepted.
Key for minion datanode-4 accepted.
Key for minion namenode-1 accepted.
# 测试shell命令
# 输入
salt gz-cashloan-test* cmd.run 'uname -r'
# 输出

sudo salt 10.193.196.51 ‘cmd.run’ ‘ls /’ salt '*' test.ping   salt -N 'dwh' test.ping
拷贝: salt-cp: sudo salt-cp "10.193.196.53" api.conf /home/develop/ 
将本地api.conf文件拷贝到10.193.196.53的/home/develop 目录下
还原:sudo salt "10.193.196.53" "cmd.run" "cp /home/develop/api.conf /etc/"
salt  -N  XXX  cp.get_file salt://文件名   /root/文件名

6、Salt-api测试

获取token:
curl -k http://localhost:8000/login -H 'Accept: application/x-yaml' -d username=salt-api -d password=salt-api -d eauth=pam

curl参数介绍
--sslv3 指定sslv3版本
-k 忽略证书获取https内容
-s 指定使用静默(silent)方式
-i 指定SaltAPI收到服务器返回的结果同时显示HTTP Header。
-H 指定一个特定的Header给远端服务器,当SaltAPI 需要发送appliton-tion/json Header时。会以我们希望的JSON格式返回结果
-d 想远端服务器发送POST请求,以key=value的格式发送 ,注意key=v时,必须紧挨=号两边

获取token后就可以使用token通信
注:重启salt-api后token改变

7、执行命令

curl -k http://10.193.196.51:8000/ -H "Accept: application/x-yaml" -H "X-Auth-Token:5096aff89e8b4634b122dcc7c43c5b91345be45b" -d client='local' -d tgt='dwh' -d expr_form='nodegroup' -d fun='test.ping‘

client :模块,python处理salt-api的主要模块,‘client interfaces <netapi-clients>’
    local : 使用‘LocalClient <salt.client.LocalClient>’ 发送命令给受控主机,等价于saltstack命令行中的'salt'命令
    local_async : 和local不同之处在于,这个模块是用于异步操作的,即在master端执行命令后返回的是一个jobid,任务放在后台运行,通过查看jobid的结果来获取命令的执行结果。
    runner : 使用'RunnerClient<salt.runner.RunnerClient>' 调用salt-master上的runner模块,等价于saltstack命令行中的'salt-run'命令
    runner_async : 异步执行runner模块
    wheel : 使用'WheelClient<salt.wheel.WheelClient>', 调用salt-master上的wheel模块,wheel模块没有在命令行端等价的模块,但它通常管理主机资源,比如文件状态,pillar文件,salt配置文件,以及关键模块<salt.wheel.key>功能类似于命令行中的salt-key。
    wheel_async : 异步执行wheel模块
    备注:一般情况下local模块,需要tgt和arg(数组),kwarg(字典),因为这些值将被发送到minions并用于执行所请求的函数。而runner和wheel都是直接应用于master,不需要这些参数。

 tgt : minions
fun : 函数
arg : 参数
expr_form : tgt的匹配规则
    'glob' - Bash glob completion - Default
    'pcre' - Perl style regular expression
    'list' - Python list of hosts
    'grain' - Match based on a grain comparison
    'grain_pcre' - Grain comparison with a regex
    'pillar' - Pillar data comparison
    'nodegroup' - Match on nodegroup
    'range' - Use a Range server for matching
    'compound' - Pass a compound match string

8、JAVA调用API

JAVA封装调用Saltapi
JAVA封装Client端代码:import com.suse.salt.netapi.client.SaltClient
封装参数代码:

9、Python调用salt客户端

import salt.client,salt.config
client = salt.client.LocalClient()
master = salt.config.client_config('/etc/salt/master')
minion = salt.config.minion_config('/etc/salt/minion')
ping_result = client.cmd('*', 'test.ping')
print 'master: %s minion: %s' %(master, minion)
print ping_result

10、总结

Puppet:
        puppet由Ruby编写,为server-client模式的系统。运行时由客户端定时去获取自己的配置文件进而应用更改。也可以通过master的push命令即可触发变更。
将命令,文件,服务等抽象成资源,概念比较统一,时间悠久,文档较多。
就可用操作,模块,用户界面等等功能而言,是三者之中最全面的,安装部署难度一般,配置清单相对于其他工具较复杂。
Ansible:
        类似与saltstack,基于python开发,关注的重点是精简和快速。不需要在节点安装代理软件,通过ssh执行所有功能。安装运行简单。
其模块可以用任何语言开发,采用yaml格式编写配置文件。
没有客户端,较难扩展。
SaltStack:
        saltStack由Python编写,为server-client模式的系统(在salstack中叫Master-Minion),自己本身支持多master,而puppet则需要依赖于web服务器。saltstack除了可以通过在节点安装客户端进行管理还支持直接通过ssh进行管理。运行模式为master端下发指令,客户端接收指令执行。
saltstack依赖于zeromq消息队列,采用yaml格式编写配置文件,比较简单。支持api及自定义python模块,能轻松实现功能扩展。
        salt管理较好的webui参考:
https://github.com/yueyongyue/saltshaker
https://github.com/saltstack/halite 
获取所有minion: curl -k http://127.0.0.1:8000 -H "Accept: application/json" -H "X-Auth-Token: " -d client='local_async' -d tgt='*' -d fun='ls /'
curl -k http://127.0.0.1:8000 -H "Accept: application/json" -H "X-Auth-t='local' -d tgt='dwh' -d expr_form='nodegroup' -d fun='test.ping'