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


posted @ 2018-08-13 16:03  丁壮  阅读(176)  评论(0编辑  收藏  举报