天天看點

salt-api安裝及使用

salt-api介紹

saltsatck本身就提供了一套算完整的api,使用 cherrypy 來實作 restful 的 api,供外部的程式調用。

salt-api安裝

salt-api需要安裝,然後進行一些配置才可以正常使用,安裝方法有兩種。

方法一:

yum安裝,需要的依賴包cherry也會被補全裝上。

安裝salt-api,并設定開機啟動

yum -y install salt-api pyopenssl

systemctl enable salt-api

方法二:

pip安裝,首先要确認機器上有沒有安裝pip子產品。

rpm -ivh https://mirrors.aliyun.com/epel/7/x86_64/s/salt-api-2015.5.10-2.el7.noarch.rpm

pip install cherrypy==3.2.3

pip install cherrypy

pip install salt-api

配置自簽名證書

cd /etc/pki/tls/certs/

make testcert

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]:

organizational unit name (eg, section) []:

common name (eg, your name or your server’s hostname) []:

email address []:

解密key檔案,生成無密碼的key檔案, 過程中需要輸入key密碼,該密碼為之前生成證書時設定的密碼

cd /etc/pki/tls/private/

openssl rsa -in localhost.key -out localhost_nopass.key

修改檔案權限

chmod 755 /etc/pki/tls/certs/localhost.crt

chmod 755 /etc/pki/tls/private/localhost.key

chmod 755 /etc/pki/tls/private/localhost_nopass.key

添加使用者

生産環境請使用密碼複雜度高的密碼,這裡我使用salt2017

useradd -m -s /sbin/nologin saltapi

passwd saltapi

配置salt-api

修改/etc/salt/master檔案

sed -i ‘/#default_include/s/#default/default/g’ /etc/salt/master

建立/etc/salt/master.d/目錄

mkdir -p /etc/salt/master.d/

cd /etc/salt/master.d/

touch eauth.conf

touch api.conf

編輯eauth.conf,添加下面内容

external_auth:

pam:

saltapi: # 使用者

- .* # 該配置檔案給予saltapi使用者所有子產品使用權限,出于安全考慮一般隻給予特定子產品使用權限

編輯api.conf,添加下面内容

rest_cherrypy:

port: 8001

ssl_crt: /etc/pki/tls/certs/localhost.crt

ssl_key: /etc/pki/tls/private/localhost_nopass.key

啟動salt-api

systemctl restart salt-master

systemctl start salt-api

ps -ef|grep salt-api

netstat -lnput|grep 8001

驗證服務

獲得token

curl -k https://172.16.0.19:8001/login -h “accept: application/x-yaml” -d username=‘saltapi’ -d password=‘salt2017’ -d eauth=‘pam’

return:

eauth: pam

expire: 1494365711.173652

perms:

.*

start: 1494322511.173652

token: f40623825ea02606bfc558c982dbbfbb923c7570

user: saltapi

調用test.ping

curl -k https://172.16.0.19:8001/ -h “accept: application/x-yaml” -h “x-auth-token: f40623825ea02606bfc558c982dbbfbb923c7570” -d client=‘local’ -d tgt=’*’ -d fun=‘test.ping’

client1: true

saltstack: true

編寫python腳本請求salt api接口

自定義一個類,首先初始化時候獲得token,然後使用token認證去請求相應的json檔案。

salt指令在shell中使用方式是salt 用戶端 方法 參數(例子:salt ‘client1’ cmd.run ‘free -m’)。

這裡salt指令方法我們已經封裝好了,想使用salt的什麼方法就傳入對應的用戶端、方法、參數即可。

代碼如下:

#!/usr/bin/env python

* coding:utf-8 *

author = ‘junxi’

import requests

import json

try:

import cookielib

except:

import http.cookiejar as cookielib

使用urllib2請求https出錯,做的設定

import ssl

context = ssl._create_unverified_context()

使用requests請求https出現警告,做的設定

from requests.packages.urllib3.exceptions import insecurerequestwarning

requests.packages.urllib3.disable_warnings(insecurerequestwarning)

salt_api = “https://172.16.0.19:8001/”

class saltapi:

“”"

定義salt api接口的類

初始化獲得token

def init(self, url):

self.url = url

self.username = “saltapi”

self.password = “salt2017”

self.headers = {

“user-agent”: “mozilla/5.0 (windows nt 10.0; wow64) applewebkit/537.36 (khtml, like gecko) chrome/50.0.2661.102 safari/537.36”,

“content-type”: “application/json”

# “content-type”: “application/x-yaml”

}

self.params = {‘client’: ‘local’, ‘fun’: ‘’, ‘tgt’: ‘’}

# self.params = {‘client’: ‘local’, ‘fun’: ‘’, ‘tgt’: ‘’, ‘arg’: ‘’}

self.login_url = salt_api + “login”

self.login_params = {‘username’: self.username, ‘password’: self.password, ‘eauth’: ‘pam’}

self.token = self.get_data(self.login_url, self.login_params)[‘token’]

self.headers[‘x-auth-token’] = self.token

def main():

print ‘==================’

print ‘同步執行指令’

salt = saltapi(salt_api)

print salt.token

salt_client = ‘*’

salt_test = ‘test.ping’

salt_method = ‘cmd.run’

salt_params = ‘free -m’

# print salt.salt_command(salt_client, salt_method, salt_params)

# 下面隻是為了列印結果好看點

result1 = salt.salt_command(salt_client, salt_test)

for i in result1.keys():

print i, ': ', result1[i]

result2 = salt.salt_command(salt_client, salt_method, salt_params)

for i in result2.keys():

print i

print result2[i]

print

if name == ‘main’:

main()

檢視運作結果

第一行請求認證的token。

從結果可以看出來我們請求了兩條指令,test.ping和free -m

同步執行指令

83ad5789cf8046ff06972e1f92bb31f012609a78

指令參數: {‘fun’: ‘test.ping’, ‘client’: ‘local’, ‘tgt’: ‘’}

client1 : true

saltstack : true

指令參數: {‘fun’: ‘cmd.run’, ‘client’: ‘local’, ‘tgt’: '’, ‘arg’: ‘free -m’}

client1

total used free shared buff/cache available

mem: 220 153 7 2 59 31

swap: 2046 129 1917

saltstack

mem: 976 516 83 24 376 260

swap: 2046 0 2046

請求異步執行salt指令後的jid結果,首先要修改/etc/salt/master.d/eauth.conf 配置檔案,增權重限,然後重新開機salt-master和salt-api。

vi eauth.conf

修改内容如下:

saltapi:

- .*

- ‘@runner’

- ‘@wheel’

python編寫異步請求子產品

def salt_async_command(self, tgt, method, arg=none): # 異步執行salt指令,根據jid檢視執行結果

“”“遠端異步執行指令”""

if arg:

params = {‘client’: ‘local_async’, ‘fun’: method, ‘tgt’: tgt, ‘arg’: arg}

else:

params = {‘client’: ‘local_async’, ‘fun’: method, ‘tgt’: tgt}

jid = self.get_data(self.url, params)[‘jid’]

return jid

def look_jid(self, jid): # 根據異步執行指令傳回的jid檢視事件結果

params = {‘client’: ‘runner’, ‘fun’: ‘jobs.lookup_jid’, ‘jid’: jid}

print params

result = self.get_data(self.url, params)

return result

print ‘異步執行指令’

salt1 = saltapi(salt_api)

salt_params = ‘df -ht’

jid1 = salt1.salt_async_command(salt_client, salt_test)

result1 = salt1.look_jid(jid1)

對salt-api進行了二次開發,通過api控制minion,可能會遇到發送指令線程就進入了等待,然後就是逾時。

解決方法:salt.netapi.rest_cherrypy包裡面有一個app.py方法,修改’server.thread_pool’: self.apiopts.get(‘thread_pool’, 100)為200,修改’server.socket_queue_size’: self.apiopts.get(‘queue_size’, 30)為300 。重新開機salt-api 再次測試,ok。

vi /usr/lib/python2.7/site-packages/salt/netapi/rest_cherrypy/app.py

修改下面兩行内容

‘server.thread_pool’: self.apiopts.get(‘thread_pool’, 100),

‘server.socket_queue_size’: self.apiopts.get(‘queue_size’, 30),

‘server.thread_pool’: self.apiopts.get(‘thread_pool’, 200),

‘server.socket_queue_size’: self.apiopts.get(‘queue_size’, 300),

重新開機salt-api

systemctl restart salt-api