從零開始搭建Salt Web之初探salt-api


Salt-API入門

在Google搜索欄輸入salt-api,會有一些講述如何使用Salt-API的文章,確實有效,不過都是建立
在將Salt安裝在默認目錄下的情況下,即通過apt-get install salt(Ubuntu)或yum install
salt(CentOS)的方式。不過我希望的是項目能創建在自己指定的目錄中,關於這一點,貌似沒有找到有
相關介紹的文章,所以自己在這里記錄一下。

測試環境:

  • CentOS 7
  • Python 2.7.5
  • virtualenv 15.1.0
  • pip 9.0.1
  • salt 2016.11.2 (Carbon)

(假定相關的環境依賴都已安裝成功,有一台minion能與master連接)

安裝Salt

首先創建項目目錄/root/SaltAPI:

$ cd /root
$ mkdir SaltAPI

接下來則是在項目目錄下創建python虛擬環境,只是用於開發salt-api。

$ cd SaltAPI
$ virtualenv venv -p python2.7

這里指定了虛擬環境使用的python版本是2.7

通過pip安裝salt:

$ 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

因為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

在調用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之后,有兩種使用方式:

  1. 基於cookie的session
  2. 在http\https請求的headers這加上X-Auth-Token: 9ed34f06****f72976ef59bb5f4fa9

使用Salt-API

當直接使用以下方式執行命令,會得到空的結果:

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

參考文章

salt源碼

salt api 配置和使用

Salt-API安裝配置及使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM