从1.x升级

现代结构(2+)代表了软件的几乎完全重新实现和重组。已经过去了 broken in two 清理,更明确,等等。在某些情况下,升级只需要基本搜索&replace;在其他情况下,需要做更多的工作。

如果您仔细阅读本文档,它将引导您朝正确的方向前进,直到您完全升级。如果您在Fabric 1中使用的任何功能未在此处列出,请提交一张罚单。 on Github 我们会尽快更新。

警告

从2.0释放线开始,织物2 not 与1.x!的100%功能对等!一些特性已经被显式地删除了,但其他特性还没有被移植,要么是由于时间限制,要么是因为所说的特性需要在现代环境中重新检查。

请查看以下信息,包括 升级详细信息 在提交错误报告之前,包含一个非常详细的列表的部分!

也看到 the roadmap 有关版本控制的其他说明。

为什么要升级?

我们不想以任何特定的顺序,呼吁对现代 Fabric 进行一些特定的改进,这可能会使升级值得您花时间。

备注

这些都列在医生的其他部分,所以如果你已经被卖了,就跳过那里。

  • 线程安全-不再要求多处理并发性;

  • API重新组织 fabric.connection.Connection 对象而不是全局模块状态;

  • 对命令行解析器进行了大修,以允许在每个任务的基础上使用常规的GNU/POSIX样式标志和选项(不再使用 fab mytask:weird=custom,arg=format

  • 任务组织更加明确和灵活/具有更少的“魔力”;

  • 任务可以声明其他任务始终在自己之前或之后运行;

  • 配置大规模扩展,允许多个配置文件和格式、env vars、每个用户/项目/模块配置等;

  • ssh配置文件加载在默认情况下是启用的,并且已经扩展了:系统/用户/运行时文件选择;

  • shell命令执行API在本地和远程方法调用之间保持一致-不再区分 localrun (当然,除了运行命令的地方!);

  • shell命令更加灵活:交互行为、同时捕获和显示(现在适用于本地子进程,而不仅仅是远程进程)、编码控制和自动响应;

  • 对ssh层使用paramiko的API会更加透明-例如 fabric.connection.Connection 允许控制给予的禁运 SSHClient.connect

  • 网关/跨接主机功能提供 ProxyJump 样式“native”(无代理命令子进程)选项,可以无限嵌套;

要调用的“侧放”

我们链接到了上面关于这个的一个注释,但要明确:现代结构实际上是几个独立的库,并且任何与ssh或网络无关的东西 split out into the Invoke project .

这意味着,如果您是一组仅利用结构执行任务的用户,或者 local ,从未使用过 runput 或类似的 你不需要再使用布料本身了 并且可以简单地 改为调用“sidegrade” .

您仍然希望阅读此文档以了解情况的变化,但请注意,您可以避开 pip install invoke 不需要结构、参数、密码依赖性或其他任何东西。

从invoke中使用现代结构

我们打算增强现代织物,直到它包含织物1的大部分用例,这样您就可以使用 fab 而fabfiles本身并不太关心它是如何建立在invoke之上的。

然而,在这一点之前——对于中级到高级用户来说,这一点非常有用——事实上,现代结构的设计考虑到了库或直接的API使用。 在某些情况下,完全可以使用invoke来满足您的cli需求,并在invoke任务中将结构用作纯API。

换句话说,你可以避开 fab /除非你发现自己非常需要特别会议的便利设施,比如 --hosts 诸如此类。

同时运行两种结构版本

为了帮助逐步升级,现代织物可以安装在名称下 fabric2 (除了“正常”提供2.0+版本的 fabric )并且可以与1.x版的安装共存。

因此,如果您有一个大的代码库,并且不想一次跳到现代版本,那么可以同时使用两种结构1 (fabric ,就像你以前安装的一样)和现代织物 fabric2 )同时驻留在您的Python环境中。

备注

我们强烈建议您最终使用Fabric1将所有代码迁移到版本2或更高版本,以便您可以返回到 fabric 姓名。 fabric2 作为一个独特的包和模块,它的目的是要有一个权宜之计,而不会有任何 fabric3 或者更高(尤其是因为其中一些名字已经被取了!)

有关如何获取 fabric2 包的版本,请参见 安装现代 Fabric 组件 fabric2 .

创造 Connection 和/或 Config V1设置中的对象

逐段升级时的一种常见策略是生成其内容与当前Fabric 1环境匹配的现代Fabric对象。而Fabric 1存储 all 配置(包括“当前主机”)放在一个地方-- env 对象--现代织物将事物分解成多个(尽管是合成的)对象: Connection 对于每个连接的参数,和 Config 用于常规设置和默认设置。

在大多数情况下,您只需要生成 Connection 使用备用类构造函数创建 Connection.from_v1 ,它应该喂给您适当的本地 fabric.api.env 对象;有关详细信息,请参阅其API文档。

一个人为的例子::

from fabric.api import env, run
from fabric2 import Connection

env.host_string = "admin@myserver"
run("whoami") # v1
cxn = Connection.from_v1(env)
cxn.run("whoami") # v2+

默认情况下,此构造函数调用另一个API成员-- Config.from_v1 --内部代表你方。需要更严格地控制现代风格配置选项的用户可以选择显式调用该类方法,并将修改后的结果提交给 Connection.from_v1 ,这将导致后者跳过任何隐式配置创建。

V1的映射 env 向现代API成员提供VAR

这个 env VAR及其如何映射到 Connection 论据或 Config 值(当输入到 .from_v1 上述构造函数)如下所示。

V1版 env 变量

V2+用法(以其最终所在的类为前缀)

always_use_pty

配置: run.pty

command_timeout

配置: timeouts.command ;超时现在是它们自己的配置子树,而在v1中,可能会出现不明确的 timeout 设置--见下文--为CONNECT或命令超时工作。

forward_agent

配置: connect_kwargs.forward_agent

gateway

配置: gateway

host_string

连接: host Kwarg(它可以处理类似主机字符串的值,包括用户/端口)。

key

Not supported :Fabric 1在将其传递到Paramiko之前对其执行了额外的处理(尝试一组关键类来实例化);现代Fabric更喜欢直接让您处理Paramiko级别的参数。

如果您正在填充您的织物1 key 文件中的数据,我们建议切换到 key_filename 相反,这是受支持的。

如果要将来自其他源的键数据作为字符串加载,则应该知道您的数据是什么类型的键,并手动实例化它,然后将其提供给 connect_kwargs 参数。例如::

from io import StringIO
from fabric.state import env
from fabric2 import Connection
from paramiko import RSAKey
from somewhere import load_my_key_string

pkey = RSAKey.from_private_key(StringIO(load_my_key_string()))
cxn = Connection.from_v1(env, connect_kwargs={"pkey": pkey})

key_filename

配置: connect_kwargs.key_filename

no_agent

配置: connect_kwargs.allow_agent (反转)。

password

Config: connect_kwargs.password, as well as sudo.password if and only if the env's sudo_password (see below) is unset. (This mimics how v1 uses this particular setting - in earlier versions there was no sudo_password at all.)

port

连接: port 科瓦格。由于结构1‘S缺省值为字符串值(在v2中无效),因此强制转换为整数。

备注

自V1以来,S port 既用于默认的 and 为了存储当前连接状态,v2仅使用它来填充连接,而不是配置,假设它通常将是当前连接状态。

ssh_config_path

配置: ssh_config_path

sudo_password

配置: sudo.password

sudo_prompt

配置: sudo.prompt

timeout

配置: timeouts.connection ,用于连接超时,或 timeouts.command 用于命令超时(见上文)。

use_ssh_config

配置: load_ssh_configs

user

连接: user 科瓦格。

warn_only

配置: run.warn

升级详细信息

这是一份详尽的 all Fabric1.x功能以及1.x中没有的新to-invoke-or-Fabric-2功能;它指定是否需要升级,如果需要,如何升级,并跟踪尚未在现代版本中实现的功能。

大多数部分以表格形式分解,如下所示:

结构1特征或行为

状态,详见下文

迁移说明、迁移原理等

下面是“状态”列的典型值,尽管其中一些值有点松——请确保在所有情况下都阅读“注释”列!还请注意,事情并不是铁面无私的——例如,如果有足够多的用户请求,任何“删除的”项目都有返回的机会,或者如果使用案例表明解决方法不足。

  • Ported :已可用,可能已重命名或移动(经常移动到 Invoke CodeBase。)

  • 悬而未决的 :适合,但尚未移植,很适合补丁。 这些条目链接到相应的GitHub票据 -请不要做新的!

  • 远离的 明确地 not 移植(不再符合视力,维护价值比太差等),不太可能恢复。

以下是用于导航的快速本地目录:

一般/概念

  • cli面向任务的工作流仍然是一个主要的设计目标,但是库用例不再是二级公民;相反,库功能是首先设计的,并且在其基础上构建了cli/task功能。

  • 此外,在cli用例中,版本1过分强调了“lazy”交互式提示的身份验证机密,甚至连接参数,部分原因是缺乏强大的配置机制。随着时间的推移,很明显,这不值得折中使用混淆的非交互行为和困难的调试/测试过程。

    现代结构采用了一种可以说更干净的方法(基于随着时间推移添加到v1的功能),鼓励用户利用配置系统和/或在 开始 如果系统确定中途缺少信息,则会引发异常而不是提示。

  • invoke的设计包括 explicit user-facing testing functionality ;如果您以前没有找到使用代码为结构编写测试的方法,那么现在应该更容易了。

    • 我们建议您尽早编写测试;它们将帮助您明确升级过程,并使过程更安全!

API组织

高级代码流和API成员关注点。

通过导入所有内容 fabric.api

远离的

所有有用的导入现在都可以在顶级级别使用,例如 from fabric import Connection .

全局配置连接参数(通过 env.host_string, env.host, env.port, env.user) and call global methods which implicitly reference them (run/sudo 等)

远离的

主API现在正确了oop:实例化 fabric.connection.Connection 对象并调用它们的方法。这些对象封装了所有连接状态(用户、主机、网关等),并拥有自己的ssh客户机实例。

参见

Connection.from_v1

强调将序列化的“主机字符串”作为设置用户、主机、端口等的方法

移植/移除

fabric.connection.Connection can accept a shorthand "host string"-like argument, but the primary API is now explicit user, host, port, etc keyword arguments.

此外,许多参数/设置等在v1中需要主机字符串,现在需要 fabric.connection.Connection 而是实例。

使用“角色”作为主机字符串的全局命名列表

端口

这个需求现在由 fabric.group.Group 对象(包含一些 fabric.connection.Connection 具有“对所有成员做一件事”方法的实例。)用户可以根据自己的需要创建和组织这些实例。

See the line items for --roles (cli参数、选项和行为), env.roles (fabric.env 参考) and @roles (任务功能和装饰) for the status of those specifics.

任务功能和装饰

备注

几乎所有与任务相关的功能都在invoke中实现;有关更多详细信息,请参见 executionnamespaces 文档。

默认情况下,任务从 fabfile.py 从用户当前的工作目录向上搜索文件系统根目录。

端口

这种行为在今天基本上是相同的,只做了一些小的修改和增强(例如对加载过程的更严格控制,以及实现自定义加载程序逻辑的API钩子——请参见 loading-collections

“经典”样式的隐式任务函数缺少 @task decorator

远离的

即使是在v1中,它们也在逐渐消失,现在通过invoke的 TaskCollection .

“新”风格 @task -装饰,模块级任务功能

端口

基本上是一样的,尽管现在有了超级大国- @task 仍然可以不带任何括号使用,但其中v1只有一个 task_class 参数,新版本(主要基于Invoke)具有许多名称空间和解析器提示,以及与执行相关的选项(例如以前由 @hosts 和朋友)。

任意任务函数参数(即 def mytask(any, thing, at, all)

端口

这将获取自己的行项目,因为:任务现在必须 Context (普通调用)或 fabric.connection.Connection (结构)对象作为其第一个位置参数。与以前一样,函数签名的其余部分完全取决于用户,并将自动转换为CLI标志。

这就牺牲了v1的一小部分“快速DSL”,以换取更清晰、更易于理解/调试和更多用户可重写的API结构。

作为副作用,它减少了“功能模块”和“方法类”之间的区别;用户可以更容易地从“功能模块”开始,并在需求增长/变化时迁移到“方法类”。

通过导入爬行隐式生成任务树

移植/移除

名称空间构造现在更加明确;例如,在 fabfile.py 不再自动扫描并自动添加到任务树。

However, the root fabfile.py is automatically loaded (using Collection.from_module), preserving the simple/common case. See task-namespaces for details.

我们可以稍后恢复(以可选方式)导入的模块扫描,因为使用显式命名空间对象仍然允许用户控制结果树。

@hosts 用于确定给定任务使用的默认主机或主机列表

端口

恢复为 hosts 的参数 @task 。此外,它现在可以处理 fabric.connection.Connection 除了简单的主机字符串之外的kwargs。

@roles 用于确定给定任务使用的默认主机组目标列表

悬而未决的

看见 API组织 以了解有关整体“角色”概念的详细信息。当它回来时,这可能会紧随其后 @hosts 并成为一些 @task 争论。

@serial/@parallel/@runs_once

端口/待机 <https://github.com/pyinvoke/invoke/issues/63>`__

并行执行目前在API级别通过 fabric.group.Group 子类,如 fabric.group.ThreadingGroup ;但是,指定整个会话和/或任务并行运行(或免除并行运行)尚未解决。

这个问题需要在更高的级别上解决,而不仅仅是ssh目标,因此这将链接到一个调用级别的票据。

execute 用于从其他任务调用命名任务,同时尊重装饰器和其他执行机制(而不是简单地将它们作为函数调用)

Pending

这是重写中最重要的“缺少功能”之一;链接用于调用跟踪程序。

Task 用于编程创建任务的类(与使用某些函数对象和 @task 装饰者)

端口

虽然没有与v1共享许多实现细节,但现代结构(via invoke)公开了 Task 类,旁边是 Collection 允许完全编程创建任务树,不需要修饰器。

cli参数、选项和行为

将任务参数暴露为自定义冒号/逗号分隔的CLI参数,例如 fab mytask:posarg,kwarg=val

远离的

cli参数现在是合适的gnu/posix样式的长和短标志,包括将短标志放在一起、空格或等号来附加值、可选值等等。见 invoking-tasks .

任务定义名称直接镜像在命令行上,例如用于任务 def journald_logs() ,命令行参数为 fab journald_logs

远离的

任务名称现在从下划线转换为连字符。任务 def journald_logs() 现在计算为 fab journald-logs 在命令行上。

能够在一个命令行中调用多个任务,例如 fab task1 task2

端口

工作很棒!

python -m fabric as stand-in for fab

端口

移植于2.2。

-a/--no_agent 用于禁用自动ssh代理密钥选择

远离的

要永久禁用代理的使用,请设置配置值 connect_kwargs.allow_agentFalse ;要暂时禁用,请取消设置 SSH_AUTH_SOCK EV V.

-A/--forward-agent 用于启用代理转发到远程端

远离的

这个的config和kwarg版本被移植,但目前没有cli标志。通常,“可以在运行时用shell env变量设置配置值”子句有效,因此 may 不被移植,视情况而定。

--abort-on-prompts 将交互式提示转换为异常(有助于避免“挂起”会话)

远离的

请参见有关交互提示离开的注释 一般/概念 . 如果没有中间会话提示,则不需要此选项。

-c/--config 用于指定备用配置文件路径

端口

--config lives on, but the short flag is now -f (-c now determines which collection module name is sought by the task loader.)

--colorize-errors (和 env.colorize_errors )启用错误输出的ANSI着色

Pending

颜色工作还没有完成,这是可能丢失的部分之一。我们不确定它在v1中的使用频率,所以它可能不会再次出现,但一般来说,我们喜欢使用颜色作为额外的输出向量,所以…

-d/--display 用于显示给定命令的信息

端口

这是现在的标准 -h/--help ,并且可以在任意“方向”上给出: fab -h mytaskfab mytask -h .

-D/--disable-known-hosts 关闭Paramiko自动加载用户级别 known_hosts 文件夹

Pending

还没有预告,可能会。

-e/--eagerly-disconnect (和 env.eagerly_disconnect )它告诉执行系统在任务运行完成后立即断开与主机的连接。

端口/待机 <https://github.com/fabric/fabric/issues/1805>`__

已经没有显式连接缓存了,因此不必太急地断开连接。然而,调查和潜在的特征切换仍然悬而未决。

-f/--fabfile 选择备用FabFile位置

端口

现在分为 -c/--collection-r/--search-rootloading-collections .

-g/--gateway (和 env.gateway )用于选择全局ssh网关主机字符串

Pending

可以设置全局 gateway 通过一个环境变量配置选项,乍一看,这将消除对专用CLI选项的需求。但是,这种方法只允许设置字符串值,而字符串值只用于 ProxyCommand 风格网关,所以它 替换V1 --gateway (取了一个主机字符串并将其转换为 ProxyJump 样式网关。

因此,如果有足够多的用户注意到这一点,我们将考虑一个在很大程度上模仿v1行为的特性add:string成为 fabric.connection.Connection 然后结果对象被设置为 gateway .

--gss-auth/--gss-deleg/--gss-kex

远离的

这些似乎不够用,不值得移植,特别是因为它们落在了通常的伞下“帕拉米科级连接直通”所涵盖的 connect_kwargs 配置选项。(如有必要,可以通过shell环境变量在运行时进行设置,就像任何其他配置值一样。)

--hide/--show 用于全局调整输出显示

远离的

这可以通过配置系统和env vars进行配置。

-H/--hosts

端口

工作原理与之前基本相同-如果给定,则是每个主机执行一次任何给定任务的简写。

-i 对于ssh密钥文件名选择

端口

与v1的工作原理相同,包括多次提供构建要尝试的密钥列表的能力。

-I/--initial-password-prompt 用于请求初始执行前密码提示

端口

现在 --prompt-for-login-password--prompt-for-sudo-password--prompt-for-passphrase ,取决于您是使用前者填写密码还是使用密钥密码短语(或两者都填写)。

--initial-sudo-password-prompt 用于请求初始执行前的sudo密码提示

端口

这是现在 --prompt-for-sudo-password . 还有一口,但还是少了4个字符!

-k/--no-keys which prevents Paramiko's automatic loading of key files such as ~/.ssh/id_rsa

远离的

使用环境变量设置 connect_kwargs.look_for_keys 配置值到 False .

--keepalive 用于设置网络保持连接

Pending

还没有移植。

-l/--list 用于列出任务,以及 -F/--list-format 用于调整列表显示格式

端口

现在有了额外的JSON列表格式!顺便说一下,它取代了 -F short/--shortlist .

--linewise 用于逐行缓冲输出,而不是粗略地逐字节缓冲输出

远离的

这并不符合现代命令执行代码对世界的看法,所以它已经不复存在了。

-n/--connection-attempts 控制多次连接重试

Pending

还没有移植。

--no-pty 禁用自动节目类型分配 run

端口

现在是 -p/--pty 因为默认行为被切换。

--password/--sudo-password 用于指定登录/sudo密码值

远离的

首先,这通常不太安全,现在有许多其他的方法来设置相关的配置值,所以至少现在已经不存在了。

-P/--parallel 用于激活全局并行性

Pending

查看周围的注释 @parallel 在里面 任务功能和装饰 .

--port 设置默认ssh端口

远离的

我们的直觉说这最好留给配置系统的env var层,或者使用 port 克沃格 fabric.connection.Connection 然而,它可能会找到它的归路。

r/--reject-unknown-hosts 修改Paramiko已知主机行为

Pending

还没有移植。

-R/--roles 用于主机目标选择的全局列表

Pending

如下所述 API组织 ,角色列表仅部分适用于新的API,我们仍在摸索它们是否/如何在全局或CLI级别上工作。

--set key=value 用于设置 fabric.state.env 运行时的VARS

远离的

这在很大程度上被对shell环境变量的新支持所消除(只需做 INVOKE_KEY=value fab mytask 或者类似的方法),尽管设置配置值的cli标志方法很可能在稍后重新出现。

-s/--shell 覆盖默认Shell路径

远离的

为此,请使用配置系统。

--shortlist 用于简单/计算机友好的列表输出

端口

--list/--list-format -现在有了JSON格式。没有必要再发明轮子。

--skip-bad-hosts (和 env.skip_bad_hosts )绕过有问题的主机

Pending

还没有移植。

--skip-unknown-tasksenv.skip_unknown_tasks 用于在调用cli时自动跳过假任务名

远离的

对我们来说,这主要感觉像膨胀,可能需要对重实现进行一些重要的解析器更改,所以现在已经过时了。

--ssh-config-pathenv.ssh_config_path 用于选择ssh配置文件

端口

这是现在 -S/--ssh-config .

--system-known-hosts 触发整个系统的加载 known_hosts 文件夹

Pending 移除

这不太可能作为自己的cli标志返回,但它可能作为配置值返回。

-t/--timeout 控制连接超时

端口

现在是时候了 -t/--connect-timeout AS --timeout 在技术上是模棱两可的Re:Connect vs命令超时。

-T/--command-timeout

端口

在调用中实现并在 fab 在同一个名字下。

-u/--user 设置全局默认用户名

远离的

大多数情况下,配置(env vars for true runtime,或例如用户/项目级的配置文件,视情况而定)都应该用于此目的,但它可能会返回。

-w/--warn-only 切换警告与中止行为

端口

照原样移植,没有变化。

-x/--exclude-hosts (和 env.exclude_hosts )用于排除其他选定目标

Pending

尚未移植,正在等待对全局(vs手工实例化)连接/组选择进行深度重做。

-z/--pool-size 用于设置并行模式作业队列池大小

远离的

现在已经没有工作队列了,至少现在没有。不管用什么替代它(除了已经实现的线程模型),看起来都可能大不相同。

shell命令执行 (local /运行`/ sudo``)

一般

任何一方共享的行为 run/sudo ,或全部 run/sudo '''本地''。后面的部分按功能差异进行介绍。

local and run/sudo 具有非常不同的API和实现

远离的

所有命令执行现在都是统一的;所有三个函数(现在方法打开 fabric.connection.Connection 虽然,虽然 local 也可作为 invoke.run 单独使用)具有相同的底层协议和逻辑 Runner 类层次结构),只有低级细节,如流程创建和管道消耗不同。

例如,在v1中 local 要求您在显示和捕获子进程输出之间进行选择;现代 local 就像 run 同时做这两件事。

提示自动响应,通过 env.prompts 和/或 sudo 内部构件

端口

这个 env.prompts 功能已经大大扩展到 Watchers 可在任何(本地或远程)上操作!运行命令的输入和输出流。

此外, sudo 已经被重写以使用该框架;虽然仍然可以提供核心实现,但它不再做任何用户使用公共API不能自己做的事情。

fabric.context_managers.cd/lcd (和 prefix )允许已执行注释的范围变异

端口/待机 <https://github.com/fabric/fabric/issues/1752>`__

These are now methods on Context (Context.cd, Context.prefix) but need work in its subclass fabric.connection.Connection (quite possibly including recreating lcd) so that local vs remote state are separated.

fabric.context_managers.shell_env 它的具体表达 path (加) env.shell_envenv.pathenv.path_behavior ,用于修改远程环境变量(在本地,只需修改 os.environ

端口

上下文管理器是在任何范围内设置环境变量的唯一方法;在现代结构中,每个调用都可以控制子进程shell环境(直接在 fabric.connection.Connection.run 和兄弟姐妹通过 env 克瓦格 and 跨多个调用(通过静态或运行时操作配置系统)。

通过操作控制子流程输出和其他活动显示文本 fabric.state.output (directly or via fabric.context_managers.hide, show or quiet as well as the quiet kwarg to run/sudo 加上 utils.puts/fastprint

端口/待机 <https://github.com/pyinvoke/invoke/issues/15>`__

“输出级别”的核心概念已经不复存在,很可能在短期内被输出级别重新实现得很差的日志模块(stdlib或其他)所取代。

命令执行方法 run 保留一个 hide Kwarg控制复制到终端的子进程流,以及 echo Kwarg控制命令是否在执行前打印。所有这些都符合配置系统。

timeout 克沃格和 CommandTimeout 违反所述命令运行时超时时引发异常

端口

现在主要位于调用层,但适用于所有命令执行,无论是本地的还是远程的;请参阅 timeout 参数为 run 及其相关的配置值和CLI标志。

pty 克瓦格和 env.always_use_pty ,控制命令是在伪终端中运行还是直接调用

端口

这已被彻底报告(其行为经常得到改善),包括保存 pty 将配置值更新为 run.pty . 但是,一个主要的变化是PTY分配现在 False 默认而不是 True .

Fabric0.x和1.x已经改变了这个值;在Fabric1的长生命周期中,很明显默认值对所有用户甚至大多数用户都不起作用,因此我们选择将默认值返回到 False 因为它更干净,更不浪费。

combine_stderr (克瓦格和 env.combine_stderr )控制Paramiko是否将远程stdout和stderr编织到stdout流中

远离的

这并不十分有用,而且经常导致概念上的问题 pty (因为伪终端的性质总是将两个流结合在一起。)

我们建议真正需要合并两个流的用户,或者在命令中使用shell重定向,或者设置 pty=True .

warn_only 用于防止非零返回码自动中止的Kwarg

端口

现在只是 warn ,kwarg和config值。它继续默认为 False .

stdoutstderr 用于重新分配默认stdout/err镜像目标的Kwargs,否则将默认为相应的 sys 成员

端口

这些是现在 out_streamerr_stream 但除此之外,在性质上保持相似。它们也伴随着新的,事后看来相当明显。 in_stream .

capture_buffer_size 使用环形缓冲区存储捕获的stdout/stderr以限制总大小(&U)

Pending

现有的 Runner 实现使用常规列表来捕获缓冲区,但我们完全希望在某个时刻将其升级为环形缓冲区或类似的列表。

返回值是类似字符串的对象,具有 succeededreturn_code 洒在上面

端口

返回值不再是类似于字符串的半私有API,而是类型为完全成熟的常规对象 Result . 它们公开了所有与旧的“属性字符串”相同的信息,但真正不同的是它们本身并不假装是字符串。

但是,它们仍然表现为布尔值——只是反映出退出代码与零的关系,而不是是否存在任何stdout。

open_shell 用于获取交互式友好的远程shell会话 run 历史上不擅长)

端口

不仅是新版本的 run 有了很大的改进,能够处理至少和旧的一样好的交互会话 open_shell (如果您提供 pty=True ),但对于角落情况,也有一个直接端口: shell

run

shell / env.use_shell designating whether or not to wrap commands within an explicit call to e.g. /bin/sh -c "real command"; plus their attendant options like shell_escape

远离的

非``sudo``远程执行从来没有真正需要一个明确的shell包装器:在几乎所有情况下,远程ssh守护进程都将命令字符串交给连接用户的登录shell。因为包装在其他方面非常容易出错,并且需要令人沮丧的转义规则,所以我们在这个用例中放弃了它。

查看匹配的行项目 localsudo 因为他们的情况不同。(现在,因为他们都有相同的基础, fabric.connection.Connection.run 接受一个 shell 夸格-这跟它没什么关系。)

sudo

除非另有说明,所有常见的 run +`` sudo``参数/功能(例如 ptywarn_only 等)在上文的 run 下面是 sudo 具体的。

shell / env.use_shell designating whether or not to wrap commands within an explicit call to e.g. /bin/sh -c "real command"

Pending /已删除

见上文注释 run 有关作为一般策略的Shell包装的详细信息;不幸的是 sudo 由于命令字符串是如何传递给 sudo 程序。

我们希望升级 sudo 很快它就可以执行一个常见的最佳情况,不需要为您转义所需的shell包装;请参见“挂起”链接。

user 论证(和) env.sudo_user )允许通过调用 sudo -u <user> (而不是默认为根目录)

端口

这仍然在这里,而且还在叫 user .

group 控制sudo'd命令有效组的参数

Pending

这还没有预告。

local

有关新的 local . 下面是一些具体的附加内容。

shell Kwarg指定要问哪一个壳牌公司 subprocess.Popen 使用

端口

基本上和v1一样,尽管现在有一些情况 os.execve (或类似)用于代替 subprocess.Popen . 行为基本相同:没有Shell包装(就像在遗留的 run ,只需通知操作系统要运行的实际程序。

open_shell

正如主要列表中所指出的,这是现在 shell ,并且行为类似于 open_shell (如果有退出代码,则忽略;假定为PTY;依此类推)。它也有一些改进,比如返回值(与 run 但这仍然是一大进步 None )。

command 可选的kwarg,允许用特定的命令字符串和换行符预先填充输入流

远离的

如果需要,您应该尝试使用现代版本的 run ,它的交互能力与 shell 但是需要一个命令来执行。如果有人遗漏了它,我们有很小的机会在以后添加它(有几个角落的案例可能需要它)。

公用事业

错误处理通过 abortwarn

端口

旧的功能在“一切都是DSL”的方向上倾斜得太远,没有提供足够的价值来抵消它如何阻碍有经验的 Python 。

为了“引发异常”(一个有用的选项是invoke),这些函数已被删除 Exit )由于异常处理比周围的薄包装纸感觉更像是 Python 。 sys.exit 或者不得不 except SystemExit: 希望是一个 SystemExit 你自己的代码被提升了!

ANSI颜色助手 fabric.colors 允许用户在没有独立库的情况下轻松打印ANSI彩色文本

远离的

似乎没有必要复制出许多优秀的终端按摩库中的一个(如描述中所列的库)。 #101 )在重写中,我们没有。

这就是说,我们很有可能在将来出售这样一个库来提供内部颜色支持,在这一点上“烘焙”的颜色助手将再次很容易到达。

with char_buffered 用于强制本地流进行字符缓冲的上下文管理器

端口

这是现在 character_buffered .

docs.unwrap_tasks 用于从包装任务函数提取docstring

端口

V1需要在您的Sphinx构建管道中的某个位置使用特定于Fabric的‘UNWRAP_TASKS’帮助器函数;现在您只需启用新的 invocations.autodoc Sphinx迷你插件在您的扩展列表中;请参阅链接以了解详细信息。

network.normalizedenormalizeparse_host_string ,表面上是内部的,但有时由于处理主机字符串而暴露给用户

远离的

与其他与主机字符串相关的工具一样,这些工具已不复存在,而且毫无用处。 fabric.connection.Connection 现在是主要的API焦点,并且具有所有“主机字符串”组件的单独属性。

utils.indent 用于缩进/换行文本(不常用)

悬而未决的

尚未移植;理想情况下,我们只在invoke中提供第三方lib。

reboot 用于重新启动和重新连接到远程系统

远离的

没有为现代结构编写等效的函数;既然连接/客户机对象是显式的,就可以简单地用相同的参数(如果不想手动调用类似于 time.sleep

如果有足够的需求,它返回的可能性很小;如果有,它可能是一个更一般的重新连接相关的 fabric.connection.Connection 方法,其中用户负责通过 sudo 他们自己。

require 确保 env 设置值,注意它们可以 provided_by= 安装任务列表

远离的

这还没有被移植,部分原因是维护人员从未自己使用过它,而且不太可能直接重新实现。但是,其核心用例“需要某些数据可用于运行给定任务”可能会在即将到来的依赖关系框架内返回。

prompt for prompting the user & storing the entered data (optionally with validation) directly into env

远离的

喜欢 require ,这似乎是一个使用较少的功能(特别是与它的兄弟相比 confirm )没有预告。如果它还了,很可能是通过 invocations ,在哪 confirm 结束了。

网络

env.gateway 用于设置ssh跳转网关

端口

这是现在 gateway 克瓦格 fabric.connection.Connection ,以及——对于新支持的 ProxyJump 样式网关,可以无限嵌套!--应该是另一个 fabric.connection.Connection 对象而不是主机字符串。

(您可以指定运行时,非ssh配置驱动 ProxyCommand -将字符串样式设置为 gateway 而Kwarg,就好像一个普通人 ProxyCommand

ssh_config 驱动的 ProxyCommand 支持

端口

这和v1一样继续工作。

with remote_tunnel(...): 端口转发

端口

这是现在 fabric.connection.Connection.forward_local 因为它已经习惯了 向前地地方的 端口到远程端。(新添加的是逻辑反转, fabric.connection.Connection.forward_remote

NetworkError 在某些网络相关错误上引发

远离的

在v1中,这只是一个(部分实现的)从原来的“任何错误都只有sys.exit!”行为。现代织物明显更为友好;会引起 NetworkError 在v1中,现在只是成为真正的底层异常,通常来自于paramiko或stdlib。

env.keepalive 用于设置网络保持值

Pending

还没有移植。

env.connection_attempts 用于设置连接重试

Pending

还没有移植。

env.timeout 用于控制连接(有时还包括命令执行)超时

端口

现在可以通过配置系统(AS)控制连接超时 timeouts.connect )和一个直接的典狱长 fabric.connection.Connection 。命令执行超时现在是它自己的设置, timeouts.command 以及一个 timeout Kwarg to run 还有朋友。

认证

备注

一些 env v1的钥匙只是通过帕拉米科的 SSHClient.connect 方法。现代结构通过 connect_kwargs configuration 子树,下表将经常引用这种方法。

env.key_filename

端口

使用 connect_kwargs .

env.password

端口

使用 connect_kwargs .

还要注意,这用于执行双负载连接 and sudo密码;后者现在位于 sudo.password 设置。

env.gss_(auth|deleg|kex)

端口

使用 connect_kwargs .

env.key ,包含私钥数据的字符串或文件对象,其特定类型是自动确定并实例化的,以用作 pkey 连接克沃格

远离的

这已被删除,因为对Paramiko级别的API进行了不必要的(易出错)模糊处理;用户应该已经知道他们正在处理的是哪种类型的密钥,并实例化一个 PKey 子类自身,将结果放入 connect_kwargs.pkey .

env.no_agent ,这是对Paramiko的重命名/反转 allow_agent 连接克沃格

端口

将此设置为的用户 True 现在应该简单设置 connect_kwargs.allow_agentFalse 相反。

env.no_keys ,类似于 no_agent 只不过是 look_for_keys 连接克沃格

端口

使用 connect_kwargs.look_for_keys 相反(设置为 False 禁用Paramiko的默认密钥查找行为。)

env.passwords (和 env.sudo_passwords )将连接/sudo密码存储在主机字符串键控的dict中

端口/待机 <https://github.com/fabric/fabric/issues/4>`__

fabric.connection.Connection 对象可以配置为自己的 connect_kwargs 在实例化时给出,已经允许每个主机的密码配置。

但是,我们希望用户可以使用一种更简单的方法来设置将变为隐式的配置值。 fabric.connection.Connection 对象自动;此类功能仍处于挂起状态。

配置 IdentityFile 在某人的 ssh_config

端口

还有一些新的荣誉 ssh_config 设置;见 ssh-config .

文件传输

以下功能分解适用于 put 和/或 get v1的“操作”功能。

传输本地和远程用户拥有的单个文件

端口

任何方向的基本文件传输都有效,并提供 fabric.connection.Connection.get /` fabric.connection.connection.put`(虽然代码分为单独的责任类, fabric.transfer.Transfer

与v1相比,这些方法的签名已被清除,尽管它们的位置参数本质 (get(remote, local)put(local, remote) 保持不变。

省略隐式“相对于本地上下文”行为的“Destination”参数(例如 put("local.txt") 隐式上载到远程 $HOME/local.txt 。)

端口

您可能仍然应该是显式的,因为这是Python。

使用任一文件路径 or 传输操作任一侧的类似文件的对象(例如上载 StringIO 而不是磁盘上的文件)

端口

这是一个非常有用且非常简单的技巧。

在目的地保留源文件模式(例如,确保将由目的地的umask删除的可执行位被重新添加)。

端口

这不仅是预告,而且现在是默认行为。如果需要,可以通过Kwarg禁用。

捆扎 sudo 作为文件传输的一部分的操作

远离的

这是v1中最令人讨厌的部分之一,而且从来没有真正做过用户在后续呼叫中不能做的事情。 sudo ,所以我们选择不移植。

如果有足够多的用户对它的损失感到担忧,我们 may 重新考虑一下,但是如果我们这样做,我们将认真关注简化和/或不涉及中间文件的方法。

递归多文件传输(例如 put(a_directory) 上载整个目录及其所有内容)

远离的

这是 另一个 v1最麻烦的部分之一,随着时间的推移,很明显它的维护负担远远超过了这一事实:它的重新设计很糟糕。 rsync 和/或使用归档文件工具,如Ye Olde tar +‘gZip’。

有关一种可能的解决方法,请参阅 rsync 中的函数 patchwork

远程文件路径代字号扩展

远离的

这种行为最终是不必要的(为了同样的结果,你可以简单地去掉波浪号),而且它本身也有一些有害的错误,所以它已经消失了。

以远程目标的某个方面命名下载的文件,以避免在多服务器操作期间覆盖

端口

添加回(到 fabric.transfer.Transfer.get )在Fabric 2.6中。

配置

总的来说,配置已经大大改善了 fabricrc 文件;大多数配置逻辑来自 Invoke's configuration system 它提供了一个完整的配置层次结构(在代码配置、多个配置文件位置、环境变量、CLI标志等)和多个文件格式。在现代结构中,结构1中的几乎所有配置通道都变成了配置层次结构中最适合您需要的任何部分的操作。

结构的现代版本只对invoke的设置进行细微的修改(或参数化);请参见 our locally-specific config doc page 有关详细信息。

备注

确保在本文档的其他地方查找任何给定v1的详细信息 env 设置,因为许多已从配置系统外移到对象或方法关键字参数中。

修改 fabric.(api.)env 直接地

端口

要真正实现全局范围的配置更改,请使用配置文件、任务集合级别的配置数据或调用shell的环境变量。

使本地范围 fabric.env 通过改变 with settings(...): 或其装饰等效物, @with_settings

移植/未决

周围的大多数用例 settings 现在服务的事实是 fabric.connection.Connection 对象保持每主机/连接状态-切换隐式全局上下文的模式是一个设计反模式,现在已不复存在。

剩下的这些用例已经变成了 fabric.connection.Connection (或其父类),或具有挂起的此类方法。

ssh配置文件加载(默认关闭,仅限于 ~/.ssh/config 除非配置为不同的单一路径)

端口

大大改进了:ssh配置文件加载是 on 默认情况下 can be changed )和OpenSSH一样,加载和合并了多个源,此外还有更多;请参见 ssh-config .

此外,我们还为一些 ssh_config 被v1忽略的指令,例如 ConnectTimeoutProxyCommand 我们打算支持 ssh_config 尽可能合理。

contrib

老年人 contrib 模块表示“最佳实践”函数,这些函数本身不需要其他结构的核心支持,而是使用用户可用的相同原语构建的。

在现代结构中,这种责任已经从核心库转移到其他独立的库中,这些库具有自己的身份和发布过程,通常是 invocations (不使用ssh的面向本地的代码)或 patchwork (主要是面向远程的代码,尽管没有显式地处理连接两端的任何事情都可以在本地正常工作。)

这些库仍然在进行中,尤其是因为我们仍然需要找出弥合它们之间差距的最佳方法(因为许多操作本质上不是本地的或远程的,但可以在任何一端工作)。

由于根据定义,它们是建立在所有用户可用的核心API之上的,因此它们目前的开发重点较少;用户总是可以实现自己的版本,而不会牺牲太多(对于核心库来说,这是不太现实的事情)。一旦核心API稳定下来,我们希望在管理这些集合方面投入更多的工作。

每个单独块的详细信息 fabric.contrib 在下表中:

console.confirm 为了方便返回bool确认提示

端口

搬到 invocations.console.confirm ,带有细微的签名调整。

django.* ,支持与本地Django项目的集成:导入和使用Django模型和其他代码

远离的

我们甚至不确定这本书写完十年后是否有用,因为从那以后,姜戈肯定发生了很大的变化。如果你正在阅读,并且对这件事的消失感到悲伤,请告诉我们!

files.* (例如) existsappendcontains etc)用于查询和修改远程文件

移植/未决

这个文件中许多更有用的函数已经移植到 patchwork.files 但基本上仍处于α状态。

其他,如 is_link, comment/uncomment 等等,还没有预告。如果是的话,很可能会在同一个地方结束。

project.rsync_project 用于远程同步整个主机项目

端口

现在 patchwork.transfers.rsync 做了一些修改。

project.rsync_project 用于通过存档文件和SCP上载主机项目

远离的

这似乎不值得移植;“远程复制本地位”的总体模式已经可以说是一个反模式(vs可重复部署工件,或者至少远程签出VCS标签),而且如果有人走这条路,rsync是一个更明智的选择。

fabric.env 参考

v1中的许多/大多数成员 fabric.env 在以上每个主题部分都有介绍;任何 not 在别处,住在这里。所有这些都明确指出为 env.<name> 以便在浏览器或查看器中搜索。

少数env变量从未公开记录,因此是隐式私有的;这些变量在这里没有表示。

env.abort_exception 用于设置用于中止的异常

远离的

当一个概念消失后中止,只需向最终用户提出任何看起来最合理的异常,或使用 Exit . 也见 公用事业 .

env.all_hostsenv.tasks 列出执行目标

端口/待机 <https://github.com/pyinvoke/invoke/issues/443>`__

织物的 Executor 子类存储对所有CLI分析结果的引用(包括 --hosts ,请求的任务及其参数等),目的是让用户能够访问这些信息。

但是,该API的详细信息(例如,通过任务的 Context /` fabric.connection.connection`)仍在不断变化。

env.command 注意到当前正在执行的任务名(事后看来,用词不当…)

端口/待机 <https://github.com/pyinvoke/invoke/issues/443>`__

参见注释 env.all_hosts 上面同样适用于这里:用户对cli解析结果的可见性。

env.command_prefixes for visibility into (arguably also mutation of) the shell command prefixes to be applied to run/sudo

端口

这是现在 command_prefixes .

env.cwd 注意当前预期工作目录

端口

这是现在 command_cwds (一个列表,而不是单个字符串,以便更正确地建模预期的ContextManager驱动的用例。)

请注意,尚未设置此数据的远程和本地上下文;请参阅有关 with cd 在下面 shell命令执行 (local /运行`/ sudo``) .

env.dedupe_hosts 控制合并主机列表中的重复主机是否进行重复数据消除

Pending

尚未移植,可能会作为角色/主机列表大修的一部分处理。

env.echo_stdin (未记录)用于关闭标准输入的默认回显

端口

现在是下的配置选项 run 树,有很多相同的行为。

env.local_user 以只读方式访问发现的本地用户名

远离的

我们不完全确定为什么v1认为这值得在配置中缓存;如果您需要此信息,只需导入并调用 fabric.util.get_local_user .

env.output_prefix 确定是否显示逐行主机字符串前缀

Pending

区分并行stdout/err仍然是一项正在进行的工作;我们可能最终会逐个行地重用日志记录和前缀(最好是通过实际日志记录),或者我们可能会尝试使用更干净的方法,例如按连接流式传输到日志文件。

env.prompts 控制提示自动响应

端口

提示自动响应现在公开实现为 StreamWatcherResponder 类层次结构,其实例可以移交给 run 通过Kwarg或全局存储在配置中 run.watchers .

env.real_fabfile 存储由CLI机器加载的只读fabfile路径

端口

加载任务 Collection 存储在两个顶层 Program 对象以及 Executor 调用任务;以及 Collection 有一个 loaded_from 具有此信息的属性。

env.remote_interrupt 控制中断的方式(即本地 KeyboardInterrupt 被捕获、转发或其他

移植/移除

invoke的中断捕获行为当前为“总是将中断字符发送到子进程并继续”,允许子进程处理 ^C 但是,它们需要这样做,这是对织物1的改进,大致相当于设置 env.remote_interrupt = True .

允许用户通过config更改此行为还没有实现,也可能没有实现,这取决于是否有人需要它——出于向后兼容的原因,它被添加为v1中的一个选项。

技术上也可以通过子类化和重写来更改中断行为。 invoke.runners.Runner.send_interrupt .

env.rolesenv.roledefsenv.effective_roles 控制/公开哪些角色可用或当前正在扮演

Pending

如中所述 API组织 ,作为一个概念的角色被移植到 fabric.group.Group 但是没有中央票据交换所来存放它们。

我们 may 将其永远委托给userland,但似乎是一个常见的最佳实践选项(例如创建 Groups 从某个配置子树并将其存储为 Context 属性)将出现在2.x的早期。

env.ok_ret_codes 用于覆盖子进程命令的默认“0好,非0坏”错误检测

Pending

还没有移植,但应该包括一些可能的小更新 invoke.runners.Runner.generate_resultResult .

env.sudo_prefix 确定创建时使用的sudo二进制名称及其标志 sudo 命令字符串

Pending

sudo命令构造目前只查看配置中的sudo提示。

env.sudo_prompt 用于设置传递给的提示字符串 sudo (然后期望以配置的密码自动回复)

端口

现在是 sudo.prompt 在配置系统中。

env.use_exceptions_for 注意哪些操作会引发异常

远离的

与其他功能一样,织物1的“直接跳到 sys.exit “设计反模式,这已经不复存在了——现代结构不会隐藏用户级代码的任何异常。

env.use_ssh_config 默认启用关闭ssh配置加载

端口

SSH配置加载现在默认处于打开状态,但仍有一个选项可以禁用它。看见 配置 想要更多。

env.version 显示当前结构版本号

远离的

只是 import fabric 参考文献 fabric.__version__ (字符串)或 fabric.__version_info__ (元组)

示例升级过程

本节将介绍如何升级一个小型但不平凡的Fabric1FabFile以使用现代Fabric。它并不意味着详尽,只是说明性的;有关如何升级单个功能或概念的完整列表,请参见 升级详细信息 .

原始FabFile示例

以下是Fabric1最终教程片段的副本(稍作修改以符合“现代”Fabric1最佳实践),我们将使用它作为升级的测试用例:

from fabric.api import abort, env, local, run, settings, task
from fabric.contrib.console import confirm

env.hosts = ["my-server"]

@task
def test():
    with settings(warn_only=True):
        result = local("./manage.py test my_app", capture=True)
    if result.failed and not confirm("Tests failed. Continue anyway?"):
        abort("Aborting at user request.")

@task
def commit():
    local("git add -p && git commit")

@task
def push():
    local("git push")

@task
def prepare_deploy():
    test()
    commit()
    push()

@task
def deploy():
    code_dir = "/srv/django/myproject"
    with settings(warn_only=True):
        if run("test -d {}".format(code_dir)).failed:
            cmd = "git clone user@vcshost:/path/to/repo/.git {}"
            run(cmd.format(code_dir))
    with cd(code_dir):
        run("git pull")
        run("touch app.wsgi")

我们将直接把它移植,这意味着结果仍然是 fabfile.py 不过,我们要注意的是,以一种更面向库的方式编写代码——即使函数没有被包装在 @task -可以使测试和重用代码更容易。

进口

在现代结构中,由于强调对象方法而不是全局函数,我们不需要导入几乎相同的函数。我们只需要以下内容:

  • Exit 更友好的请求方式 sys.exit

  • @task ,和以前一样,但来自invoke,因为它不特定于ssh;

  • confirm 它现在来自调用库(也不是特定于ssh;尽管调用是 fabric.contrib (不再存在);

from fabric import task
from invoke import Exit
from invocations.console import confirm

主机列表

预定义的概念 global 主机列表已不复存在;目前没有直接替代方案。通常,用户可以设置自己的执行上下文,创建显式 fabric.connection.Connection 和/或 fabric.group.Group 对象;核心Fabric正在构建其上的便利助手,但“创建您自己的连接”将始终在那里作为后盾。

说到方便助手:的大部分功能 fab --hosts@hosts 已经被移植过去--前者直接(请参见 --hosts ),后者作为一种 @task 关键字参数。因此,目前我们的例子将是将全球 env.hosts 转换为轻量级的模块级别变量声明,以便在后续调用 @task **

my_hosts = ["my-server"]

备注

这是一个正在积极发展的领域,欢迎反馈。

测试任务

fabfile中的第一个任务使用了API的良好传播。我们将在这里概述这些更改(不过,所有细节都在 升级详细信息 ):

  • 将函数声明为任务几乎与以前相同:使用 @task 装饰符(在现代织物中,它比它的前身可以接受更多可选的关键字参数,包括一些取代了V1的一些S装饰符)。

  • @task -包装函数现在必须采用显式的初始上下文参数,其值将是 fabric.connection.Connection 对象在运行时。

  • 使用 with settings(warn_only=True) 可以用一个简单的木匠来代替 local 打电话。

  • local 调用现在是对 fabric.connection.Connectionfabric.connection.Connection.local .

  • capture 不再是一个有用的论点;我们现在可以在本地或远程同时捕获和显示。如果你不是真的 want 在运行时镜像其stdout/err的本地子进程,您可以简单地说 hide=True (或 hide="stdout" 或其他)

  • 结果对象在不同版本之间非常相似;现代结构的结果不再假装是“be”字符串,而是更像布尔值,如果命令干净地退出,则表现为真实,否则则为虚假。就所展示的属性而言,大多数相同的信息都是可用的,而且更多。

  • abort 不见了;你应该使用你认为合适的例外,或者 Exit 对于一个 sys.exit 当量。(或者只是打电话 sys.exit 如果您不想问任何问题,请立即退出,即使是我们的CLI机器也不会接触。)

结果:

@task
def test(c):
    result = c.local("./manage.py test my_app", warn=True)
    if not result and not confirm("Tests failed. Continue anyway?"):
        raise Exit("Aborting at user request.")

其他简单任务

接下来的两个任务是简单的一行程序,您已经看到了什么取代了全球 local 功能:

@task
def commit(c):
    c.local("git add -p && git commit")

@task
def push(c):
    c.local("git push")

从其他任务调用任务

这是另一个在调用级别处于不断变化中的领域,但是现在,我们可以简单地将其他任务作为函数调用,就像在v1中所做的那样。主要区别在于,我们希望传递上下文对象以保留配置上下文(如加载的配置文件或CLI标志)::

@task
def prepare_deploy(c):
    test(c)
    commit(c)
    push(c)

实际远程步骤

请注意,到目前为止,还没有真正与织物有关的东西发挥作用。- fabric.connection.Connection.local 只是重新绑定 Context.run ,调用的本地子进程执行方法。现在我们进入实际的部署步骤,它调用 fabric.connection.Connection.run 相反,远程执行(在 fabric.connection.Connection 已绑定到)。

with cd is not fully implemented for the remote side of things, but we expect it will be soon. For now we fall back to command chaining with &&. And, notably, now that we care about selecting host targets, we refer to our earlier definition of a default host list -- my_hosts -- when declaring the default host list for this task.

@task(hosts=my_hosts)
def deploy(c):
    code_dir = "/srv/django/myproject"
    if not c.run("test -d {}".format(code_dir), warn=True):
        cmd = "git clone user@vcshost:/path/to/repo/.git {}"
        c.run(cmd.format(code_dir))
    c.run("cd {} && git pull".format(code_dir))
    c.run("cd {} && touch app.wsgi".format(code_dir))

整件事

现在我们有了整个升级后的FabFile,它将与现代 Fabric 一起使用:

from invoke import Exit
from invocations.console import confirm

from fabric import task

my_hosts = ["my-server"]

@task
def test(c):
    result = c.local("./manage.py test my_app", warn=True)
    if not result and not confirm("Tests failed. Continue anyway?"):
        raise Exit("Aborting at user request.")

@task
def commit(c):
    c.local("git add -p && git commit")

@task
def push(c):
    c.local("git push")

@task
def prepare_deploy(c):
    test(c)
    commit(c)
    push(c)

@task(hosts=my_hosts)
def deploy(c):
    code_dir = "/srv/django/myproject"
    if not c.run("test -d {}".format(code_dir), warn=True):
        cmd = "git clone user@vcshost:/path/to/repo/.git {}"
        c.run(cmd.format(code_dir))
    c.run("cd {} && git pull".format(code_dir))
    c.run("cd {} && touch app.wsgi".format(code_dir))