自动化运维工具saltstack原理使用和优化实践
Posted 云架构师大白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自动化运维工具saltstack原理使用和优化实践相关的知识,希望对你有一定的参考价值。
不做介绍了,直接进入正题:
Saltstack支持agent和ssh方式,建议使用agent效率较高,根据我实际使用经验一个salt master集群管理5000台虚机规模无压力。
一、salt通信过程
1、 minion第一次启动生产一对公钥私钥并将公钥发送到master4506端口
2、 master接收minion公钥后(存放在/etc/salt/pki/master/minions),master就可以通过4505端口(zeroMQ消息发布长连接)控制minion了。 Tips:建议定期自动自动清理无效minion公钥,否则会影响性能,清理方法巡检检测公钥文件连接状态,无连接则salt-ket –dy删除。
3、 命令或者api发起任务
4、 master收到任务,请求进程在本地或者外部存储建立一个临时文件夹临时存放任务,然后通过转发进程将任务转发给实际的工作进程(多个)
5、 master工作进程通过4505给minion下发任务,minion将任务脚本和执行结果存放在本地缓存,然后minion通过4506(zmq请求响应模式)将执行结果返回给master
6、 master将任务执行结果缓存在本地或者数据库等存储上
说明:
1、建议将master return结果默认是保存在master本地文件系统,建议保存到数据库等存储中,我们实际是minion将任务结果返回给了到配置了数据持久化的redis缓存中。
2、建议saltmaster采用高可用集群部署,我们实际部署中每个minion都会连接2个master,master的关键文件通过NAS实现共享,如/srv/salt等
3、建议采用syndic级联配置,方便多saltmaster管理,但是有性能问题,根据实际经验优化参数如下:
syndic_wait: 5
timeout: 5
gather_job_timeout: 10
二、salt常用命令
命令模块查看方法,命令太多根本记不住,建议多多使用这个:
salt 'node1' sys.list_modules //所有可用模块
salt ‘node1’ sys.list_functions cmd //查看cmd模块方法
salt ‘node’ sys.doc cmd.script //查看方法的详细说明和示例
常用命令
salt --versions-report # 查看版本
salt-run jobs.list_jobs #全部任务情况统计,查看 /var/cache/salt/master/jobs 里的记录默认24小时
salt-run jobs.active #当前未结束任务查询,未执行完成的任务保存在客户端/var/cache/salt/minion/proc 中,执行完后才会返回master
salt '*' saltutil.running #当前未结束任务统计和上面一条基本一致
salt minion_id saltutil.running #当前某一个minion上未结束的任务
salt-run jobs.lookup_jidjid //如果没有结果则会返回空,异步任务查询
salt-run jobs.print_job jid //无论是否返回都会有结果
salt '*' saltutil.kill_job jid //杀掉一直未执行完成的异步任务
salt minion_id saltutil.kill_job jid #杀死某指定minion_id上的jid任务
salt-run manage.up #测试test.ping 慢
salt-run manage.down #测试test.ping 慢
salt-run manage.not_present #查看就绪minion 看tcp 4505的连接数,很快!
salt-run manage.present #查看未就绪minion
salt-run manage.status #查看所有minion状态
salt-run manage.versions #查看minion版本
salt -C "G@ipv4:* andG@kernel:Linux" --async cp.get_file salt://agent.gz /root/agent.gzgzip=9 makedirs=True
salt -C "G@ipv4:* and G@osrelease:2008ServerR2"cp.get_url http://1.1.1.1/1.sh/tmp/1.sh
salt -C "G@ipv4:* andG@kernel:windows" grains.item osrelease pythonversion virtual ipv4
salt -C "G@ipv4:* and G@osrelease:2008ServerR2"cmd.script
salt://sysmon.ps1 ‘arg1 arg2’ shell=powershell runas=appuser
salt –S 192.168.1.0/24 cmd.script salt://1.sh
salt -C "G@ipv4:* andG@kernel:Linux" cmd.run 'echo "0 6 * * *
sh /root/oscheck/oscheck.sh>/dev/null 2>&1" >> /var/spool/cron/root' //或者使用cron.set_job 也可以
salt-cp testnode file1 /tmp/
salt node state.sls pip3_install #不建议使用sls,无法跨工具使用
可以通过自定义grains,用于区分不同应用属性 #不建议使用不太灵活,最好的方式还是通过CMDB记录不同应用或中间件等对应IP然后操作,同时也不建议使用pillar,原因一样
当同时执行几千台命令下发导致网络或者性能问题时,建议使用异步 –async或 –b 串行执行
三、salt配置
salt-minion配置
/etc/salt/minion
recon_default: 1800
重新连接尝试之间等待的平均秒数。半小时
recon_max:
重新连接尝试之间等待的最大秒数。
recon_randomize:
是否进行随机的认证
acceptance_wait_time:
等待每个身份验证请求回复的秒数。
random_reauth_delay:
随机化的身份验证
auth_timeout:
认证的超时时间,不管尝试的次数
#minion 缓存任务 /var/cache/salt/minion_jobs
cache_jobs: true
#日志级别 /var/log/salt
log_level_logfile: debug
salt-master主要配置:
max_open_files:默认值100000,不能超过OS ulimit值,每个minion连接master至少需要1个openfile(实际是多个)
timeout: salt和salt api命令超时时间
auto_accept:是否自动accept minion 默认no
job_cache:开启cache?
keep_jobs: 任务cache保存时间,默认24小时
work_threads:saltmaster线程数目,默认5,并发大可适当增加,建议不要超过cpu*2
4、salt源码
源码分析:
/usr/lib/python2.7/site-packages/salt/returners/local_cache.py #结果返回,写cache
vim/usr/lib/python2.7/site-packages/salt/utils/job.py #新建job
vim/usr/lib/python2.7/site-packages/salt/cache/localfs.py #写文件位置
5、salt-api
获取token,默认是10分钟有效
curl -k http://1.1.1.1:8000/login -H"Accept: application/json" -d username='saltapi' -d password='saltapi'-d eauth='pam'
同步调用
http://1.1.1.1:8000
method: post
header:
X-Auth-Token = 上面获取
Accept= application/json
body:
{
"client":"local", //"client":"local_async", 异步
"tgt":"node1 ",
"fun":"cmd.run",
"arg":"/tmp/1.sh"
}
详见:http://docs.saltstack.cn/ref/clients/index.html
以上是关于自动化运维工具saltstack原理使用和优化实践的主要内容,如果未能解决你的问题,请参考以下文章
dW 编辑推荐:自动化运维工具 SaltStack 在云计算环境中的实践