Fabric 部署到服务器上去

简介: Fabric 部署到服务器上去

从本地到远端

文件传输

之前提到,Fabric集成了Paramiko的ssh基本功能,自然少不了SFTP,所以除了执行shell命令,Fabric也常用于文件传输,封装与Connection.put, Connection.get。这比Paramiko好了不少,Paramiko成功建立链接之后,我记得还需要单独实例化一个SFTP对象。Fabric把所有的操作都赋

予Connection实例了。

>>> from fabric import Connection
>>> result = Connection('web1').put('myfiles.tgz', remote='/opt/mydata/')
>>> print("Uploaded {0.local} to {0.remote}".format(result))
Uploaded /local/myfiles.tgz to /opt/mydata/

封装多步操作

比如,上传文件,然后解压,从整体来看是一套流程中稀碎的事请,我们完成一件事情,可以封装一系列动作,通过传递Connection实例到方法

,让代码复用性更高,通过被其他API调用组合成更加复杂的用例。更干净

例如:

from fabric import Connection
c = Connection('web1')
c.put('myfiles.tgz', '/opt/mydata')
c.run('tar -C /opt/mydata -xzvf /opt/mydata/myfiles.tgz')

可以变成

def upload_and_unpack(c):
    c.put('myfiles.tgz', '/opt/mydata')
    c.run('tar -C /opt/mydata -xzvf /opt/mydata/myfiles.tgz')

多服务器

大多数的实际用例都包含了同时在多台服务器上做一些事请,可以通过,将多台服务器存入数据结构中,然后一一便利,但是fabric提供了更加

方便的方式用来包装所有的Connection实例,叫做Group,它提供了和Connection相同的API,更加具体一点,我们需要选择Group的两个子类之>一,SerialGroup或ThreadingGroup。

>>> from fabric import SerialGroup as Group
>>> results = Group('web1', 'web2', 'mac1').run('uname -s')
>>> print(results)
<GroupResult: {
    <Connection 'web1'>: <CommandResult 'uname -s'>,
    <Connection 'web2'>: <CommandResult 'uname -s'>,
    <Connection 'mac1'>: <CommandResult 'uname -s'>,
}>
>>> for connection, result in results.items():
...     print("{0.host}: {1.stdout}".format(connection, result))
...
...
web1: Linux
web2: Linux
mac1: Darwin

相较于Connection返回的内容是Result对象(fabric.runners.Result),Group方法返回的是GroupResult,dict-like 的对象支持访问单个Connection的结果。所以能通过items()来遍历字典。

当任何包含在Group的独立链接发生错误时,会抛出GroupException

全都拉起来

直接上例子,多服务器的串行部署。

from fabric import SerialGroup as Group
def upload_and_unpack(c):
    if c.run('test -f /opt/mydata/myfile', warn=True).failed:
        c.put('myfiles.tgz', '/opt/mydata')
        c.run('tar -C /opt/mydata -xzvf /opt/mydata/myfiles.tgz')
for connection in Group('web1', 'web2', 'web3'):
    upload_and_unpack(connection)

记得吗,Group是可便利对象,Group对象的api返回的结果是dict-like对象

使用fab部署我们的项目

我之前在介绍Invoke的时候单独写了一篇文章,里面的task装饰器,可以将方法变成可执行的命令行选项。当然fabric也有。

最后一个例子,还是上传加打包。

from fabric import task
@task
def upload_and_unpack(c):
    if c.run('test -f /opt/mydata/myfile', warn=True).failed:
        c.put('myfiles.tgz', '/opt/mydata')
        c.run('tar -C /opt/mydata -xzvf /opt/mydata/myfiles.tgz')

之后将会在命令行看到:

$ fab --list
Available tasks:
  upload_and_unpack

更加强大的是下面这两条命令

$ fab -H web1 upload_and_unpack

$ fab -H web1,web2,web3 upload_and_unpack

我没有试验过,但它貌似可以自动的创建该服务的链接并且传递给task装饰的方法。

但我估计执行之后,是需要输入密码的,就像普通的ssh建立链接一样,如果配置免密,估计会执行的更加丝滑。

这只是官方例子,但我认为使用的时候可以不用—H选项,直接写好自己的部署任务,在代码中创建Connection。

相关文章
|
6月前
|
弹性计算 人工智能 前端开发
在阿里云ECS上部署n8n自动化工作流:U2实例实战
本文介绍如何在阿里云ECS的u2i/u2a实例上部署开源工作流自动化平台n8n,利用Docker快速搭建并配置定时任务,实现如每日抓取MuleRun新AI Agent并推送通知等自动化流程。内容涵盖环境准备、安全组设置、实战案例与优化建议,助力高效构建低维护成本的自动化系统。
1595 5
|
6月前
|
Java Linux Apache
在CentOS服务器上编译并部署NiFi源码
部署Apache NiFi在CentOS上是一个涉及细节的过程,需要注意Java环境、源码编译、配置调整等多个方面。遵循上述步骤,可以在CentOS服务器上成功部署和配置Apache NiFi,从而高效地处理和分发数据。
251 17
|
7月前
|
弹性计算 安全 Linux
使用阿里云服务器安装Z-Blog博客网站流程,新手一键部署教程
本教程教你如何在阿里云99元服务器上,通过宝塔Linux面板一键部署Z-Blog博客。基于CentOS 7.9系统,从远程连接、安装宝塔面板、开放端口到部署Z-Blog全流程详解,操作简单,新手也能轻松搭建个人博客网站。
921 13
|
7月前
|
弹性计算 Devops Shell
用阿里云 DevOps Flow 实现 ECS 部署自动化:从准备到落地的完整指南
阿里云 DevOps Flow 是一款助力开发者实现自动化部署的高效工具,支持代码流水线构建、测试与部署至ECS实例,显著提升交付效率与稳定性。本文详解如何通过 Flow 自动部署 Bash 脚本至 ECS,涵盖环境准备、流水线搭建、源码接入、部署流程设计及结果验证,助你快速上手云上自动化运维。
616 0
监控 安全 Linux
406 0
|
8月前
|
监控 Java Linux
Apache NiFi项目的编译与部署于CentOS服务器
总而言之,Apache NiFi的编译和部署虽然涉及多个步骤,但这些操作步骤简明扼要,即使是不太熟悉Java或Maven的用户也能跟随指南完成。通过遵循上述步骤,您将能够在CentOS服务器上成功部署Apache NiFi,为您的数据流处理任务建立一个功能强大的平台。
522 16
|
8月前
|
资源调度 负载均衡 JavaScript
使用PM2工具部署Vue.js应用于服务器
以上步骤完成之后,你就成功利⽤ PM⼆工具将 Vuejs 应⽰程序部署至服 务 器,并且配合反向代理实现了高效稳定访问及负载均衡功能。
357 0
|
8月前
|
运维 数据可视化 数据库
一小时搞定服务器软件部署:资深工程师实测方案
本文分享了一位运维工程师在短时间内将30个不同软件部署到新服务器上的实战经验。面对全新 Rocky Linux 系统,传统手工部署方式效率低下且容易出错。作者尝试多种自动化方案后,最终选择使用自动化部署工具,通过其内置的 Docker Compose 模板和可视化界面,实现快速、批量部署,大幅提升效率,30个应用仅用约1小时完成,显著节省时间和人力成本。

热门文章

最新文章

下一篇
开通oss服务