首页 > 代码库 > SaltStack远程控制、配置管理与实战介绍
SaltStack远程控制、配置管理与实战介绍
说明:
本文档仅写了一些基础的SaltStack操作命令,但这些命令也是工作中经常会用到的,像grains、pillar、jinja2功能更强大,但如果不是大批量升级改造的话一般不需用到。更高级的操作请参阅书籍。
1.salt常用命令
salt-key –L 或 salt-key:列出各minion的授权状态
salt ‘minion-25.180‘ sys.doc test.echo: sys.doc用来获取模块的用处和示例用法
salt ‘minion-25.180‘ test.ping:测试是否通
salt ‘minion-25.180‘ cmd.run ‘echo “ok”’ :发送操作指令(操作需小心)
2.salt常用参数
-L 列表匹配
-N 列表匹配(将主机列表写入/etc/salt/master中)
3.常用模块
3.1 file
3.1.1 file.managed
下发文件,确保文件存在:
/etc/passwd:
file.managed:
- source: salt://…/…/passwd
- user: nginx
- group: nginx
- mode: 644
3.1.2 file.directory
建立目录
/srv/stuff/sub:
file.directory:
- user: fred
- group: users
- mode: 755
- makedirs: True
“makedirs: True” 与”unless:test –d dir”功能一样,只有目录不存在才会创建,而且建立目录相当于加了参数’-p’。
3.1.3 file.symlink
建立软链接
/etc/grub.conf:
file.symlink:
- targe: /boot/grub/grub.conf
3.1.4 file.recurse
下发整个目录
/opt/code/flask:
file.recurse:
- source: salt://code/flask
- include_empty: True
3.2 pkg模块
3.2.1 pkg.installed
软件安装,指定软件版本;也可以指定rpm安装、指定最新版安装
mypgks:
pkg.installed:
- pkgs:
- foo
- bar: ‘>=1.2.3-4’
- baz
3.3 service模块
10.3.1 service.runnning
启动redis服务
redis:
service.running:
- enable: True
- reload: True
- watch:
- pkg: redis
3.4 cron模块
每五分钟执行一次指定任务:
date > /tmp/crontest:
cron.present:
- user: root
minute: ‘*/5’
4.Salt端口作用
Salt-master启动时会监听两个端口,默认是4505和4506。
4506的作用:salt-master的ret接口,支持认证、文件服务、结果收集等功能;
4505的作用:salt-master的pub接口,提供远程执行命令发送功能。
Salt-minion启动时从配置文件中获取master的地址,如果为域名,则进行解析。解析完成,会连接master的4506进行key认证。认证通过,会获取到master的publish_port(默认是4505),然后连接publish_port订阅来自master pub接口的任务。当master下发操作指令时,所有的minion都能接收到,然后minion会检查本机是否匹配。如果匹配,则执行。执行完毕后,把结果发送到master的4506由master进行处理,命令发送通信完全是异步的,并且命令包很小。此外,这些命令包通过maqpack进行序列化后数据会进一步压缩(maqpack是一种高效的二进制序列化格式),所以salt的网络负载非常低。
5. 编写自己的执行模块函数
5.1编写一个简易模块
默认情况下,我们的定制模块存放于/src/salt/_modules目录下,这个目录并不是默认创建的,需要建立对应的目录并添加文件,命令如下:
模块添加完毕后,我们需要把模块推送到所有minion上,然后测试,如下,
5.2编写一个完整的模块
作为系统管理员我们可能经常需要查出当前系统最占用内存的程序以及当前系统中最占用CPU的程序,当然通过salt的远程执行模块cmd.run用一行命令即可完成任务,但是作为一个会被反复使用的功能,我们把它写成一个模块会更便捷,下面动手写一个统计系统负载的模块,
cd /srv/salt/_modules
vim prank.py内容如下:
[root@localhost _modules]# cat prank.py
#/usr/bin/env python
#coding:utf-8
‘‘‘
The top nth processes which take up CPU andmemory space usage are available through this module,additionaly;
the module can get the system loadinformation.
‘‘‘
import os
import salt.utils
def cpu(n):
‘‘‘
Return the top nth processes which take up the cpu usage for this minion
CLI Example:
salt ‘*‘ prank.cpu <n>
‘‘‘
cmd = "ps aux | sort -k3 -nr | head -n %s" % str(n)
output = __salt__[‘cmd.run_stdout‘](cmd)
res = []
for line in output.splitlines():
res.append(line)
return res
def mem(n):
‘‘‘
Return the top nth processes which take up the memory usage for thisminion
CLI Example:
salt ‘*‘ prank.mem <n>
‘‘‘
cmd = "ps aux | sort -k4 -nr | head -n %s" % str(n)
output = __salt__[‘cmd.run_stdout‘](cmd)
res = []
for line in output.splitlines():
res.append(line)
return res
def load():
‘‘‘
Return the load averages for this minion
CLI Example:
..code-block:bash
salt ‘*‘ prank.load
‘‘‘
load_avg = os.getloadavg()
return {‘1-min‘:load_avg[0],
‘5-min‘:load_avg[1],
‘15-min‘:load_avg[2],
}
同步模块:salt ‘*’ saltutil.sync_modules
查看模块帮助:salt ‘minion-one’ sys.doc prank
实战使用:salt ‘minion-one’ prank.mem 4
salt ‘minion-one’ prank.cpu 4
salt ‘minion-one’ prank.load
6.执行模块和状态模块之间的主要区别
执行模块是过程式的,而状态模块则是描述性的。连续调用同一个执行模块时,执行模块会执行相同的命令和指令。而状态模块则恰恰相反,状态模块设计为描述性的,它们只是执行必要的工作,在目标minion上创建根据描述文件指定的状态。
运行了pkg.install命令,实际上pkg.install只是运行了yum install <package>命令,而用state模块时会首先判断httpd软件是否安装了,如果没有安装就进行安装,如果已经安装过了就什么都不做。实际上不只是安装软件这一项任务如此,所有的状态描述都会遵循这个原则,只在检测到真实状态和所需状态不同的情况下才执行功能。你可以一次又一次地运行状态,只要没有不符,就不会有任何变化,这种性质叫做幂等性,可以通过判断来让minion以最小的代价进入指定的状态。
7.YAML语法
SLS配置文件使用YAML语言描述。
7.1规则一:缩进
Salt需要每个缩进级别由两个空格组成。
7.2规则二:冒号
Key: value,这样的表示,在状态文件被调用时会将被翻译成python里的字典。
My_key:
My_value
Python中上面的将映射为{‘My_key’:’My_value’}
7.3规则三:短横杠
用一个短横杠加一个空格来表示列表项,多个项使用同样的缩进级别作为同一列表的一部分。
My_d:
- Listone
- Listtwo
- Listthree
Python中,上面的将映射为{‘My_d’:[‘Listone’,’Listtwo’,’ Listthree’]}
8.实战部署听云探针
8.1首先批量拷贝听云文件,建立拷贝的salt状态文件,如下,
这里的/srv/salt目录对应/etc/salt/master里的“file_roots”设置,如下,
执行状态文件:salt –L ‘minion…’ state.sls tingyun.sls。执行完毕后,文件就拷贝到各minion端了。
8.2批量解压并修改目录属主、属组
cd /usr/local/src && tingyun-agent-java.zip&& chown –R nginx.nginx /usr/local/src/tingyun && sed -i ‘s#nbs.app_name=JavaApplication# nbs.app_name= MessageServiceProvider#g’ /usr/local/src/tingyun/tingyun.properties
8.3批量修改tingyun配置
8.4 svn up同步java配置
Svn up命令
然后继续使用cmd.run方法重启Java服务和查看日志输出。
以上步骤都可以写入状态文件,实现一键执行,如下例。
9.实战部署CMS的jdk、maven、tomcat
9.1创建状态文件,如下
home-www-cms-conf:
cmd.run:
-name: mkdir -p /home/www/cms/conf
-unless: test -d /home/www/cms/conf
-order: 1
home-www-cms-log-logs:
cmd.run:
-name: mkdir -p /home/www/cms/log/logs
-unless: test -d /home/www/cms/log/logs
-order: 2
home-web-apache-tomcat-7.0.64-conf-Catalina-localhost:
cmd.run:
-name: mkdir -p /home/web/apache-tomcat-7.0.64/conf/Catalina/localhost
-unless: test -d /home/web/apache-tomcat-7.0.64/conf/Catalina/localhost
-order: 3
/home/www/cms/conf/dubbo.properties:
file.managed:
-source: salt://jdk_mav_tom/cmsfile/dubbo.properties
-user: root
-group: root
-mode: 644
-require:
- cmd: home-www-cms-conf
/home/www/cms/conf/hessian.properties:
file.managed:
-source: salt://jdk_mav_tom/cmsfile/hessian.properties
-user: root
-group: root
-mode: 644
-require:
- cmd: home-www-cms-conf
/home/www/cms/conf/jdbc.properties:
file.managed:
-source: salt://jdk_mav_tom/cmsfile/jdbc.properties
-user: root
-group: root
-mode: 644
-require:
- cmd: home-www-cms-conf
/home/www/cms/cmsRun.sh:
file.managed:
-source: salt://jdk_mav_tom/cmsfile/cmsRun.sh
-user: root
-group: root
-mode: 644
-require:
- cmd: home-www-cms-conf
/home/web/apache-tomcat-7.0.64/conf/Catalina/localhost/ROOT.xml:
file.managed:
-source: salt://jdk_mav_tom/cmsfile/ROOT.xml
-user: root
-group: root
-mode: 644
-require:
- cmd: home-www-cms-conf
svn-cms:
cmd.run:
-name: cd /home/www/cms && svn cohttp://10.103.16.3:18080/svn/web_project/java/service_project/cms_service_center/online/CmsServiceProject--username=832868 --password=12345Qwert --no-auth-cache && chown -Rnginx.nginx /home/www
- order: last
配置内容:没有/home/web目录就创建;拷贝java、tomcat、maven;拷贝完毕的前提下解压目录;解压成功的前提下修改目录属主属组;/etc/profile中没有配置jdk和maven环境变量的前提下,将环境变量配置好。
注:有order的状态比没有order的状态优先级高;order:last表示最后执行。
9.2执行状态文件
没有报错就表示部署完毕,可以通过cmd.run命令查看确认各minion部署是否正确。
10.实战修改tomcat配置文件
将server.xml放到/srv/salt/shangxian/server.xml下
10.1 sls状态文件内容如下
/home/wap/wap1/conf/server.xml:
file.managed:
-source: salt://shangxian/server.xml
-user: nginx
-group: nginx
-mode: 644
/home/wap/wap2/conf/server.xml:
file.managed:
-source: salt://shangxian/server.xml
-user: nginx
-group: nginx
-mode: 644
/home/wap/wap3/conf/server.xml:
file.managed:
-source: salt://shangxian/server.xml
-user: nginx
-group: nginx
-mode: 644
/home/wap/wap4/conf/server.xml:
file.managed:
-source: salt://shangxian/server.xml
-user: nginx
-group: nginx
-mode: 644
/home/wap/wap5/conf/server.xml:
file.managed:
-source: salt://shangxian/server.xml
-user: nginx
-group: nginx
-mode: 644
/home/wap/wap6/conf/server.xml:
file.managed:
-source: salt://shangxian/server.xml
-user: nginx
-group: nginx
-mode: 644
10.2执行命令
salt -L‘minion-38.179,minion-34.96,minion-34.97,minion-37.12,minion-37.77‘ state.slsxinyuan
这样,五台机器,共30个tomcat的配置文件就替换完成了。
本文出自 “10536390” 博客,请务必保留此出处http://10546390.blog.51cto.com/10536390/1845640
SaltStack远程控制、配置管理与实战介绍