/*
大部分场合下,我们基本都是将salt安装到系统环境下的,例如使用yum install salt-master salt-
minion -y,这种方式超级简单,minion启动后指定正确的master即可完成认证和联接。如果涉及到salt
api的调用,我们还需要安装好salt-api,salt-api目前已经集成到salt源码里去了,默认自带的是tornado
服务和原生的wsgi支持,不过原生的wsgi只支持bind到本地环回地址上(127网段),tornado和cherrypy都不
受限制。不过网上的教程基本大多数都是关于salt-api基于cherrypy的,salt自带的tornado居然很少有人使
用,或许我没get到网友大大的点吧。话不多说,进入正题吧!
*/
我们知道,salt提供api的方式有两种,一种是函数式的,可理解为sdk ,另一种是http restapi形式的。那么分别如何使用呢?这里以python为例做说明。以下案例均建立在salt-master和salt-minion都起来,且命令行能正常执行salt指令的情况下,毕竟要保证你的salt环境是可用的。如果不熟悉salt,建议来这些博客学习学习:博客一 博客二 不过最好的博客自然是salt源码和salt官方文档。
1、函数式
yum install salt-api -y 后,便可直接用到我们python代码里了。
#!/usr/bin/env python
import salt.config
import salt.client
master_opts = salt.config.master_config('/etc/salt/config')
minion_opts = salt.config.minion_config('/etc/salt/minion')
local = salt.client.LocalClient('/etc/salt/config')
caller = salt.client.Caller('/etc/salt/minion')
local.cmd('*', 'test.ping')
caller.cmd('test.ping')
#对于执行时间过长的salt命令,可以选择异步的策略,如果没法区分同步/异步, 建议看看我的另一篇细说同步与异步的区别; 关于salt api更多的使用可以参考这些网址:官方地址 salt源码
2、http restapi形式
我们在salt-master的子配置目录master.d下,新建一个子配置文件salt-api.conf(专门针对http restapi的配置),其内容如下:
external_auth:
pam:
salt-api:
- .*
- '@wheel'
- '@runner'
- '@jobs'
rest_tornado:
# 必须填写,salt-api启动的端口
port: 8000
# 默认启动于0.0.0.0,可以不填写
host: 0.0.0.0
# 默认为False,True开启后,会输出debug日志
debug: True
# HTTP访问日志的路径
log_access_file: var/log/salt-api.access.log
# HTTP错误日志路径
log_error_file: var/log/salt-api.error.log
# SSL证书的绝对路径, 只能通过渲染模板从而配置成绝对路径
ssl_crt: conf/cert.pem
# SSK证书的私钥绝对路径, 当然了, 手动写死也是可以的, 虽然不灵活
ssl_key: conf/key.pem
# 在使用PyOpenSSL时可选参数,将证书出递给'Context.load_verify_locations'
#ssl_chain:
# 禁用SSL标识。认证证书将会被送进clear
disable_ssl: False
webhook_disable_auth: False
webhook_url: /salt/api/hook
thread_pool: 100
socket_queue_size: 30
expire_responses: True
max_request_body_size: 1048576
collect_stats: False
stats_disable_auth: False
cors_origin:
- '*'
重启salt-master, 并启动salt-api(service salt-api restart),服务如果起来了,我们可以通过命令看到端口监听情况
netstat -anptul|grep 8000
lsof -i:8000
注意上述的salt-api为我们restapi的用户名,所以我们先创建该用户:
useradd -M salt-api -s /sbin/nologin
echo 'passwd' |passwd salt-api --stdin
配置中的disable_ssl如果为True,意味着你的salt http api都是http的,而不需要https,如果需要的话,我们需要生成下cert和key
openssl genrsa –out key.pem 4098
openssl req –new –x 509 –key key.pem –out cert.pem –days 1826
如果你的salt api要基于cherrypy,那得安装下CherryPy (yum install python-cherrypy 或者 pip install CherryPy). salt-api起来后,我们首先需要拿到token令牌.
curl -ki https://127.0.0.1:8000/login -H "Accept: application/json" -d
username="salt-api" -d password="salt-api" -d eauth="pam"
拿到令牌以后,我们就可以happy的玩耍了。
curl -ik https://127.0.0.1:8000 -H "Accept: application/json" -H "X-Auth-
Token:4237789ba99e3906a50669fecadc8aedcdb8787c8fdcac09fbf24635ef0f0718" -d
client='local' -d tgt='*' -d fun="test.ping"
上述命令执行后,正常情况下返回ok;不过我在pip虚拟环境下搭建时,我发现这个没有任何返回,某某博文说到要加个-d c_path="salt配置目录的绝对路径",然并软。在查阅salt源码后,也没发现什么猫腻,不知道是不是版本的原因,后来我惊奇的发现,根本就没关系,原来是我的minion和master又不通了,我赶紧在命令行试了下,果然如此,于是乎,赶紧搞通了一把。最后不出所料,curl时不指定config path也是有正确的返回的。不过不得不吐槽一句,基于pip在虚拟环境下搭建的salt真的是每个指令都要指定配置文件目录,贼烦。虽然salt官网有说道可以编译安装salt时,调整salt的初始默认配置目录,但肯定不方便呀。不过虚拟环境下的salt管理起来更方便,和其他系统集成到一起也灵活许多,不过如果打包到容器里的话,就没必要搞这一出了。我最喜欢的一点是,基于pip+virtualenv显得系统很干净,搭建起来也超简单:pip install salt 一条指令就安装好salt-api, salt-master, salt-minion了,下面放上一些pip虚拟环境下的一些基础操作(saltstack/conf为虚拟环境下salt的配置目录, 启动服务失败的话,建议多使用-l debug参数):
# 启动
salt-master -c saltstack/conf -d
salt-minion -c saltstack/conf -d
salt-api -c saltstack/conf -d
# 停止
pkill salt-master/salt-minion/salt-api
# accept所有minion
salt-key -A -c saltstack/conf
# 测试效果
salt '*' test.ping -c saltstack/conf