Saltstack相關Salt-api、Salt.client的具體問題擴展
問題背景:通過寫自動化運維平臺,發現salt-api對於管理被控端的密鑰管理,遠程執行命令,獲取指定被控端的服務器基本信息十分方便快捷,所以做下有關salt-api的筆記,方便以後回顧查看。
關於salt-api
saltstack本身提供了一套完整的使用CherryPy來實現restful的api,供外部程序調用.
官方文檔地址https://docs.saltstack.com/en/latest/topics/index.html
salt-api安裝
方法一:yum 安裝(yum install -y salt-api)
方法二:pip安裝(pip install cherrpy==3.2.3 pip install cherrypy pip install salt-api)
配置過程(思路):
- 創建用戶,配置密碼(useradd -M -s /sbin/nologin saltapi;passwd saltapi)
- 配置自簽證書,通過解碼key,生成無密碼key文件
- 修改master配置文件
- 重啟salt-master,salt-api服務
自動化腳本
yum install salt-api useradd -M -s /sbin/nologin salt-api echo "salt-api" |passwd --stdin salt-api # salt api基於證書通信 CRT_DIR=/etc/pki/tls/certs PRIVADE_KEY_DIR=/etc/pki/tls/private cd $CRT_DIR make testcert cd ../private # 解碼key,生成無密碼key文件 openssl rsa -in localhost.key -out localhost_nopass.key echo " rest_cherrypy: port: 8000 debug: True ssl_crt: $CRT_DIR/localhost.crt ssl_key: $PRIVADE_KEY_DIR/localhost_nopass.key external_auth: pam: salt-api: - .* - ‘@wheel‘ - ‘@runner‘ " >> /etc/salt/master service salt-master restart service salt-api restart
salt.client
問題背景:
在寫自動化運維腳本時,想定時抓取服務器的數據,最初想通過IP地址,指定不同的salt-minion服務器執行命令,可是查找網上資料發現只是用shell命令,添加參數-S,通過IP地址或者網段匹配MinionID,但是真正想通過salt.client接口在python中執行相關的命令。通過查閱官方文檔,和整理網上的資料,解決了這一問題,現在做個筆記。
Saltstack匹配Minion ID多種方法:
1、GLOBBING通配符
符合shell-style的通配符默認作為匹配Minion ID。
1)示例(匹配全部主機): salt ‘*’ test.ping 2)示例(匹配任意多個字符): salt ‘mbb*’ test.ping 3)示例(匹配單個字符): salt ‘mbb-?’ test.ping 4)示例(匹配單個字符的範圍) salt ‘mbb[1-9][x-z]’ test.ping
2、REGULAR EXPRESSIONS
通過添加參數”-E”,使用正則表達式匹配MINION ID
salt -E ‘mbb-(4|5)’ test.ping
3、LISTS
指定MINION ID列表匹配
salt -L ‘mbb-4,mbb-5’ test.ping
4、GRAINS
通過添加參數”-G”,根據Grain的數據用來匹配MINION ID
salt -G ‘os:CentOS’ test.ping
5、Subnet/IP Address
通過添加參數-S,IP地址,或者網段匹配MINION ID
salt -S 192.168.1.4 test.ping
salt -S 192.168.1.0/24 test.ping
salt.cient接口調用
class salt.client.LocalClient(c_path=u‘/etc/salt/master‘, mopts=None, skip_perm_errors=False, io_loop=None, keep_loop=False, auto_reconnect=False)
cmd()執行對目標主機的命令,具體的使用方法:
import salt.client
client = salt.client.LocalClient()
client.cmd(‘*’,’cmd.run’,[‘whoami’])
cmd方法的默認參數:
cmd(tgt, fun, arg=(), timeout=None, tgt_type=u‘glob‘, ret=u‘‘, jid=u‘‘, full_return=False, kwarg=None, **kwargs)
根據官方文檔顯示,tgt_type參數是選擇根據什麽方式匹配Minion ID:
tgt_type --
The type of tgt. Allowed values:
- glob - Bash glob completion - Default
- pcre - Perl style regular expression
- list - Python list of hosts
- grain - Match based on a grain comparison
- grain_pcre - Grain comparison with a regex
- pillar - Pillar data comparison
- pillar_pcre - Pillar data comparison with a regex
- nodegroup - Match on nodegroup
- range - Use a Range server for matching
- compound - Pass a compound match string
- ipcidr - Match based on Subnet (CIDR notation) or IPv4 address.
Changed in version 2017.7.0: Renamed from expr_form to tgt_type
示例:如我想指定IP地址匹配MINION ID
client.cmd(‘192.168.1.4’,’cmd.run’,’uname -a’,expr_form=’ipcidr’)
其實和saltstack在shell上的命令差不多含義,需要註意的不同saltstack版本對應指定匹配的字段是不一樣的,由於我的saltstack版本是 2015.5.10 版本的,所以仍舊延用expr_form字段,而2017.7.0後的版本則需要使用tgt_type字段。
遇到的一些問題及解決方法
問題背景:saltstack執行cp模塊的功能沒響應,其他模塊的功能測試都沒問題.
執行命令為: salt ‘mbb-5‘ cp.get_file salt://hosts /root/hosts
經過問題排查,發現“salt://”當/etc/salt/master文件沒有設置file_roots時,就會默認在/srv/salt目錄下,查找你要復制的文件夾或者目錄,如果目錄下沒有指定復制的文件,執行命令時就會返回空。
所以你需要將要遠程復制的文件放在此目錄下,然後,在執行操作,或者修改配置文件/etc/salt/master中的file_roots屬性,例如:
file_roots:
base:
- /data/
Saltstack相關Salt-api、Salt.client的具體問題擴展