10.3Saltstack常用模块及API
# salt "*" sys.list_modules
jenkins:
- aliases
- alternatives
- archive
- at
- cmd
- config
- cp
- cron
- daemontools
- data
- debconf
- dig
- disk
- django
- dnsmasq
- dnsutil
- event
- extfs
- file
- gem
- git
- grains
- group
- hg
- hosts
- img
- iptables
- key
- keyboard
- kmod
- locale
- locate
- logrotate
- lowpkg
- match
- mine
- modjk
- mount
- network
- partition
- pillar
- pip
- pkg
- pkg_resource
- publish
- rbenv
- ret
- rvm
- s3
- saltutil
- seed
- service
- shadow
- sqlite3
- ssh
- state
- status
- supervisord
- sys
- sysctl
- system
- test
- timezone
- tls
- user
- virtualenv
API的原理是通过调用master client模块,实例化一个LocalClient对象,再调用cmd()方法来实现的。以下是API实现test.ping的示例
import salt.client
client = salt.client.LocalClient()
ret = client.cmd("*","test.ping")
print(ret)
结果以一个标准的python字典形式的字符串返回,可以通过eval()函数转换成Python的字典类型,方便后续的业务逻辑处理,程序运行结果如下:
{'SN2013-08-022':True , 'SN2013-08-021':True}
eval():
把字符串,转成相对应的对象
>>> a = "[1,2,3,4,]"
>>> a
'[1,2,3,4,]'
>>> b = eval(a)
>>> b
[1, 2, 3, 4]
>>> c = "{1:'A',2:'B'}"
>>> c
"{1:'A',2:'B'}"
>>> c = eval(c)
>>> c
{1: 'A', 2: 'B'}
提示:将字符创字典转换成Python的字典类型,推荐使用ast模块literal_eval()方法,可以过滤表达式中的恶意函数
>>> a = ast.literal_eval(a)
>>> a
[1, 2, 3, 4]
>>> e = "{1:'A',2:'B'}"
>>> e
"{1:'A',2:'B'}"
>>> e = ast.literal_eval(e)
>>> e
{1: 'A', 2: 'B'}
(1) cmd模块
功能:实现远程的命令行调用执行(默认具备root权限,使用使需评估风险)。
示例:
#获取所有所有主机被控主机的内存使用情况
salt '*' cmd.run 'free -h'
API调用:
client.cmd = ('*','cmd.run',['free -h'])
(2)archive模块
功能:实现系统层面的压缩包调用,支持gunzip、gzip、rar、tar、unrar、unzip等
示例:
#采用gunzip解压/tmp/baidu.com.gz
salt '*' archive.gunzip /tmp/baidu.com.gz
#采用gzip压缩/tmp/baidu.com
salt '*' archive.gzip /tmp/baidu.com
(3) cp 模块
功能:实现远程文件、目录复制,以及下载URL文件等操作
#将指定被控的/etc/hosts文件复制到被控主机的salt cache目录(/var/cache/salt/minion/localfiles/)
salt '*' cp.cache_local_file /etc/passwd
API调用
client.cmd('*','cp.cache_local_file',['/etc/passwd'])
#将主服务器的file_roots指定位置下的目录复制到远程被控主机
salt '*' cp.get_dir salt://iamdir /tmp
API调用:
client.cmd('*','cp.get_dir',['salt://iamdir','/tmp'])
#将主服务器的file_roots指定位置下的文件复制到被控制主机
salt '*' cp.get_file salt://remote.py /tmp/remote.py
API调用:
client.cmd('*','cp.get_file',['salt://remote.py','/tmp/remote.py'])
#下载URL内容到被控制主机指定位置
salt '*' cp.get_url http://www.baidu.com /tmp/baidu.com
API调用
client.cmd('*','cp.get_url',['http://www.baidu.com','/tmp/baidu.com'])
(4)cron模块
功能:实现被控主机的crontab操作
示例:
#查看被指定被控主机、root用户的crontab操作
salt '*' cron.raw_cron root
API调用:
client.cmd('*','cron_raw_cron',['root'])
{'jenkins': '', 'centos': '* * * */1 * ls /tmp\n* * * */1 * ls /home\n'}
#为指定的被控主机、root用户添加ls /usr/local/weekly 任务作业
salt '*' cron.set_job root '*' '*' '*' '*' '1' 'ls /usr/local/weekly'
API调用:
client.cmd('*','cron.set_job',['root','*','*','*','*','1','ls /usr/local/weekly'])
#删除被控主机、root用户的crontab的ls /usr/local/weekly任务作业
salt '*' cron.rm_job root 'ls /usr/local/weekly'
API调用:
client.cmd('*','cron.rm_job',['root','ls /usr/local/weekly'])
(5)dnsutil模块
功能:实现被控主机通用DNS相关操作。
示例:
#添加指定被控主机hosts的主机配置
salt '*' dnsutil.hosts_append /etc/hosts 127.0.0.1 www.saltstack.com,www.saltstack1.co
API调用:
client.cmd('*','dnsutil.hosts_append',['/etc/hosts','127.0.0.1','www.saltstack.com,www.saltstack1.com'])
还可以用于给其他文件添加内容
#删除指定被控主机hosts的主机配置项
salt '*' dnsutil.hosts_remove /etc/hosts ad1.yuk.com
#如果有两个域名可以精确删除后一个还是前一个,当只有一个域名时,删除连带IP一起删除
API调用:
client.cmd('*','dnsutil.hosts_remove',['/etc/hosts','ad1.yuk.com'])
(6)file模块
功能:被控制主机文件常见操作,包括文件读写、权限、查找、校验等
1)#远程查看被控主机的/etc/passwd的md5校验是否为3d510a0412236fc3f68bb4679ae0ea33返回True则为匹配
salt 'choosefine-centos' file.check_hash /etc/passwd md5:53d510a0412236fc3f68bb4679ae0ea33
提示:这里有一个坑还不知道原因,cnetos是没问题的,书本上给的md5后面是等于号但是提示是错误的,提示要用冒号,还有Ubuntu运行报错
TypeError encountered executing file.check_hash: check_hash() got an unexpected keyword argument 'md5'. See debug log for more info. Possibly a missing arguments issue: ArgSpec(args=['path', 'hash'], varargs=None, keywords=None, defaults=None)
可能是版本原因
2)得到所有被控主机的md5校验
salt '*' file.get_sum /etc/passwd md5
3)修改所有被控主机的/tmp/passwd的所有者
[root@center-1 tmp]# salt '*' file.get_user /tmp/passwd
ubuntu:
root
choosefine-centos:
root
[root@center-1 tmp]# salt '*' file.get_group /tmp/passwd
ubuntu:
root
choosefine-centos:
root
[root@center-1 tmp]# salt '*' file.chown /tmp/passwd choosefine choosefine
#提示salt返回的是None,经检查并没有错误,具体不知道开发者为什么要设置成None
4)拷贝被控主机/etc/passwd文件到被控主机的/tmp/passwd
salt '*' file.copy /etc/passwd /tmp/passwd
5)检查所有主机的/tmp目录是否存在,如果存在则返回True
salt '*' file.directory_exists /tmp
6)获取所有被控主机的对应文件状态
salt '*' file.stats /etc/passwd
7)得到被控主机的/tmp/passwd文件的权限信息
salt '*' file.get_mode /tmp/passwd
8)修改被控主机的/tmp/passwd文件的权限信息
salt '*' file.set_mode /tmp/passwd 0755
9)在所有被控主机的/tmp目录下创建salt目录
salt '*' file.mkdir /tmp/salt
#这里有一个坑centos返回的是True,Ubuntu返回的是None
10)修改被控制端的/tmp/passwd文件中的dockerrot为docker
salt '*' file.sed /tmp/passwd 'dockerroot' 'docker'
11)给所有被控端的/tmp/passwd文件在最后追加内容给
salt '*' file.append /tmp/passwd 'I am appended'
12)删除被控端的/tmp/passwd文件
salt '*' file.remove /tmp/passwd
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import salt.client
#实例化对象
client = salt.client.LocalClient()
#salt '*' test.ping
ping = client.cmd('*','test.ping')
print(ping)
#salt '*' cmd.run 'free -h'
free = client.cmd('*','cmd.run',['free -h'])
print(free,type(free))
jenkins = free['jenkins']
print("jenkins free use:\n%s"%(jenkins))
#salt '*' cp.get_file salt://remote.py /tmp/remote.py
cp = client.cmd('*','cp.get_file',['salt://remote.py','/tmp/remote.py'])
print(cp)
#salt '*' cp.get_dir salt://iamdir /tmp/
get_dir = client.cmd('*','cp.get_dir',['salt://iamdir','/tmp'])
print("get_dir:%s"%(get_dir))
#salt '*' cp.get_url http://www.baidu.com /tmp/baidu.com
get_url = client.cmd('*','cp.get_url',['http://www.baidu.com','/tmp/baidu.com'])
#salt '*' cmd.run "chmod a+x /tmp/remote.py"
chmod = client.cmd('*','cmd.run',['chmod a+x /tmp/remote.py'])
print(chmod)
#salt '*' cron.raw_cron root
cron_list = client.cmd('*','cron.raw_cron',['root'])
print(cron_list)
#salt '*' cron.set_job root '*' '*' '*' '*' '*' 'ls /usr/local'
cron_job = client.cmd('*','cron.set_job',['root','*','*','*','*','1','ls /usr/local'])
print(cron_job)
#salt '*' cron.rm_job root 'ls /usr/local'
cron_rm = client.cmd('*','cron.rm_job',['root','ls /usr/local'])
print(cron_rm)

浙公网安备 33010602011771号