Saltstack时一个服务器基础架构的集中化监控平台,具备配置管理、远程执行、监控等功能。具备如下特点:

    部署简单、方便

    支持大部分LINUX及WINDWOS环境

    主从集中化管理

    配置简单、功能强大、扩展性强

    主控端(master)和被控端(minon)基于证书认证、安全可靠

    支持api及自定义模块、可以通过python轻松扩展。


一、saltstack的安装

1.1 测试环境准备

角色                     IP                                 os                   id   

Master             172.101.63                      centos7        

minion             172.31.101.52                  centos7       splunk


2.2 安装

安装之前需要配置epel源,yum install -y epel-release即可

主服务器端(主控制端)

yum install salt-master -y
systemctl enable salt-master 
systemclt start salt-master


从服务器安装(被控端)

yum install salt-minion -y
systemctl enable salt-minion 
systemclt start salt-minion


在主控端添加tcp 4505、tcp 4506的规则,而在被控端无需配置防火墙、原理是被控端直接与主控端zeromq建立长连接,接受广播到任务信息并执行,

iptables -I INPUT -m state --state new -m tcp -p tcp --dport 4505 -j ACCEPT
iptables -I INPUT -m state --state new -m tcp -p tcp --dport 4506 -J ACCEPT


2.3更新Saltstack配置及安装校验

    主控端和被控端安装完毕后需要对两种角色的配置为你教案进行修改

主控端配置

(1)更新主控端关键项配置:

vim /etc/salt/master
#15行绑定Master通信IP
interface:172.31.101.63
#215行 自动认证,避免手动运行salt-key来确认证书信任
auto_accept: True
#416行 指定saltstack文件的根目录位置
file_roots:
 base:
   - /srv/salt

(2)重启saltstack salt-master 服务使新配置生效,具体执行以下命令

systemctl restart salt-master


被控端配置

(1)更新被控端关键项配置

vim /etc/salt/minion
#16行指定master主机ip地址
master: 172.31.101.63
#78行 修改被控端的主机识别id,建议使用操作系统的主机名来配置
id: splunk

(2)重启saltstack-salt-minison服务使新配置生效,具体执行以下命令

systemctl  restart salt-minion

(3)校验安装结果

通过test模块的ping方法,可以确认指定被控端设备与主控端是否建立信任关系及连通性是否正常,探测所有被控端采用‘*'即可

salt 'splunk' test.ping

image.png


提示,当/etc/salt/master没有配置auto_accept True时,需要通过salt-key命令来进行证书认证提示,具体如下:

 salt-key -L ,显示已经或未认证的被控端id,Accepted keys为已经认证清单,Unaccepted Keys 为未认证清单;

 satl-key -D, 删除所有认证主机id证书

salt-key  -A,接受所有id证书请求;

salt-key -a id ,接受单个id证书请求


二、利用saltstack远程执行命令

    具备远程执行命令的功能,可以帮助运维人员完成集中化的操作平台。

 命令格式:

salt '<操作目标>' <方法> [参数]


查看被控主机的内存使用情况

salt 'splunk' cmd.run 'free -m'

python学习-集中化监控平台saltstack基础模块及api_第1张图片


2.1常用过滤方法

 针对<操作目标>,saltstack提供了多种方法对被控端主机(id)进行过滤。

(1)-E --pcre,通过正则表达式进行匹配。例如id开头字符是S字母进行连通

salt -E '^S*' test.ping

image.png


(2)-L --list,以主机id名列表的形式进行过滤,格式与python列表相似,即不同主机id名称使用逗号分隔。

salt -L 'splunk,aaa' grains.item osfullname

image.png

(3) -S,--ipcidr,根据主机的ip地址或者ip子网进行匹配

salt -S 172.31.101.0/24 test.ping

python学习-集中化监控平台saltstack基础模块及api_第2张图片


三、Saltstack常用模块及api

saltstack提供了非常丰富的模块功能,涉及操作系统的基础功能、常用工具支持等,更多模块参考官方网站。当然,也可是使用sys模块列出当前版本支持的模块。

salt '*' sys.list_modules

python学习-集中化监控平台saltstack基础模块及api_第3张图片

API的原理是通过调用master client模块,实例化一个LocalClient对象,再调用cmd()方法来实现的。以下为api实现test.ping的python脚本示例。

import salt.client
client = salt.client.LocalClient()
ret =  client.cmd('*','test.ping')
print ret

python学习-集中化监控平台saltstack基础模块及api_第4张图片

结果是以一个标准python字典的形式字符串

3.1Archive模块

功能:实现系统层面的压缩包调用,支持gunzip,gzip,rar,tar,untar,unzip等

#采用gzip压缩/root/test.txt文件
salt '*' archive.gzip /root/test.txt
#采用gunzip解压/root/test.txt.gz文件
salt '*' archive.gunzip /root/test.txt.gz

API调用:

client.cmd('*','archive.gunzip',['/root/test.txt.gz'])


3.2cmd模块

功能:实现远程管理的命令行调度(默认具备root操作权限,使用时需要评估风险)

#获取所有被控主机的内存使用情况
salt '*' cmd.run 'free -m'

image.png

API调用

client.cmd('*','cmd.run',['free -m])

3.3cp模块

功能:实现远程文件、目录的复制,以及下载URL文件等操作

#将指定的被控主机的/root/test.txt 文件复制到被控主机的本地的salt cache目录(/var/cache/salt/minion/localfiles/):
salt '*' cp.cache_local_file /root/test.txt

image.png

#将主服务器flie_roots指定位置下的目录复制到被控主机
salt '*' cp.get_dir salt://path/to/dir/ /minion/dest
#将主服务器file_roots指定位置下的文件复制到被控主机
salt '*' cp.get_file salt://path/to/dir/ /minion/dest
#下载URL内容到被控主机指定位置
salt '*' cp.get_url http://www.163.com /tmp/index.html

image.png

API调用

client.cmd('*','cp.get_file',['salt://path/to/file',' /minion/dest'])

3.4cron模块

功能:实现被控主机的crontab操作

#查看指定被控主机、root用户的crontab清单
salt 'splunk' cron.raw_cron root
#为指定被控主机、root用户添加/usr/local/weekly任务作业
salt 'splunk' cron.set_job root '*' '*' '*' '*' 1 /usr/local/weekly
#删除指定的被控主机、root用户crontab的/usr/local/weekly任务作业
salt 'splunk' cron.rm_job root '*' '*' '*' '*'  /usr/local/weekly

API调用

client.cmd('splunk','cron.set_job',['root','*','*','*','*','/usr/echo'])

3.5dnstuil模块

功能:实现被控主机通用DNS相关操作

#添加指定被控主机hosts的主机配置项
salt 'splunk' dnsutil.hosts_append /etc/host 127.0.0.1  
#删除指定被控主机的配置项
salt 'splunk' dnsutil.hosts_remove /etc/host www.example.com

API调用

client.cmd ('*','dnsutil.hosts_append',['/etc/hosts','172.0.0.1','


3.6file 模块

功能:被控主机文件常见操作,包括文件读写、权限、查找、校验等

#校验所有被控主机/etc/fstab 文件的md5是否为df3ff54c1c9f1711cb4dcea2c3b82c0b,一致返回True
salt 'splunk' file.check_hash /etc/fstab md5=df3ff54c1c9f1711cb4dcea2c3b82c0b
#检验所有被控主机文件的加密信息
salt '*' file.get_sum /etc/passwd md5
#修改所有被控主机文件的组、用户权限、等价于chown root:root /etc/passwd
salt '*' file.chown /etc/passwd root root
#复制所有被控主机的本地/path/to/src文件到本地的/path/to/dst文件
salt 'splunk' file.copy /root/test.txt /tmp/test.txt
#检查所有被控主机/etc目录是否存在,存在返回TRUE,
salt '*' file.directory_exists /etc
#获取所有被控主机的/etc/passwd的status信息
salt '*' file.stats /etc/passwd
#获取所有被控主机的/etc/passwd的权限
salt '*' file.get_mode /etc/passwd
#修改所有被控主机/etc/passwd权限为0644
salt '*' file.set_mode /etc/passwd 0644
#所有被控主机创建/opt/test目录
salt '*' file.mkdir /opt/test
#删除所有被控主机的/root/test.txt文件
salt '*' file.remove /root/test.txt

API调用

client.cmd('*','file.remove',['/tmp/foo'])


3.7iptables模块

功能:被控主机的iptables支持

#所有主机添加规则
salt '*' iptables.append filter INPUT rule='-j ACCEPT'
#所有主机删除规则
salt '*' iptables.delete filter INPUT rule='-j ACCEPT'
#所有主机保存规则
salt '*' iptables.save

image.png

API调用

client.cmd ('*','iptables.append',['filter','INPUT','rule='-j ACEPT''])


3.8network模块

功能:返回被控主机的网络信息

#指定主机上获取dig,ping,traceroute信息
salt 'splunk' network.dig www.163.com 
salt 'splunk' network.ping  www.163.com 
salt 'splunk' network.traceroute  www.163.com 
#获取指定被控主机’splunk‘的mac地址
salt 'splunk' network.hwaddr eth0
#获取指定主机的ip地址信息
salt 'splunk' network.ip_addrs
#获取指定主机的子网信息
salt 'splunk' network.subnets

API调用

client.cmd ('splunk','network.ip_addrs')


3.9包管理pkg

功能:被控主机程序包管理,如yum,apt-get

#为被控主机安装tree程序包,相当于使用yum install tree -y
salt '*' pkg.install tree
#卸载包
salt '*' pkg.rmove tree
#升级包
salt '*' pkg.upgrade tree

API调用

client.cmd('*','pkg.remove',['tree'])

3.10service模块

功能:被控主机程序包该服务管理

#开启,禁用firewalld服务
salt '*' servcie.enable firewalld
salt '*' servcie.disable firewalld
#对firewalld服务检查与操作
salt '*' servcie.status[start/restart/stop/reload] firewalld

API

clinet.cmd ('*','service.stop',['firewalld'])