在Google搜索栏输入salt-api,会有一些讲述如何使用Salt-API的文章,确实有效,不过都是创建
在将Salt安装在默认目录下的状况下,即经过apt-get install salt(Ubuntu)或yum install
salt(CentOS)的方式。不过我但愿的是项目能建立在本身指定的目录中,关于这一点,貌似没有找到有
相关介绍的文章,因此本身在这里记录一下。html
测试环境:python
(假定相关的环境依赖都已安装成功,有一台minion能与master链接)git
首先建立项目目录/root/SaltAPI:github
$ cd /root $ mkdir SaltAPI
接下来则是在项目目录下建立python虚拟环境,只是用于开发salt-api。shell
$ cd SaltAPI $ virtualenv venv -p python2.7
这里指定了虚拟环境使用的python版本是2.7json
经过pip安装salt:api
$ pip install salt
到这里salt就算是安装完成了,能够查看一下salt的版本。缓存
$ salt --version salt 2016.11.2 (Carbon)
以后就能够输入salt-master运行salt了。不过这种方式运行的salt读取的配置都是默认值,并非
指望中的读取当前目录下相关配置。安全
在SaltAPI目录下手动建立配置文件目录以及密钥文件、缓存文件、日志文件等。服务器
$ mkdir conf # 存放配置文件的目录 $ mkdir -p var/run # 存放salt运行时文件的目录 $ mkdir -p var/pki # 存放密钥文件的目录 $ mkdir -p var/cache # 存放缓存文件的目录
salt-master运行时读取master这个配置文件,这里给出一份简单版本的,只指定了必要的配置项
# master会自动读取default_include目录先的全部配置文件 # 以后的salt-api文件也会存在这个目录下面 default_include: /root/SaltWeb/conf/*.conf # 绑定的接口地址 interface: 192.168.1.101 # pidfile文件目录 pidfile: var/run/salt-master.pid # 项目根目录 root_dir: /root/SaltAPI # 存放密钥目录 pki_dir: var/pki # 缓存文件目录 cachedir: var/cache # sock文件存放目录 sock_dir: var/run # master日志 log_file: var/log/salt_master.log # 是否自动接受minion的链接 auto_accept: True
如今运行salt-master。
# 若只执行salt-master -c conf,进程会占用当前的shell,因此将它放到后台执行 # 日志定向到var/log/salt_master.log文件中 # 不须要指定具体的master,salt会本身在conf文件下查找master文件 $ salt-master -c conf >var/log/salt_master.log 2>&1 &
有必要提醒一下,由于指定了配置文件,那么全部的salt相关操做也必须指定配置文件才能正常执行。
$ salt '*' test.ping [ERROR ] Unable to connect to the salt master publisher at /var/run/salt/master The salt master could not be contacted. Is master running? $ salt '*' test.ping -c conf 192.168.1.102: True
salt的准备工做基本完成,接下来则是salt-api。
由于salt-api使用eauth验证系统,即经过salt-api所在主机上的帐户进行验证,因此最好单首创建
一个用于登录salt-api的用户
$ useradd salttest $ passwd salttest
出于安全方面的考虑,官方建议使用https协议,如不想使用https协议,能够跳过这一步。
生成自签名的证书:
# 将证书生成在conf目录下 $ openssl genrsa -out conf/key.pem 4096 $ openssl req -new -x509 -key conf/key.pem -out conf/cert.pem -days 1826
接下来建立salt-api的配置文件conf/salt-api.conf:
external_auth: pam: salttest: # 刚才建立的用户名 - .* rest_tornado: port: 8080 host: 0.0.0.0 # disable_ssl: True # 若使用http协议,去掉注释,并注释下列两行 ssl_crt: conf/cert.pem ssl_key: conf/key.pem
而后运行salt-api
$ salt-api -c conf > var/log/salt-api.log 2>&1 &
至此,salt-api已经可使用了。
在调用salt-api前,须要获取token,即登录获取凭证。
$ curl -ki https://192.168.1.101:8080/login -H "Accept: application/json" \ -d username="salttest" -d password="password" -d eauth="pam" HTTP/1.1 200 OK Date: Wed, 01 Mar 2017 10:24:48 GMT Content-Length: 260 Content-Type: application/json Server: TornadoServer/4.4.2 {"return": [{"perms": [".*"], "start": 1488363888.19893, "token": "9ed34f06****f72976ef59bb5f4fa9", # 参数长,删减一部分 "expire": 1488407088.198931, "user": "uyun", "eauth": "pam"}]}
拿到token以后,有两种使用方式:
当直接使用如下方式执行命令,会获得空的结果:
$ curl -ik https://10.1.240.212:8090/ -H "Accept: application/json" \ -H "X-Auth-Token:9ed34f06****f72976ef59bb5f4fa9" \ -d client='local' -d tgt='*' -d fun="test.ping" HTTP/1.1 200 OK Date: Wed, 01 Mar 2017 12:00:14 GMT Content-Length: 16 Content-Type: application/json Server: TornadoServer/4.4.2 {"return": [{}]}
缘由前文中有提到过,在运行命令时必需要制定配置文件目录,否则得不到正确的结果。
那么问题就在于,如何经过http/https请求指定配置文件目录呢?
由于这个问题纠结了好一下子,最后才算是在源码中找到了传递配置文件参数的方法。这里就不详细
说明了。
请求中能够经过c_path参数指定配置文件目录。
$ curl -ik https://10.1.240.212:8090/ -H "Accept: application/json" \ -H "X-Auth-Token:9ed34f06****f72976ef59bb5f4fa9" \ -d client='local' -d tgt='*' -d fun="test.ping" -d c_path="/root/SaltAPI/conf" HTTP/1.1 200 OK Date: Wed, 01 Mar 2017 12:00:14 GMT Content-Length: 16 Content-Type: application/json Server: TornadoServer/4.4.2 {"return": [{"192.168.1.102": "true"}]}
并且,只须要再第一次执行命令时指定c_path参数(配置文件目录绝对路径),指定一次后salt-api服务器
会缓存配置,以后运行命令则不须要再次制定c_path参数。若是salt-api服务重启的话,再次执行命令还
是须要指定一次c_path参数。
$ curl -ik https://10.1.240.212:8090/ -H "Accept: application/json" \ -H "X-Auth-Token:9ed34f06****f72976ef59bb5f4fa9" \ -d client='local' -d tgt='*' -d fun="test.ping" HTTP/1.1 200 OK Date: Wed, 01 Mar 2017 12:00:14 GMT Content-Length: 16 Content-Type: application/json Server: TornadoServer/4.4.2 {"return": [{"192.168.1.102": "true"}]}