4

我有以下 fabfile.py:

from fabric.api import env, run

host1 = '192.168.200.181'
host2 = '192.168.200.182'
host3 = '192.168.200.183'

env.hosts = [host1, host2, host3]

def df_h():
    run("df -h | grep sda3")

我得到以下输出:

[192.168.200.181] run: df -h | grep sda3
[192.168.200.181] out: /dev/sda3             365G  180G  185G  50% /usr/local/nwe
[192.168.200.183] run: df -h | grep sda3
[192.168.200.183] out: /dev/sda3             365G   41G  324G  12% /usr/local/nwe
[192.168.200.182] run: df -h | grep sda3
[192.168.200.182] out: /dev/sda3             365G   87G  279G  24% /usr/local/nwe

Done.
Disconnecting from 192.168.200.182... done.
Disconnecting from 192.168.200.181... done.
Disconnecting from 192.168.200.183... done.

请注意,执行顺序与 env.hosts 规范不同。

为什么它会这样工作?有没有办法使执行顺序与 env.hosts 列表中指定的相同?

4

2 回答 2

5

不保留顺序的确切原因是env.hosts可以指定要操作的主机的三个“级别”——env.hosts、命令行和每个函数——它们被合并在一起。在fabric/main.py309 行,您可以看到他们使用该set()类型来删除三个可能的主机列表中的重复项。由于set()没有顺序,主机将作为“随机”顺序的列表返回。

这是方法有一个很好的理由。这是从列表中删除重复项的一种非常有效的机制,对于结构来说,顺序无关紧要很重要。您要求fabric 在各种主机上执行一系列完全并行的原子操作。由于并行、原子动作的本质,顺序不会影响动作成功执行的能力。如果订单确实很重要,那么就需要采用不同的策略,并且面料将不再是完成这项工作的正确工具。

也就是说,是否有特殊原因需要您按顺序执行这些操作?也许如果您遇到某种执行顺序导致的问题,我们可以帮助您解决。

于 2009-12-24T05:10:10.903 回答
1

只是为了更新,最新的 Fabric 1.1+(甚至认为 1.0)现在以保留顺序的方式进行重复数据删除。所以现在这应该不是问题。

于 2011-07-07T02:02:47.387 回答