设为首页 收藏本站
查看: 1047|回复: 0

[经验分享] ansible批量管理远程服务器

[复制链接]

尚未签到

发表于 2018-7-30 10:46:04 | 显示全部楼层 |阅读模式
背景  
本地需要管理远程的一批服务器,主要执行以下任务:
  
1) 将本地的文件复制到远端所有服务器;
  
2) 需要在远程服务器中执行一个个命令;
  
远端服务器路径并非完全一致,一般访问通过环境变量中定义的变量路径访问;
  
比如在.bashrc中定义$app_path=/opt/app/bin
  
最终选择ansible,使用这个自动化运维工具可以满足我的需求;
  
下面介绍下对于我这种场景需要使用的ansible的主要模块;
  
关于ansible是什么以及安装配置请自行百度;
  
复制
  
copy模块
  
使用copy模块,可以将本地文件一键复制到远程服务器;
  
-a后跟上参数,参数中指定本地文件和远端路径;
  
ansible myservers -m copy -a "src=/opt/app/bin/transfer.tar dest=~/"
  
ansible通过ssh登录到远程服务器后,并不执行.bash_profile来设置用户自定义的环境变量;如果我们需要管理的目标服务器的路径不同,就不能直接写绝对路径,也不能写变量替换的路径;
  
比如:针对服务器A的目标复制路径为 /opt/app/user1/bin ,服务器B的目标复制路径为/opt/app/user2/bin; 这两个路径在各自的服务器中的路径变量都设置为$bin; 但在copy模块中,我们不能直接使用dest = $bin/;
  
路径设置一般放在.bashrc /.bash_profile文件,但ansible模块登录后并不加载这两个文件;
  
解决方法:
  
针对这种情况,可以将dest路径设置为~/,都复制到用户目录,后续再通过远程脚本处理;
  
远程批量命令
  
需要在远程执行一个个命令来管理远程服务器;
  
远程执行命令的模块有command、shell、scripts、以及raw模块;
  
command模块
  
command模块为ansible默认模块,不指定-m参数时,使用的就是command模块;
  
comand模块比较简单,常见的命令都可以使用,但其命令的执行不是通过shell执行的,所以,像这些 "<", ">", "|", and "&"操作都不可以,当然,也就不支持管道;
  
示例:显示远程路径:
  
ansible myservers  -a 'pwd'10.6.143.38 | success | rc=0 >>/home/rduser10.6.143.53 | success | rc=0 >>/home/rduser10.6.143.37 | success | rc=0 >>/home/rduser
  
缺点:不支持管道,就没法批量执行命令;
  
shell模块
  
使用shell模块,在远程命令通过/bin/sh来执行;所以,我们在终端输入的各种命令方式,都可以使用;
  
但是我们自己定义在.bashrc/.bash_profile中的环境变量shell模块由于没有加载,所以无法识别;如果需要使用自定义的环境变量,就需要在最开始,执行加载自定义脚本的语句;
  
对shell模块的使用可以分成两块:
  
1) 如果待执行的语句少,可以直接写在一句话中:
  
ansible myservers  -a ". .bash_profile;ps -fe |grep sa_q" -m shell
  
2) 如果在远程待执行的语句比较多,可写成一个脚本,通过copy模块传到远端,然后再执行;但这样就又涉及到两次ansible调用;对于这种需求,ansible已经为我们考虑到了,script模块就是干这事的;
  
scripts模块
  
使用scripts模块可以在本地写一个脚本,在远程服务器上执行:
  
ansible myservers  -m script -a "/opt/app/target.sh"
  
这里是命令模块的官方文档:
  
http://docs.ansible.com/list_of_commands_modules.html
  
批量执行playbooks
  
远程批量命令执行的另外一种方式是用playbooks;
  
这里是playbooks的官方文档:http://docs.ansible.com/playbooks.html
  
这里有ansible的playbooks示例:https://github.com/ansible/ansible-examples
  
在python中使用ansbile API
  
以上执行ansible模块的方式都是在命令行中直接调用,如果对返回结果需要进一步处理,可以在程序中通过API调用的方式来使用ansible模块:
  
比如,以上在命令行中调用scripts的模块的方式在API中调用:
  
import ansible.runner
  
results = ansible.runner.Runner(pattern='myservers', forks=5,module_name='script', module_args='/opt/app/target.sh',).run()
  
这里是官方给出的一个详细示例,直接运行一次,将result全部打印出来,会有直观的了解:
  
#!/usr/bin/pythonimport ansible.runnerimport sys# construct the ansible runner and execute on all hostsresults = ansible.runner.Runner(pattern='*', forks=10,module_name='command', module_args='/usr/bin/uptime',).run()if results is None:
  
   print "No hosts found"
  
   sys.exit(1)print "UP ***********"for (hostname, result) in results['contacted'].items():if not 'failed' in result:print "%s >>> %s" % (hostname, result['stdout'])print "FAILED *******"for (hostname, result) in results['contacted'].items():if 'failed' in result:print "%s >>> %s" % (hostname, result['msg'])print "DOWN *********"for (hostname, result) in results['dark'].items():print "%s >>> %s" % (hostname, result)
  
API设计详见:http://docs.ansible.com/developing_api.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-543475-1-1.html 上篇帖子: ansible自动化运维工具使用详解 下篇帖子: Ansible简单使用之自动安装JDK及设置环境变量
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表