热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

pythonfabric实现远程操作和部署

fabrictitle是开发,但是同时要干开发测试还有运维的活……为毛task*3不是salary*3(o(╯□╰)o)近期接手越来越多的东西,发布和运维的工作相当机械,加上频率还蛮高,导致时间浪费还是优点多。修复bug什么的,测试,提交版本库(2分钟),ssh到测试环境pull部署(2分钟),rsync到线上机器A,B,C,D,E(1分钟),分别ssh到ABCDE五台机器,逐一重启(8-10分钟)13-15分钟其中郁闷的是,每次操作都是相同的,命令一样,要命的是

fabric

title是开发,但是同时要干开发测试还有运维的活……为毛 task*3 不是 salary * 3 (o(╯□╰)o)

近期接手越来越多的东西,发布和运维的工作相当机械,加上频率还蛮高,导致时间浪费还是优点多。

修复bug什么的,测试,提交版本库(2分钟),ssh到测试环境pull部署(2分钟),rsync到线上机器A,B,C,D,E(1分钟),分别ssh到ABCDE五台机器,逐一重启(8-10分钟) = 13-15分钟

其中郁闷的是,每次操作都是相同的,命令一样,要命的是在多个机器上,很难在本机一个脚本搞定,主要时间都浪费在ssh,敲命令上了,写成脚本,完全可以一键执行,花两分钟看下执行结果

直到,发现了fabric这货

作用

很强大的工具

可以将自动化部署或者多机操作的命令固化到一个脚本里

和某些运维工具很像,用它主要是因为,Python…..

简单好用易上手

当然,shell各种命令组合起来也可以,上古神器和现代兵器的区别

环境配置

在本机和目标机器安装对应包(注意,都要有)

sudo easy_install fabric

目前是1.6版本(或者用pip install,一样的)

安装完后,可以查看是否安装成功

[ken@~$] which fab
/usr/local/bin/fab

然后,可以动手了

hello world

先进行本机简单操作,有一个初步认识,例子来源与官网

新建一个py脚本: fabfile.py

def hello():
    print("Hello world!")

命令行执行:

[ken@~/tmp/fab$] fab hello
Hello world!
Done.

注意,这里可以不用fabfile作为文件名,但是在执行时需指定文件

[ken@~/tmp/fab$] mv fabfile.py test.py
fabfile.py -> test.py
[ken@~/tmp/fab$] fab hello
Fatal error: Couldn't find any fabfiles!
Remember that -f can be used to specify fabfile path, and use -h for help.
Aborting.
[ken@~/tmp/fab$] fab -f test.py hello
Hello world!
Done.

带参数:

修改fabfile.py脚本:

def hello(name, value):
    print("%s = %s!" % (name, value))

执行

[ken@~/tmp/fab$] fab hello:name=age,value=20
age = 20!
Done.
[ken@~/tmp/fab$] fab hello:age,20
age = 20!
Done.

执行本机操作

简单的本地操作:

from fabric.api import local
def lsfab():
    local('cd ~/tmp/fab')
    local('ls')

结果:

[ken@~/tmp/fab$] pwd;ls
/Users/ken/tmp/fab
fabfile.py   fabfile.pyc  test.py      test.pyc
[ken@~/tmp/fab$] fab -f test.py lsfab
[localhost] local: cd ~/tmp/fab
[localhost] local: ls
fabfile.py  fabfile.pyc test.py     test.pyc
Done.

实战开始:

假设,你每天要提交一份配置文件settings.py到版本库(这里没有考虑冲突的情况)

如果是手工操作:

cd /home/project/test/conf/
git add settings.py
git commit -m 'daily update settings.py'
git pull origin
git push origin

也就是说,这几个命令你每天都要手动敲一次,所谓daily job,就是每天都要重复的,机械化的工作,让我们看看用fabric怎么实现一键搞定:(其实用shell脚本可以直接搞定,但是fab的优势不是在这里,这里主要位后面本地+远端操作做准备,毕竟两个地方的操作写一种脚本便于维护)

from fabric.api import local
def setting_ci():
    local("cd /home/project/test/conf/")
    local("git add settings.py")
    #后面你懂的,懒得敲了….

混搭整合远端操作

这时候,假设,你要到机器A的/home/ken/project对应项目目录把配置文件更新下来

#!/usr/bin/env python
# encoding: utf-8
from fabric.api import local,cd,run
env.hosts=['user@ip:port',] #ssh要用到的参数
env.password = 'pwd'
def setting_ci():
    local('echo "add and commit settings in local"')
    #刚才的操作换到这里,你懂的
def update_setting_remote():
    print "remote update"
    with cd('~/temp'):   #cd用于进入某个目录
        run('ls -l | wc -l')  #远程操作用run
def update():
    setting_ci()
    update_setting_remote()

然后,执行之:

[ken@~/tmp/fab$] fab -f deploy.py update
[user@ip:port] Executing task 'update'
[localhost] local: echo "add and commit settings in local"
add and commit settings in local
remote update
[user@ip:port] run: ls -l | wc -l
[user@ip:port] out: 12
[user@ip:port] out:
Done.

注意,如果不声明env.password,执行到对应机器时会跳出要求输入密码的交互

多服务器混搭

操作多个服务器,需要配置多个host

#!/usr/bin/env python
# encoding: utf-8
from fabric.api import *
#操作一致的服务器可以放在一组,同一组的执行同一套操作
env.roledefs = {
            'testserver': ['user1@host1:port1',],  
            'realserver': ['user2@host2:port2', ]
            }
#env.password = '这里不要用这种配置了,不可能要求密码都一致的,明文编写也不合适。打通所有ssh就行了'
@roles('testserver')
def task1():
    run('ls -l | wc -l')
@roles('realserver')
def task2():
    run('ls ~/temp/ | wc -l')
def dotask():
    execute(task1)
    execute(task2)

结果:

[ken@~/tmp/fab$] fab -f mult.py dotask
[user1@host1:port1] Executing task 'task1'
[user1@host1:port1] run: ls -l | wc -l
[user1@host1:port1] out: 9
[user1@host1:port1] out:
[user2@host2:port2] Executing task 'task2'
[user2@host2:port2] run: ls ~/temp/ | wc -l
[user2@host2:port2] out: 11
[user2@host2:port2] out:
Done.

扩展

1.颜色

可以打印颜色,在查看操作结果信息的时候更为醒目和方便

from fabric.colors import *
def show():
    print green('success')
    print red('fail')
    print yellow('yellow')
#fab -f color.py show

2.错误和异常

关于错误处理

默认,一组命令,上一个命令执行失败后,不会接着往下执行

失败后也可以进行不一样的处理, 文档

目前没用到,后续用到再看了

3.密码管理

看文档

更好的密码管理方式,哥比较土,没打通,主要是服务器列表变化频繁,我的处理方式是:

1.host,user,port,password配置列表,所有的都写在一个文件

或者直接搞到脚本里,当然这个更........

env.hosts = [

'host1',

'host2'
]
env.passwords = {
'host1': "pwdofhost1",
'host2': "pwdofhost2",
}

或者

env.roledefs = {
'testserver': ['host1', 'host2'],
'realserver': ['host3', ]
}
env.passwords = {
'host1': "pwdofhost1",
'host2': "pwdofhost2",
'host3': "pwdofhost3",
}

2.根据key解析成map嵌套,放到deploy中

另外命令其实也可以固化成一个cmds列表的…..

以上就是python fabric实现远程操作和部署 的详细内容,更多请关注 第一PHP社区 其它相关文章!


推荐阅读
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • 大坑|左上角_pycharm连接服务器同步写代码(图文详细过程)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了pycharm连接服务器同步写代码(图文详细过程)相关的知识,希望对你有一定的参考价值。pycharm连接服务 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了markdown[软件代理设置]相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 现在比较流行使用静态网站生成器来搭建网站,博客产品着陆页微信转发页面等。但每次都需要对服务器进行配置,也是一个重复但繁琐的工作。使用DockerWeb,只需5分钟就能搭建一个基于D ... [详细]
  • Linux一键安装web环境全攻略
    摘自阿里云服务器官网,此处一键安装包下载:点此下载安装须知1、此安装包可在阿里云所有Linux系统上部署安装,此安装包包含的软件及版本为& ... [详细]
  • centos php部署到nginx 404_NodeJS项目部署到阿里云ECS服务器全程详解
    本文转载自:http:www.kovli.com20170919ecs-deploy作者:Kovli本文详细介绍如何部署NodeJS项目到阿里云ECS上, ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 生产环境下JVM调优参数的设置实例
     正文前先来一波福利推荐: 福利一:百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。福利二 ... [详细]
  • 交换机配置:intg100unshintvlani1ipadd192.168.56.177qstelseuser-iv4authaaaproinsshupl3qsshuserpyt ... [详细]
  • 我创建了一个SSH密钥,当我以admin身份在GitBash中运行ssh-Tgit@gitlab.com时,我得到W ... [详细]
author-avatar
mobiledu2502916573
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有