在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"}]}