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

[经验分享] Fabric:Python远程部署工具

[复制链接]

尚未签到

发表于 2018-8-8 13:35:51 | 显示全部楼层 |阅读模式
  关于Fabric
  Fabric是一个Python库和命令行工具,旨在为应用部署和系统管理任务的SSH的流水线式操作,使之更加高效和方便。Fabric提供了一套基本的执行本地和远程shell命令、上传和下载文件的操作,包括一些辅助函数,例如驱动正在运行的用户输入或者放弃执行。
  Fabric通过把大量频繁使用的SSH操作写入到一个脚本中(fabric.py),来远程执行一些应用部署或者系统维护的任务。Fabric是类似paramiko的一个库,是对paramiko的再次封装,所以比使用paramiko更简单。
  Fabric的优点:
  1. 角色定义
  2. 代码易读
  3. 封装了本地、远程操作
  4. 参数灵活,能偶动态指定host/role等,还有并发执行(基于multiprocessing)
  5. 完整的日志输出
  安装Fabric
  Fabric的安装很简单,可以直接使用pip或者easy_install安装到当前Python环境中,或者下载最新的源码使用"python setup.py xxx"的方式来安装:
  #pip install fabric
  使用Fabric
  1 Fabric通过命令行工具fab来执行定义在fabfile.py中的任务,常用的配置和函数如下
  1. 常用的fab命令选项和参数:
  -l    显示可用的task
  -H    指定host,多个host用逗号分开
  -R    指定role,多个role用逗号分开
  -P    并分数,默认是串行
  -w    warn_only,默认为遇到异常直接放弃执行并退出
  -f    指定入口文件,fab默认入口文件是:fabfile/fabfile.py
  
  2. fabfile.py文件中常用配置和函数:
  env.host        主机ip,也可以使用fab选项-H参数来指定
  env.password    SSH密码,若已经设置好无密码登录,则可以忽略
  env.roledefs    角色分组,如:{'web': ['x', 'y'], 'db': ['z']}
  local('pwd')    执行本地命令
  lcd('/tmp')        切换本地目录
  cd('/tmp')        切换远程目录
  run('uname -s')        执行远程命令
  sudo('service httpd restart')    执行远程sudo,注意pty选项
  2 任务函数
  Fabric中的任务就是一个个Python函数,通过将上述的函数封装到某一个函数中来执行相应的任务
  示例:
  #cat fabfile.py
  from fabric.api import run
  def host_type():
  run('uname -s')
  def hello(name="jayzhou"):
  print("Hello %s!" % name)
  def combine(name="jayzhou"):
  hello(name)
  host_type()
  在执行任务的时候,可以通过fab的命令行参数为任务函数传递参数:
  #fab hello:name=Rango
  3. 管理远程服务
  1. 获取远程服务器版本信息
  #cat fabfile.py
  from fabric.api import env
  from fabric.api import cd
  from fabric.api import run
  from fabric.api import local
  from fabric.api import get
  from fabric.api import put
  env.hosts = ['192.168.56.101', '192.168.56.102']
  env.user = 'root'
  env.password = "password"
  def get_version():
  local('cat /etc/issue')
  run('cat /etc/issue')
  with cd('/root/'):
  put('/home/rango/test.txt', 'test.txt', mode=0755)
  get('hello_world.txt')
  run('ls')
  def get_host_name():
  run('hostname')
  运行:
  #fab -f fabfile.py get_version
  2. 管理远程httpd服务:
  #cat fabfile.py
  from fabric.api import *
  env.hosts = ['192.168.56.101', '192.168.56.102']
  env.user = 'root'
  env.password = "password"
  @task
  def httpd_start():
  ''' httpd start '''
  sudo('service httpd start')
  @task
  def httpd_stop():
  ''' httpd stop '''
  sudo('service httpd stop')
  查看可用命令:
  #fab -f fabfile.py --list
  Available commands:
  httpd_start  httpd start
  httpd_stop   httpd stop
  执行:
  #fab -f fabfile.py httpd_start
  3. 基于角色
  #cat fabfile.py
  #!/usr/bin/env python
  #coding:utf-8
  from fabric.api import *
  env.roledefs = {'httpd': ['192.168.56.101', '192.168.56.102'], 'mysql': '192.168.56.103'}
  @task
  def mysql_start():
  '''mysql start'''
  sudo('/etc/init.d/mysql start')
  @task
  def httpd_start():
  '''httpd start'''
  sudo('/etc/init.d/httpd start')
  @task
  def httpd_stop():
  '''httpd stop'''
  sudo('/etc/init.d/httpd stop')
  查看可用命令:
  #fab -f fabfile.py --list
  Available commands:
  httpd_start  httpd start
  httpd_stop   httpd stop
  mysql_start  mysql start
  执行:
  #fab -f fabfile.py -R httpd httpd_start
  #fab -f fabfile.py -R mysql mysql_start
  4. 直接使用Fabric库
  #cat fabfile.py
  #!/usr/bin/env python
  #coding:utf-8
  from fabric.state import env, connections
  from fabric.tasks import execute
  from fabric.api import run
  env.user = 'root'
  env.password = 'password'
  hosts = ['192.168.56.101', '192.168.56.102']
  def myls(path):
  run('ls %s' % path)
  execute(myls, path='/root/', hosts=hosts)
  for key in connections.keys():
  connections[key].close()
  del connections[key]
  在这一段代码中使用env来获取和设置环境参数,使用execute执行自定义的函数,然后使用connections来管理连接。其中execute通过传递参数可以在fab命令中指定目录。
  执行:
  #fab -f fabfile.py myls:path=/root
  ——游响云停

运维网声明 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-548731-1-1.html 上篇帖子: 【Python之旅】第六篇(四):Python多线程锁 下篇帖子: python shell 爬虫 妹子图片
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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