SaltStack 使用笔记
centos 7安装
yum -y install epel-release
yum clean all
yum makecache
yum -y install salt-minion
sed -i 's/#master: salt/master: 10.248.2.18/g' /etc/salt/minion
sed -i 's/#id:/id: cgo-wh1-proxy-01/g' /etc/salt/minion
/bin/systemctl restart salt-minion.service
systemctl enable salt-minion.service
yum -y install salt-master
centos 6
yum groupinstall 'Development Tools'
###
安装EPEL
###
cd /usr/local/src/
wget http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
###
主服务器
###
yum install salt-master -y
chkconfig salt-master on
service salt-master start
###
从服务器
###
yum install salt-minion -y
chkconfig salt-minion on
service salt-minion start
###
主服务器的Iptables
###
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
#在主控端添加TCP 4505、TCP 4506的规则,而在被控端无须配置防火墙,原理是被控端直接与主控端的zeromq建立长链接,接收广播到的任务信息并执行,具体操作是添加两条iptables规则:
###
配置主控端:
###
#绑定Master通信IP
interface: 10.249.17.78
#自动认证,避免手动运行salt-key来确认证书信
auto_accept: True
#指定Saltstack文件根目录位置
# file_roots:
# base:
# - /srv/salt/
# dev:
# - /srv/salt/dev/services
# - /srv/salt/dev/states
# prod:
# - /srv/salt/prod/services
# - /srv/salt/prod/states
#
#file_roots:
# base:
# - /srv/salt
#重启saltstack salt-master服务使新配置生效
service salt-master restart
###
配置被控端:
###
#指定master主机IP地址
master: 10.249.17.78
#修改被控端主机识别id,建议使用操作系统主机名来配置
id: django_web
#重启saltstack salt-minion服务使新配置生效
service salt-minion restart
删除dead状态minion
salt-run manage.down removekeys=True
删除某个key
salt-key -d cut-wh1-proxy-01
验证被添加的客户端
root@Saltstack src]# salt-key -L
Accepted Keys:
django_web
Denied Keys:
Unaccepted Keys:
Rejected Keys:
salt -E 'django_web+' test.ping
#测试多个客户端
salt -L 'django_web,test' test.ping
#写明每个客户端
#运行远程命令
salt 'django_web' cmd.run 'free -m'
参数:
-E,--pcre,通过正则表达式进行匹配。
-L,--list,以主机id名列表的形式进行过滤
#获取主机系统信息
time salt -L 'django_web' grains.item osfullname
-G,--grain,根据被控主机的grains(10.4节详解)信息进行匹配过滤,格式为'<grainvalue>:<glob expression>',例如,过滤内核为Linux的主机可以写成'kernel:Linux',如果同时需要正则表达式的支持可切换成--grain-pcre参数来执行。
[root@Saltstack src]# salt -G 'osrelease:6.5' cmd.run 'python -V'
django_web:
Python 2.6.6
-I,--pillar,根据被控主机的pillar(10.5节详解)信息进行匹配过滤,格式为“对象名称:对象值”,例如,过滤所有具备'apache:httpd' pillar值的主机。示例:探测具有“nginx:root:/data”信息的主机连通性
salt -I 'nginx:root:/data' test.ping
-N,--nodegroup,根据主控端master配置文件中的分组名称进行过滤。探测web2group被控主机的连通性,其命令为:salt -N web2group test.ping
-C,--compound,根据条件运算符not、and、or去匹配不同规则的主机信息,。示例:探测SN2013开头并且操作系统版本为CentOS的主机连通性,命令如下:salt -C 'E@^SN2013.* and G@os:Centos' test.ping
其中,not语句不能作为第一个条件执行,不过可以通过以下方法来规避,示例:探测非SN2013开头的主机连通性,其命令为:salt-C '*and notE@^SN2013.*' test.ping。
-S,--ipcidr,根据被控主机的IP地址或IP子网进行匹配
[root@Saltstack src]# salt -S 10.249.17.0/24 test.ping
django_web:
True
#python调用API接口
>>> import salt.client
>>> client = salt.client.LocalClient()
>>> client.cmd('django_web','cmd.run',['free -m'])
#复制文件
#在master里新建文件夹:
mkdir /srv/salt
#salt的主目录在/srv/salt下面,这个可以在配置文件里设定,下面就是把script/test.sh这个文件推送到客户端去
salt 'django_web' cp.get_file salt://script/test.sh /home/test.sh
#这个是推送文件夹
salt '*' cp.get_dir salt://script/ /home/
#python调用API接口
>>> import salt.client
>>> client = salt.client.LocalClient()
>>> client.cmd('django_web','cp.get_file',['salt://script/test.sh','/home/test.sh'])
#cron模块实现被控主机的crontab操作
#查看指定被控主机、root用户的crontab清单
salt 'django_web' cron.raw_cron root
#为指定的被控主机、root用户添加/usr/local/weekly任务作业
salt 'django_web' cron.set_job root '*' '*' '*' '*' 1 /usr/local/weekly
#删除指定的被控主机、root用户crontab的/usr/local/weekly任务作业
salt 'django_web' cron.rm_job root /usr/local/weekly
#API调用:
client.cmd('django_web', 'cron.set_job',['root','*','*','*','*','*','/usr/echo'])
#dnsutil模块实现被控主机通用DNS相关操作
#添加指定被控主机hosts的主机配置项
salt 'django_web' dnsutil.hosts_append /etc/hosts 127.0.0.1 ad1.yuk.com,ad2.yuk.com
#删除指定被控主机hosts的主机配置项
salt 'django_web' dnsutil.hosts_remove /etc/hosts ad2.yuk.com
salt 'django_web' dnsutil.hosts_remove /etc/hosts ad1.yuk.com
#file模块
被控主机文件常见操作,包括文件读写、权限、查找、校验等
#校验所有被控主机文件的加密信息、支持md5、sha1、sha224、sha256、sha384、sha512加密算法
salt '*' file.get_sum /etc/passwd md5
#修改所有被控主机/etc/passwd文件的属组、用户权限,等价于chown root:root /etc/passwd
salt '*' file.chown /etc/passwd root root
#复制所有被控主机本地/path/to/src文件到本地的/path/to/dst文件
salt '*' file.copy /path/to/src /path/to/dst
#复制所有被控主机本地/home/test.sh文件到本地的/home/install/test.sh
salt '*' file.copy /home/test.sh /home/install/test.sh
#检查所有被控主机/etc目录是否存在,存在则返回True,检查文件是否存在使用file.file_exists方法
salt '*' file.directory_exists /etc
#获取所有被控主机/etc/passwd的stats信息
salt '*' file.stats /etc/passwd
#获取所有被控主机/etc/passwd的权限mode,如755、644
salt '*' file.get_mode /etc/passwd
#修改所有被控主机/etc/passwd的权限mode为0644
salt '*' file.set_mode /etc/passwd 0644
#在所有被控主机创建/opt/test目录
salt '*' file.mkdir /opt/test
#将所有被控主机/home/test.sh文件的test值修改成TEST
salt '*' file.sed /home/test.sh 'test' 'TEST'
#给所有被控主机的/home/test.sh文件追加内容"maxclient 100"
salt '*' file.append /home/test.sh "maxclient 100"
#删除所有被控主机的/home/test.sh文件
salt '*' file.remove /home/test.sh
API调用:
client.cmd('*', ' file.remove ',['/tmp/foo'])
#iptables模块
示例:#在所有被控端主机追加(append)、插入(insert)iptables规则,其中INPUT为输入链
salt '*' iptables.append filter INPUT rule='-m state --state RELATED,ESTABLISHED-j ACCEPT'
salt '*' iptables.insert filter INPUT position=3 rule='-m state --stateRELATED,ESTABLISHED -j ACCEPT'
#在所有被控端主机删除指定链编号为3(position=3)或指定存在的规则
salt '*' iptables.delete filter INPUT position=3
salt '*' iptables.delete filter INPUT rule='-m state --state RELATED,ESTABLISHED-j ACCEPT'
#保存所有被控端主机规则到本地硬盘(/etc/sysconfig/iptables)
salt '*' iptables.save /etc/sysconfig/iptables
#API调用:
client.cmd('SN2013-08-022', 'iptables.append',['filter','INPUT','rule=\'-p tcp --sport 80 -j ACCEPT\''])
#network模块
#在指定被控主机'django_web'获取dig、ping、traceroute目录域名信息
salt 'django_web' network.dig www.qq.com
salt 'django_web' network.ping www.qq.com
salt 'django_web' network.traceroute www.qq.com
#获取指定被控主机'django_web'的MAC地址
salt 'django_web' network.hwaddr eth0
#检测指定被控主机'django_web'是否属于10.0.0.0/16子网范围,属于则返回True
salt 'django_web' network.in_subnet 10.0.0.0/16
#获取指定被控主机'django_web'的网卡配置信息
salt 'django_web' network.interfaces
#获取指定被控主机'django_web'的IP地址配置信息
salt 'django_web' network.ip_addrs
#获取指定被控主机'django_web'的子网信息
salt 'django_web' network.subnets
#API调用:
client.cmd('django_web', 'network.ip_addrs')
#pkg包管理模块 功能:被控主机程序包管理,如yum、apt-get等。
#为所有被控主机安装PHP环境,根据不同系统发行版调用不同安装工具进行部署,如redhat平台的yum,等价于yum -y install php
salt '*' pkg.install php
#卸载所有被控主机的PHP环境
salt '*' pkg.remove php
#升级所有被控主机的软件包
salt '*' pkg.upgrade
#Service服务模块
#开启(enable)、禁用(disable)nginx开机自启动服务
salt '*' service.enable nginx
salt '*' service.disable nginx
#针对nginx服务的reload、restart、start、stop、status操作
salt '*' service.reload nginx
salt '*' service.restart nginx
salt '*' service.start nginx
salt '*' service.stop nginx
salt '*' service.status nginx
#API调用:
client.cmd('django_web', 'service.stop',['nginx'])
通过上面介绍的10个常用模块,基本上已经覆盖日常运维操作。Saltstack还提供了
user(系统用户模块)、group(系统组模块)、partition(系统分区模块)、
puppet(puppet管理模块)、sys-tem(系统重启、关机模块)、timezone(时区管理模块)、nginx(Nginx管理模块)、mount(文件系统挂载模块),
等等,更多内容见官网介绍:http://docs.saltstack.com/ref/modules/all/in-dex.html#all-salt-modules。
当然,我们也可以通过Python扩展功能模块来满足需求。
# grains常用操作命令
匹配内核版本为2.6.32-431.el6.x86_64的主机:
salt -G 'kernelrelease:2.6.32-431.el6.x86_64' cmd.run 'uname -a'
#获取所有主机的grains项信息:
salt '*' grains.ls
#也可以获取主机单项grains数据,如获取操作系统的IPV4地址
salt 'django_web' grains.item ipv4
#获取主机'django_web'的所有grains信息
salt 'django_web' grains.items
#定义grains数据
定义grains数据的方法有两种,其中一种为在被控主机定制配置文件,
另一种是通过主控端扩展模块API实现,区别是模块更灵活,
可以通过Python编程动态定义,而配置文件只适合相对固定的键与值。下面分别举例说明。
1. 被控端主机定制grains数据
SSH登录一台被控主机,如django_web,配置文件定制的路径为/etc/salt/minion.d,参数为default_include:minion.d / *.conf,具体操作如下:
cat /etc/salt/minion.d/django.conf
grains:
roles:
- webserver
- memcache
deployment: datacenter4
cabinet: 13
#在master使用命令,这个要在minion配置完等一会才可以实现
salt 'django_web' grains.item roles de-ployment cabinet
#主控端扩展模块定制grains数据--------这个没做成功
首先在主控端编写Python代码,然后将该Python文件同步到被控主机,最后刷新生效(即编译Python源码文件成字节码pyc)。在主控端bash
目录(见/etc/salt/master配置文件的file_roots项,默认的base配置在/srv/salt)下生成_grains目录,执行install -d /srv/salt/_grains开始编写代码,
实现获取被控主机系统允许最大打开文件数(ulimit-n)的grains数据。
install -d /srv/salt/_grains后自动生成下面的文件
[root@Saltstack _grains]# cat sysprocess.py
import os,sys,commands
def Grains_openfile():
''' return os max open file of grains value '''
grains = {}
#init default value
_open_file=65536
try:
getulimit=commands.getstatusoutput('source /etc/profile;ulimit -n')
except Exception,e:
pass
if getulimit[0]==0:
_open_file=int(getulimit[1])
grains['max_open_file'] = _open_file
return grains
上面代码的说明如下。
•grains_openfile()定义一个获取最大打开文件数的函数,函数名称没有要求,符合Python的函数命名规则即可;
•grains={}初始化一个grains字典,变量名一定要用grains,以便Saltstack识别;
•grains['max_open_file']=_open_file将获取的Linux ulimit-n的结果值赋予grains['max_open_file'],其中“max_open_file”就是grains的项_open_file就是grains的值。
最后同步模块到指定被控端主机并刷新生效,因为grains比较适合采集静态类的数据,比如硬件、内核信息等。当有动态类的功能需求时,需要提行刷新,具体操作如下:
同步模块 salt 'django_web' saltutil.sync_all,看看‘django_web’主机上发生了什么?文件已经同步到minion cache目录中,
如下:
/var/cache/salt/minion/extmods/grains/grains_openfile.py
/var/cache/salt/minion/files/base/_grains/grains_openfile.py
/var/cache/salt/minion/extmods/grains/为扩展模块文件最终存放位置,
刷新模块后将在同路径下生成字节码pyc;/var/cache/salt/min-ion/files/base/_grains/为临时存放位置。
salt '*' pkg.install vim 所有主机安装vim