我有以下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列表中指定的相同?
答案 0 :(得分:5)
订单未从env.hosts
保留的确切原因是,可以指定要运行的主机的三个“级别” - env.hosts,命令行和每个功能 - 合并在一起。在line 309上的fabric/main.py
,您可以看到他们使用set()
类型删除三个可能的主机列表中的重复项。由于set()
没有订单,因此主机将以“随机”顺序作为列表返回。
这是方法的一个很好的理由。这是从列表中删除重复项的非常有效的机制,对于结构来说,顺序无关紧要。您要求fabric在各种主机上执行一系列完全并行的原子操作。根据并行原子动作的本质,顺序不会影响动作成功执行的能力。如果订单 很重要,那么就需要采用不同的策略,并且结构将不再是该工作的正确工具。
那就是说,您是否需要按顺序进行这些操作?也许如果你遇到某种由执行命令导致的问题,我们可以帮助你解决这个问题。
答案 1 :(得分:1)
刚刚更新,最新的Fabric 1.1+(甚至是1.0)重复数据删除现在保留顺序。所以现在这应该是一个非问题。