salt-api安裝、配置、使用

alt-api也用了一段時間了,現在從安裝、配置、使用三個方面梳理下知識。
1、安裝
採用pip安裝方便快捷,當然編譯安裝也很nice。
安裝pip採用的編譯安裝的方式,版本當前最新1.5.6,下載、解壓、編譯、安裝是不變的法則。

[root@saltstack ~]#wget https://pypi.python.org/packages/source/p/pip/pip-1.5.6.tar.gz#md5=01026f87978932060cc86c1dc527903e --no-check-certificate
[root@saltstack ~]#tar xvfz pip-1.5.6.tar.gz
[root@saltstack ~]#cd pip-1.5.6
[root@saltstack pip-1.5.6]#python setup.py build
[root@saltstack pip-1.5.6]#python setup.py install
#安裝完成後可以用pip freeze查看已安裝的packages
[root@saltstack pip-1.5.6]#pip freeze

安裝CherryPy,版本3.2.3

[root@saltstack ~]#pip install cherrypy==3.2.3  #此步驟有時可以省略,yum安裝salt的時候可能會安裝此軟件,有的python版本自帶,需要注意的是python2.6版本自帶的cherrypy可能有問題,導致salt-api不能正常使用,如果遇到salt-api不能正常使用且配置都是正確,且python版本是2.6的時候可以考慮把python2.6自帶的cherrypy卸載重裝安裝一下

安裝salt-api,版本0.8.3(不一定是此版本,可安裝最新的)

[root@saltstack ~]#pip install salt-api==0.8.3
###或者也可以使用yum來安裝 推薦使用yum來安裝
[root@saltstack ~]#yum  install salt-api

2、配置

[root@saltstack ~]# cd /etc/pki/tls/certs
[root@saltstack certs]# make testcert
umask 77 ; \
    /usr/bin/openssl genrsa -aes128 2048 > /etc/pki/tls/private/localhost.key
Generating RSA private key, 2048 bit long modulus
...+++
..................................................................+++
e is 65537 (0x10001)
Enter pass phrase:    #鍵入加密短語,4到8191個字符
Verifying - Enter pass phrase:    #確認加密短語
umask 77 ; \
    /usr/bin/openssl req -utf8 -new -key /etc/pki/tls/private/localhost.key -x509 -days 365 -out /etc/pki/tls/certs/localhost.crt -set_serial 0
Enter pass phrase for /etc/pki/tls/private/localhost.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) []:Shanghai
Locality Name (eg, city) [Default City]:Shanghai
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:[email protected]
[root@saltstack certs]# cd ../private/
[root@saltstack private]# openssl rsa -in localhost.key -out localhost_nopass.key
Enter pass phrase for localhost.key:    #輸入之前的加密短語
writing RSA key

如果遇到這樣的錯誤

[root@saltstack certs]# make testcert
umask 77 ; \
    /usr/bin/openssl req -utf8 -new -key /etc/pki/tls/private/localhost.key -x509 -days 365 -out /etc/pki/tls/certs/localhost.crt -set_serial 0
unable to load Private Key
139696733648712:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:703:Expecting: ANY PRIVATE KEY
make: *** [/etc/pki/tls/certs/localhost.crt]

刪掉文件/etc/pki/tls/private/localhost.key文件,然後再make testcert。
爲salt-api創建用戶並設定密碼,用戶名沒有特別要求,我就用saltapi好了。

[root@saltstack ~]#useradd -M -s /sbin/nologin saltapi
#由於是測試,故採用了弱密碼"password",正式環境必須採用強密碼,多用特殊字符
[root@saltstack ~]# passwd saltapi

新增加配置文件/etc/salt/master.d/api.conf和/etc/salt/master.d/eauth.conf

#該配置文件給予saltapi用戶所有模塊使用權限,出於安全考慮一般只給予特定模塊使用權限
[root@saltstack master.d]# cat eauth.conf
external_auth:
  pam:
    saltapi:
      - .*
[root@saltstack master.d]#
[root@saltstack master.d]# cat api.conf
rest_cherrypy:
  port: 8888
  ssl_crt: /etc/pki/tls/certs/localhost.crt
  ssl_key: /etc/pki/tls/private/localhost_nopass.key
[root@saltstack master.d]#

如果使用yum安裝的可以省略以下步驟,直接使用systemctl restart salt-api 或者service salt-api restart來達到重啓的目的
尋找salt-api的啓動腳本,我比較懶就不自己寫了,在頁面https://github.com/saltstack/salt-api/releases下載salt-api的tar.gz包,啓動腳本在解壓包的這個位置./pkg/rpm/salt-api。
不過提供的腳本貌似有個小的bug,就是使用restart參數時,salt-api能夠stop但是不能start,如下:

[root@saltstack ~]# /etc/init.d/salt-api restart
Stopping salt-api daemon:                                  [確定]
Starting salt-api daemon:                                  [失敗]

我估計可能是有些相關資源在下次啓動前沒有來得及釋放造成的,解決方法很簡單在腳本的restart函數的stop和start之間加上sleep語句。

restart() {
   stop
   sleep 1
   start
}

然後重啓就沒有問題了(再次推薦使用yum來安裝salt-api)

[root@saltstack ~]# /etc/init.d/salt-api restart
Stopping salt-api daemon:                                  [確定]
Starting salt-api daemon:                                  [確定]
[root@saltstack ~]#

最後重啓salt-master在啓動salt-api並將salt-api加入開機啓動,安裝就完成了。

[root@saltstack ~]# chkconfig salt-api on
[root@saltstack ~]# /etc/init.d/salt-master restart
Stopping salt-master daemon:                               [確定]
Starting salt-master daemon:                               [確定]
[root@saltstack ~]# /etc/init.d/salt-api restart
Stopping salt-api daemon:                                  [確定]
Starting salt-api daemon:                                  [確定]
[root@saltstack ~]#

3、使用(基本的使用方法)
登錄獲取token

[root@syndic02 ~]# curl -k https://192.168.186.134:8888/login -H "Accept: application/x-yaml" -d username='saltapi' -d password='password' -d eauth='pam'
return:
- eauth: pam
  expire: 1416324685.2597771
  perms:
  - .*
  start: 1416281485.2597761
  token: 6171a922a9718ccb40e94ee7c8eb8768f4eea4e5
  user: saltapi

獲取token後就可以使用token通信

#相當於在salt-master本地執行salt \* test.ping
[root@syndic02 ~]# curl -k https://192.168.186.134:8888/ -H "Accept: application/x-yaml" -H "X-Auth-Token: 6171a922a9718ccb40e94ee7c8eb8768f4eea4e5" -d client='local' -d tgt='*' -d fun='test.ping'
return:
- syndic01: true
  syndic01-minion02: true
  syndic02: true
  syndic02-minion02: true

#相當於在salt-master本地執行salt \* test.echo 'hello world'
[root@syndic02 ~]# curl -k https://192.168.186.134:8888/ -H "Accept: application/x-yaml" -H "X-Auth-Token: 6171a922a9718ccb40e94ee7c8eb8768f4eea4e5" -d client='local' -d tgt='*' -d fun='test.echo' -d arg='hello world'
return:
- syndic01: hello world
  syndic01-minion02: hello world
  syndic02: hello world
  syndic02-minion02: hello world
[root@syndic02 ~]#

運維開發這樣使用還是不方便的,下面寫的是一個salt-api的類(其它的文章也提到過)可以參考。

#!/usr/bin/env python
#coding=utf-8

import urllib2, urllib, json, re

class saltAPI:
    def __init__(self):
        self.__url = 'https://192.168.186.134:8888'       #salt-api監控的地址和端口如:'https://192.168.186.134:8888'
        self.__user =  'saltapi'             #salt-api用戶名
        self.__password = 'password'          #salt-api用戶密碼
        self.__token_id = self.salt_login()

    def salt_login(self):
        params = {'eauth': 'pam', 'username': self.__user, 'password': self.__password}
        encode = urllib.urlencode(params)
        obj = urllib.unquote(encode)
        headers = {'X-Auth-Token':''}
        url = self.__url + '/login'
        req = urllib2.Request(url, obj, headers)
        opener = urllib2.urlopen(req)
        content = json.loads(opener.read())
        try:
            token = content['return'][0]['token']
            return token
        except KeyError:
            raise KeyError

    def postRequest(self, obj, prefix='/'):
        url = self.__url + prefix
        headers = {'X-Auth-Token'   : self.__token_id}
        req = urllib2.Request(url, obj, headers)
        opener = urllib2.urlopen(req)
        content = json.loads(opener.read())
        return content['return']

    def saltCmd(self, params):
        obj = urllib.urlencode(params)
        obj, number = re.subn("arg\d", 'arg', obj)
        res = self.postRequest(obj)
        return res

def main():
    #以下是用來測試saltAPI類的部分
    sapi = saltAPI()
    params = {'client':'local', 'fun':'test.ping', 'tgt':'*'}
    #params = {'client':'local', 'fun':'test.ping', 'tgt':'某臺服務器的key'}
    #params = {'client':'local', 'fun':'test.echo', 'tgt':'某臺服務器的key', 'arg1':'hello'}
    #params = {'client':'local', 'fun':'test.ping', 'tgt':'某組服務器的組名', 'expr_form':'nodegroup'}
    test = sapi.saltCmd(params)
    print test

if __name__ == '__main__':
    main()

測試效果

[root@syndic02 ~]# python salt-api.py
[{u'syndic02': True, u'syndic02-minion02': True, u'syndic01': True, u'syndic01-minion02': True}]
[root@syndic02 ~]#

以上只是一些基本的實例,salt-api還可以實現更多功能。
本文轉載自:http://www.xiaomastack.com/2014/11/18/salt-api/ 並在原文的基礎上做了些許的更新

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章