目前salt API 支持的web模塊以下:python
salt 使用 CherryPy來實現restful的api,提供外部調用web
yum install -y salt-api
salt-api 使用eauth 驗證系統(使用api所在機器的帳戶進行驗證),最好單獨爲salt-api添加帳號:json
#建立系統帳戶 useradd -M saltapi passwd saltapi
安全方便的考慮,官方建議使用https進行加密通訊(若是使用http協議,忽略這部分。在配置文件上加上disable_ssl: True)。這時候須要生成自簽名的證書(若是你用通用證書,能夠直接使用)api
建立存放key的目錄 mkdir -p /opt/ssl/private
#此部分生成的key和cert證書不能使用- <!--生成key--> <!--openssl genrsa -out /opt/ssl/private/key.pem 4096 --> <!--生成證書--> <!--openssl req -new -x509 -key /opt/ssl/private/key.pem -out /opt/ssl/private/cert.pem -days 1826--> <!--查看路徑下生成的證書:--> <!--[root@master private]# ll /opt/ssl/private--> <!--total 8--> <!---rw-r--r-- 1 root root 1911 Jun 22 20:56 cert.pem--> <!---rw-r--r-- 1 root root 3243 Jun 22 20:55 key.pem-->
#1. 經過ssl生成私鑰,不要擔憂密碼問題,如今先輸入一個-稍後會取消這個密碼 [root@master private]# openssl genrsa -des3 -out server.key 2048 Generating RSA private key, 2048 bit long modulus .......................................................+++ .....................+++ e is 65537 (0x10001) Enter pass phrase for server.key: Verifying - Enter pass phrase for server.key: #2. 建立一個證書籤名請求(CSR)它會詢問CA簽發證書時關注的幾個重要問題,在內部網絡中,這些的重要性就低了** [root@master private]# openssl req -new -key server.key -out server.csr Enter pass phrase for server.key: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:BeiJing Locality Name (eg, city) [Default City]:BeiJing Organization Name (eg, company) [Default Company Ltd]:TEST Organizational Unit Name (eg, section) []:test Common Name (eg, your name or your server's hostname) []:test@example.com Email Address []:test@qq.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: #3. 接下來,咱們來取消以前私鑰中使用的密碼。 [root@master private]# cp server.key server.key.org [root@master private]# openssl rsa -in server.key.org -out server.key Enter pass phrase for server.key.org: writing RSA key #4. 最後,咱們建立自簽名的證書 [root@master private]# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt Signature ok subject=/C=CN/ST=BeiJing/L=BeiJing/O=TEST/OU=test/CN=test@example.com/emailAddress=test@qq.com Getting Private key #5. 至此,咱們有以下4個文件: [root@master private]# tree . ├── server.crt ├── server.csr ├── server.key └── server.key.org #6. 接下來將server.crt文件複製到ssl_crt選項指定的路徑,server.key 文件複製到ssl_key選項指定的路徑
建議爲salt-api單首創建配置文件,/etc/salt/master默認會導入master.d/*.conf安全
touch /etc/salt/master.d/salt-api.conf 添加內容: #關於用戶認證部分 external_auth: pam: #指定用戶 saltapi: #指定用戶能使用哪些salt模塊 例: - test.* #用戶可以訪問的runner模塊 #用戶可以訪問的wheel模塊 - .* - '@runnner' - '@wheel' rest_cherrypy: port: 9000 ssl_crt: /opt/ssl/private/cert.pem ssl_key: /opt/ssl/private/key.pem #進行重啓salt-master服務器 service salt-master restart
測試用戶是否登陸成功服務器
salt -a pam \* test.ping
查看saltapi用戶的錯誤登陸次數restful
pam_tally2 -u saltapi
清空saltapi用戶的錯誤登陸次數網絡
pam_tally2 -r -u saltapi
由於咱們是第一次使用salt-api ,爲了更好的瞭解它,咱們把debug設置爲True,session
在master端啓動Salt-APIapp
#命令salt-api啓動 [root@master ~]# salt-api [23/Jun/2017:15:18:38] ENGINE Listening for SIGHUP. [23/Jun/2017:15:18:38] ENGINE Listening for SIGTERM. [23/Jun/2017:15:18:38] ENGINE Listening for SIGUSR1. [23/Jun/2017:15:18:38] ENGINE Bus STARTING CherryPy Checker: 'log_file' is obsolete. Use 'log.error_file' instead. section: [saltopts] [23/Jun/2017:15:18:38] ENGINE Started monitor thread '_TimeoutMonitor'. [23/Jun/2017:15:18:38] ENGINE Started monitor thread 'Autoreloader'. [23/Jun/2017:15:18:38] ENGINE Serving on 0.0.0.0:9000 [23/Jun/2017:15:18:38] ENGINE Bus STARTED
文章找個推薦寫法:
curl -si https://127.0.0.1:9000/login -H 'Accept: application/json' -d username='saltapi' -d password='123456' -d eauth='pam'
可是在使用中發現會提示
SSL routines:SSL3_READ_BYTES:sslv3 alert certificate unknown #SSL例程:SSL3_READ_BYTES:sslv3警告證書未知
本身百度解決:
curl --sslv3 -k -si https://127.0.0.1:9000/login -H 'Accept: application/json' -d username='saltapi' -d password='123456' -d eauth='pam'
參數解釋:
--sslv3 指定sslv3版本 -k 忽略證書獲取https內容 -s 指定使用靜默(silent)方式 -i 指定SaltAPI收到服務器返回的結果同時顯示HTTP Header。 -H 指定一個特定的Header給遠端服務器,當SaltAPI 須要發送appliton-tion/json Header時。會以咱們但願的JSON格式返回結果 -d 想遠端服務器發送POST請求,以key=value的格式發送 ,注意key=v時,必須緊挨=號兩邊
獲取到的返回結果:
HTTP/1.1 200 OK Content-Length: 200 Access-Control-Expose-Headers: GET, POST Vary: Accept-Encoding Server: CherryPy/3.2.2 Allow: GET, HEAD, POST Access-Control-Allow-Credentials: true Date: Fri, 23 Jun 2017 07:27:47 GMT Access-Control-Allow-Origin: * X-Auth-Token: 8267c29f55a2b3b95a35de32ec30de353937c19c Content-Type: application/json Set-Cookie: session_id=8267c29f55a2b3b95a35de32ec30de353937c19c; expires=Fri, 23 Jun 2017 17:27:47 GMT; Path=/ {"return": [{"perms": [".*", "@runnner", "@wheel"], "start": 1498202867.8593781, "token": "8267c29f55a2b3b95a35de32ec30de353937c19c", "expire": 1498246067.8593791, "user": "saltapi", "eauth": "pam"}]}
在這個結果中,咱們獲取到了token,在以後的請求中咱們會使用到他。
"token": "8267c29f55a2b3b95a35de32ec30de353937c19c"
咱們在獲取到token後使用下面的命令來進行操做
curl -k -s https://127.0.0.1:9000/minions -H 'Accept: application/json' -H 'X-Auth-Token: 48590e5819f5bdd1abffed950647c7386f5bd2c5' -d client='local' -d tgt='*' -d fun='test.ping'
要格外注意兩點
1. -k 忽略https證書 2. -d 後面的參數 = 號兩邊不能有空格
獲取到的返回結果:
{"_links": {"jobs": [{"href": "/jobs/20170623155752802281"}]}, "return": [{"jid": "20170623155752802281", "minions": ["master"]}]}
爲了獲取返回的結果,咱們須要運行另一個包含任務ID的命令 ,該命令須要使用GET方法,
curl -k -s https://127.0.0.1:9000/jobs/20170623155752802281 -H 'Accept: application/json' -H 'X-Auth-Token: 48590e5819f5bdd1abffed950647c7386f5bd2c5'
關於salt-api部分python 調用 pycurl https
此部分聯繫管理員開通