##准备工作
安装
salt 使用 CherryPy 来实现 restful 的 api,供外部的程序调用。
根据官方的文档配置 salt repo:
http://ppa.launchpad.net/saltstack/salt/ubuntu/
然后使用命令 sudo apt-get update && sudo apt-get install salt-api -y
安装 salt-api。
添加用户
salt-api 使用 eauth 验证系统(使用api所在机器的账户进行验证),最好单独为 salt-api 添加一个账号:
useradd -M salt
passwd salt
记住账户的密码,在下面的 api 登录中会用到。
配置文件
安全方面的考虑,官方文档建议使用 https 进行加密通信(如果想使用 http 协议,忽略这部分内容,在配置文件里加上 disable_ssl: True
)。这时候需要生成自签名的证书(如果你有通用的证书,可以直接使用):
# 生成 key
# openssl genrsa -out /etc/ssl/private/key.pem 4096
# 生成证书
# openssl req -new -x509 -key /etc/ssl/private/key.pem -out /etc/ssl/private/cert.pem -days 1826
建议为 salt-api 单独创建配置文件,/etc/salt/master
默认会导入 master.d/*.conf
,所以只要 touch /etc/salt/master.d/salt-api.conf
就可以了。文件的内容如下:
external_auth:
pam:
salt:
- .*
rest_cherrypy:
port: 8080
host: 0.0.0.0
# disable_ssl: True ## 如果不需要 https,直接使用 http ,可以去掉本行最前面的注释
ssl_crt: /etc/ssl/private/cert.pem
ssl_key: /etc/ssl/private/key.pem
然后重启 salt-master 和 salt-api 服务:
sudo service salt-master restart
sudo service salt-api restart
API 验证
至此,salt-api 已经可以使用了。在使用之前还有最后一步工作要做——获取 token,也就是登录。还记得上面的 salt 账号和密码吧:
curl -ki https://127.0.0.1:8080/login -H "Accept: application/json" \
-d username='salt' \
-d password='salt_pass' \
-d eauth='pam'
返回的结果:
{
"return": [
{
"eauth": "pam",
"expire": 1418415113.831753,
"perms": [
".*"
],
"start": 1418371913.831752,
"token": "f17847776f6ac228f41cd51ab545d8c1021dfa98",
"user": "salt"
}
]
}
拿到 token 之后,有两种使用方式:
- 基于 cookie 的 session 会话,比如浏览器或者 requests.Session。
- 在 http 请求的 header 加上
X-Auth-Token: f17847776f6ac228f41cd51ab545d8c1021dfa98
。
API 使用
使用上面的 token 在 minion 上执行命令非常简单:
curl -i http://localhost:8080/ -H "Accept: application/json" -H "X-Auth-Token: b363bf8b7a34c6a5db6719d745e32df38329a43e" -d client='local' -d tgt='minion-id1' -d fun="cmd.run" -d arg="uname -a"
返回结果:
{"return": [{"ubuntu": "Linux ubuntu 3.5.0-23-generic #35~precise1-Ubuntu SMP Fri Jan 25 17:13:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux"}]}
salt-api 除了直接调用 salt-client 之外,还提供了某些模块的快捷访问:
- /minions:管理 minion
- /jobs: jobs 查看,管理
- /run:绕过 token,直接通过用户名和密码访问 salt 服务
- /events
- /hook
- /keys
- …
请访问参考文档的 A REST API FOR SALT查看详细的内容。
API 性能
- salt 执行命令是并行的(使用 gevent 测试结果: 并行结果
max(37s, sleeptime)
),而 salt-api 测试下来不是并发的(尽管文档里有 thread_pool, socket_queue-size 的配置)。 - chrerrypy 本身的性能很高,基本在 ms 级(和 ab 测试结果一致)。
- 脚本运行时间 hp teaming: 7s, network setting: 5s
ab 测试 cherrypy API 性能
request number | request concurrency | requests/s | time/req | mean time | total |
---|---|---|---|---|---|
1 | 1 | 263.78 | 3.79 | 3.79 | 0.004 |
10 | 1 | 412.52 | 2.42 | 2.42 | 0.024 |
10 | 2 | 379.08 | 2.638 | 5.276 | 0.026 |
10 | 5 | 375.45 | 2.663 | 13.317 | 0.027 |
50 | 1 | 431.38 | 2.318 | 2.318 | 0.138 |
50 | 5 | 363.45 | 2.751 | 13.757 | 0.116 |
100 | 10 | 364.79 | 2.741 | 27.413 | 0.274 |
1000 | 1 | 445.05 | 2.247 | 2.247 | 2.247 |
1000 | 10 | 346.47 | 2.886 | 28.862 | 2.886 |
API 时间过长的解决方案
- rewrite salt-API
- trigger a salt action using API, return a job id.