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。

相关文章
|
1月前
|
弹性计算 监控 负载均衡
|
2月前
|
监控 安全 Linux
RHEL 环境下 Subversion 服务器部署与配置
【10月更文挑战第18天】在RHEL环境下部署Subversion服务器需依次完成安装Subversion、创建版本库、配置服务器、启动服务、客户端连接及备份维护等步骤。确保遵循安全最佳实践,保障数据安全。
103 1
|
1月前
|
弹性计算 开发工具 git
2分钟在阿里云ECS控制台部署个人应用(图文示例)
作为一名程序员,我在部署托管于Github/Gitee的代码到阿里云ECS服务器时,经常遇到繁琐的手动配置问题。近期,阿里云ECS控制台推出了一键构建部署功能,简化了这一过程,支持Gitee和GitHub仓库,自动处理git、docker等安装配置,无需手动登录服务器执行命令,大大提升了部署效率。本文将详细介绍该功能的使用方法和适用场景。
2分钟在阿里云ECS控制台部署个人应用(图文示例)
|
28天前
|
NoSQL 容灾 MongoDB
MongoDB主备副本集方案:两台服务器使用非对称部署的方式实现高可用与容灾备份
在资源受限的情况下,为了实现MongoDB的高可用性,本文探讨了两种在两台服务器上部署MongoDB的方案。方案一是通过主备身份轮换,即一台服务器作为主节点,另一台同时部署备节点和仲裁节点;方案二是利用`priority`设置实现自动主备切换。两者相比,方案二自动化程度更高,适合追求快速故障恢复的场景,而方案一则提供了更多的手动控制选项。文章最后对比了这两种方案与标准三节点副本集的优缺点,指出三节点方案在高可用性和数据一致性方面表现更佳。
|
1月前
|
PHP 数据库 数据安全/隐私保护
布谷直播源码部署服务器关于数据库配置的详细说明
布谷直播系统源码搭建部署时数据库配置明细!
|
2月前
|
关系型数据库 MySQL Linux
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
376 3
|
2月前
|
NoSQL Linux PHP
|
2月前
|
弹性计算 数据库连接 Nacos
阿里云ECS服务器在docker中部署nacos
docker pull nacos 失败,docker部署nacos遇到的问题,nacos数据库连接,nacos端口映射
152 1
|
2月前
|
监控 网络安全 调度
Quartz.Net整合NetCore3.1,部署到IIS服务器上后台定时Job不被调度的解决方案
解决Quartz.NET在.NET Core 3.1应用中部署到IIS服务器上不被调度的问题,通常需要综合考虑应用配置、IIS设置、日志分析等多个方面。采用上述策略,结合细致的测试和监控,可以有效地提高定时任务的稳定性和可靠性。在实施任何更改后,务必进行充分的测试,以验证问题是否得到解决,并监控生产环境的表现,确保长期稳定性。
90 1
|
2月前
|
安全 Linux 数据安全/隐私保护
RHEL 环境下 Subversion 服务器部署与配置
【10月更文挑战第17天】在RHEL环境下部署Subversion服务器包括安装Subversion、创建和配置版本库、启动服务器、客户端连接以及备份与恢复等步骤。通过这些步骤,可确保服务器的安全性和稳定性,满足版本控制需求。