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

[经验分享] python fabric实现远程操作和部署

[复制链接]

尚未签到

发表于 2015-4-25 08:31:05 | 显示全部楼层 |阅读模式



博客迁往:新地址 (点击直达)
新博客使用markdown维护,线下有版本号库,自己写的所以会定时更新同步,同一时候提供更好的导航和阅读体验
csdn对markdown支持不好,所以旧版不会花时间进行同步修订,抱歉



-----------------------------------------------




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,运行到相应机器时会跳出要求输入密码的交互

多server混搭
  操作多个server,须要配置多个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.password管理
  看文档
  更好的password管理方式,哥比較土,没打通,主要是server列表变化频繁,我的处理方式是:
  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列表的…..
  初略就用到这些,兴许有很多其它需求的时候再去捞文档了,话说文档里好东西真多,就是太多了,看了晕。。。
  The end!
  To be continue….
  wklken
  Email: wklken@yeah.net
  Blog: http://www.wklken.com
  2013-03-25
  转载请注明出处,谢谢

运维网声明 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-60408-1-1.html 上篇帖子: python进阶八_警告和异常 下篇帖子: python中hassttr()
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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