Linux集群和自动化维3.7.2 线上环境中的Fabric应用实例

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介:

3.7.2 线上环境中的Fabric应用实例


笔者线上的核心业务机器统一都是AWS EC2主机,机器数量较多,每个数据中心都部署了Fabric跳板机(物理拓扑图可参考图3-3),系统为Amazon Linux,内核版本为3.14.34-27.48.amzn1.x86_64,Python版本为Python 2.6.9。

如果公司项目组核心开发人员离职,线上机器就都要更改密钥,由于密钥一般是以组的形式存在的,再加上机器数量繁多,因此单纯通过技术人员手工操作,基本上是一项不可能完成的任务,但若是通过Fabric自动化运维工具的话,这就是一项简单的工作了,由于现在的线上服务器多采用SSH Key的方式管理,所以对于大多数系统运维人员来说SSH Key分发也是工作内容之一,故而建议大家掌握此脚本的用法。示例脚本内容如下:

#!/usr/bin/python2.6

# -*- coding: utf-8 -*-

from fabric.api import *

from fabric.colors import *

from fabric.context_managers import *

#这里为了简化工作,脚本采用纯Python的写法,没有采用Fabric的@task修饰器

 

env.user = 'ec2-user'

env.key_filename = '/home/ec2-user/.ssh/id_rsa'

hosts=['budget','adserver','bidder1','bidder2','bidder3','bidder4','bidder5','bidder6','bidder7','bidder8','bidder9',redis1','redis2','redis3','redis4','redis5','redis6']

#机器数量众多,这里只罗列了部分

 

def put_ec2_key():

    with settings(warn_only=False):

        put("/home/ec2-user/admin-master.pub","/home/ec2-user/admin-master.pub")

        sudo("\cp /home/ec2-user/admin-master.pub /home/ec2-user/.ssh/authorized_keys")

        #\cp的作用是取消其别名作用,即不让cp-i生效

        sudo("chmod 600 /home/ec2-user/.ssh/authorized_keys")

 

def put_admin_key():

    with settings(warn_only=False):

       put("/home/ec2-user/admin-operation.pub",

"/home/ec2-user/admin-operation.pub")

       sudo("\cp /home/ec2-user/admin-operation.pub  /home/admin/.ssh/authorized_keys")

       sudo("chown admin:admin /home/admin/.ssh/authorized_keys")

       sudo("chmod 600 /home/admin/.ssh/authorized_keys")

 

def put_readonly_key():

      with settings(warn_only=False):

      put("/home/ec2-user/admin-readonly.pub",

"/home/ec2-user/admin-readonly.pub")

      sudo("\cp /home/ec2-user/admin-readonly.pub /home/readonly/.ssh/authorized_keys")

      sudo("chown readonly:readonly /home/readonly/.ssh/authorized_keys")

      sudo("chmod 600 /home/readonly/.ssh/authorized_keys")

 

for host in hosts:

    env.host_string = host

    put_ec2_key()

    put_admin_key()

    put_readonly_key()

大家可以输入如下命令查看系统中定义的别名(CentOS 6.4 x86_64)。

alias

命令显示结果如下所示:

alias cp='cp -i'

alias l.='ls -d .* --color=auto'

alias ll='ls -l --color=auto'

alias ls='ls --color=auto'

alias mv='mv -i'

alias rm='rm -i'

alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

Amazon Linux系统与CentOS 6.4略有差别,已经取消了cp的别名定义。

如果线上的Nagios 客户端的监控脚本因为业务需求又发生了改动,而bidder业务集群约有23台(下面只列出了其中10台),且其中的一个业务需求脚本前前后后改动了4次,这时,手动操作肯定会耗费大量人力及时间成本,因此这里用Fabric推送此脚本并执行,代码如下:

#!/usr/bin/python2.6

## -*- coding: utf-8 -*-

from fabric.api import *

from fabric.colors import *

from fabric.context_managers import *

 

user = 'ec2-user'

hosts=['bidder1','bidder2','bidder3','bidder4','bidder5','bidder6','bidder7','bidder8','bidder9','bidder10']

#机器数量比较多,这里只列出其中10台

 

@task

#这里用到了@task修饰器

def put_task():

    print yellow("Put Local File to Nagios Client")

    with settings(warn_only=True):

        put("/home/ec2-user/check_cpu_utili.sh",

"/home/ec2-user/check_cpu_utili.sh")

        sudo("cp /home/ec2-user/check_cpu_utili.sh /usr/local/nagios/libexec")

        sudo("chown nagios:nagios /usr/local/nagios/libexec/check_cpu_utili.sh")

        sudo("chmod +x /usr/local/nagios/libexec/check_cpu_utili")

        sudo("kill  `ps aux | grep nrpe | head -n1 | awk '{print $2}' `")

        sudo("/usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d")

        print green("upload File success and restart nagios  service!")

        #这里以绿色字体打印结果是为了方便查看脚本执行结果

 

for host in hosts:

    env.host_string = host

    put_task()

执行上面的脚本以后,Fabric也会返回清晰的显示结果,大家可以根据显示结果得知哪些机器已经成功运行,哪些机器失败,非常直观,结果如下所示:

Put Local File to remote

[bidder1] put: /home/ec2-user/check_cpu_utili.sh -> /home/ec2-user/check_cpu_utili.sh

[bidder1] sudo: cp /home/ec2-user/check_cpu_utili.sh  /usr/local/nagios/libexec/check_cpu_utili.sh

[bidder1] sudo: chown nagios:nagios /usr/local/nagios/libexec/check_cpu_utili.sh

[bidder1] sudo: chmod +x /usr/local/nagios/libexec/check_cpu_utili.sh

[bidder1] sudo: kill `ps aux | grep nrpe | head -n1 | awk '{print $2}' `

[bidder1] sudo: /usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d

upload File success and restart nagios  service!

Put Local File to remote

[bidder2] put: /home/ec2-user/check_cpu_utili.sh -> /home/ec2-user/check_cpu_utili.sh

[bidder2] sudo: cp /home/ec2-user/check_cpu_utili.sh  /usr/local/nagios/libexec/check_cpu_utili.sh

[bidder2] sudo: chown nagios:nagios /usr/local/nagios/libexec/check_cpu_utili.sh

[bidder2] sudo: chmod +x /usr/local/nagios/libexec/check_cpu_utili.sh

[bidder2] sudo: kill `ps aux | grep nrpe | head -n1 | awk '{print $2}' `

[bidder2] sudo: /usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d

upload File success and restart nagios  service!

Put Local File to remote

[bidder3] put: /home/ec2-user/check_cpu_utili.sh -> /home/ec2-user/check_cpu_utili.sh

[bidder3] sudo: cp /home/ec2-user/check_cpu_utili.sh  /usr/local/nagios/libexec/check_cpu_utili.sh

[bidder3] sudo: chown nagios:nagios /usr/local/nagios/libexec/check_cpu_utili.sh

[bidder3] sudo: chmod +x /usr/local/nagios/libexec/check_cpu_utili.sh

[bidder3] sudo: kill `ps aux | grep nrpe | head -n1 | awk '{print $2}' `

[bidder3] sudo: /usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d

upload File success and restart nagios  service!

Put Local File to remote

[bidder4] put: /home/ec2-user/check_cpu_utili.sh -> /home/ec2-user/check_cpu_utili.sh

[bidder4] sudo: cp /home/ec2-user/check_cpu_utili.sh  /usr/local/nagios/libexec/check_cpu_utili.sh

[bidder4] sudo: chown nagios:nagios /usr/local/nagios/libexec/check_cpu_utili.sh

[bidder4] sudo: chmod +x /usr/local/nagios/libexec/check_cpu_utili.sh

[bidder4] sudo: kill `ps aux | grep nrpe | head -n1 | awk '{print $2}' `

[bidder4] sudo: /usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d

upload File success and restart nagios  service!

Put Local File to remote

[bidder5] put: /home/ec2-user/check_cpu_utili.sh -> /home/ec2-user/check_cpu_utili.sh

[bidder5] sudo: cp /home/ec2-user/check_cpu_utili.sh  /usr/local/nagios/libexec/check_cpu_utili.sh

[bidder5] sudo: chown nagios:nagios /usr/local/nagios/libexec/check_cpu_utili.sh

[bidder5] sudo: chmod +x /usr/local/nagios/libexec/check_cpu_utili.sh

[bidder5] sudo: kill `ps aux | grep nrpe | head -n1 | awk '{print $2}' `

[bidder5] sudo: /usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d

upload File success and restart nagios  service!

大家可以看到,短短几行代码就达到了自动化运维的效果,而且跟Fabric相关的代码都是纯Python代码和Shell代码,开发人员和运维人员很容易上手,在公司里推广应用,大家的认可程度也高。事实上,通过上面的举例大家应该能发现,Fabric特别适合于需要重复执行大量Shell命令的工作场景。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
关系型数据库 MySQL Linux
在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾
以上就是在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾的步骤。这个过程就像是一场接力赛,数据从MySQL数据库中接力棒一样传递到备份文件,再从备份文件传递到其他服务器,最后再传递回MySQL数据库。这样,即使在灾难发生时,我们也可以快速恢复数据,保证业务的正常运行。
111 28
|
1月前
|
Ubuntu Linux PHP
利用PHP压缩音频:Linux环境下的ffmpeg简易安装指南
希望这个指南能为你的编程之旅提供帮助。只需记住,每一行代码都像音乐的音符,组合在一起,创造出美妙的旋律。祝你编程愉快!
90 6
|
2月前
|
关系型数据库 MySQL 应用服务中间件
Linux 手动安装快速部署 LNMP 环境实战
本文详细记录了在阿里云ECS上手动搭建LNMP环境的过程,系统选用Ubuntu 24.04。主要内容包括:1) 使用`apt`安装Nginx和MySQL,并更新软件源;2) 编译安装PHP 8.4.5,配置PHP-FPM及环境路径;3) 配置MySQL root用户密码;4) 调整Nginx支持PHP解析并测试整体环境。通过此过程,重现手动配置服务器的细节,帮助熟悉各组件的安装与协同工作。
141 23
|
2月前
|
JavaScript Ubuntu Linux
如何在阿里云的linux上搭建Node.js编程环境?
本指南介绍如何在阿里云Linux服务器(Ubuntu/CentOS)上搭建Node.js环境,包含两种安装方式:包管理器快速安装和NVM多版本管理。同时覆盖全局npm工具配置、应用部署示例(如Express服务)、PM2持久化运行、阿里云安全组设置及外部访问验证等步骤,助你完成开发与生产环境的搭建。
|
5月前
|
Ubuntu Linux Shell
(已解决)Linux环境—bash: wget: command not found; Docker pull报错Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled
(已成功解决)Linux环境报错—bash: wget: command not found;常见Linux发行版本,Linux中yum、rpm、apt-get、wget的区别;Docker pull报错Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled
1951 68
(已解决)Linux环境—bash: wget: command not found; Docker pull报错Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled
|
3月前
|
关系型数据库 应用服务中间件 Linux
Linux云服务器如何搭建LNMP环境
LNMP环境是Linux系统中常用的Web服务架构,由Linux、Nginx、MySQL/MariaDB和PHP组成,适用于高效托管动态网站。本文以CentOS 7为例,详细介绍了LNMP环境的搭建步骤,包括Nginx、MariaDB和PHP的安装与配置,以及最终通过创建`index.php`文件验证环境是否成功部署。具体操作涵盖配置YUM仓库、安装服务、编辑配置文件、启动服务等关键步骤,确保用户能够顺利搭建并运行LNMP环境。
87 1
Linux云服务器如何搭建LNMP环境
|
3月前
|
机器学习/深度学习 安全 Linux
Linux 主要应用领域的归纳
服务器领域 Linux在服务器领域的应用是其最为广泛和成熟的领域之一。由于其开源、稳定、高效和安全的特性,Linux成为许多企业服务器的首选操作系统。 Web服务器:Linux是Web服务器的理想选择,因为它支持Apache、Nginx等流行的Web服务器软件,这些软件在Linux上运行稳定且性能卓越。Linux服务器可以高效地处理大量并发请求,提供快速、可靠的Web服务。 数据库服务器:Linux也广泛用于数据库服务器,如MySQL、PostgreSQL和Oracle等数据库管理系统在Linux上运行良好。Linux的稳定性和安全性使得它成为存储和管理敏感数据的理想平台。 邮件服务器:Lin
145 5
|
5月前
|
消息中间件 Java Kafka
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
本文介绍了Kafka集群的搭建过程,涵盖从虚拟机安装到集群测试的详细步骤。首先规划了集群架构,包括三台Kafka Broker节点,并说明了分布式环境下的服务进程配置。接着,通过VMware导入模板机并克隆出三台虚拟机(kafka-broker1、kafka-broker2、kafka-broker3),分别设置IP地址和主机名。随后,依次安装JDK、ZooKeeper和Kafka,并配置相应的环境变量与启动脚本,确保各组件能正常运行。最后,通过编写启停脚本简化集群的操作流程,并对集群进行测试,验证其功能完整性。整个过程强调了自动化脚本的应用,提高了部署效率。
1070 1
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
|
6月前
|
Linux UED iOS开发
|
6月前
|
运维 监控 持续交付
云计算环境下的运维自动化实践
本文探讨了在云计算环境下实施运维自动化的必要性、挑战及解决方案,重点介绍了如何利用现代技术工具实现高效的云资源管理和监控。通过具体案例分析,展示了自动化运维在提升系统稳定性、降低人力成本方面的优势。