salt-api
问题背景:通过写自动化运维平台,发现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/