2016-05-15 56 views
1

请在下面找到我的fabfile.py内容。您可能想要更改env.hosts列表来检查自己。fabric.api执行卡在循环中

请注意,直接调用chk_ *方法会得到执行,但是也可以针对无意的主机执行,例如, chk_kafka也针对zookeeper组的节点执行。

任何帮助表示赞赏。感谢您的支持。

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

""" 
    auto ssh 
""" 
import os 
from fabric.colors import * 
from fabric.api import * 
from fabric.context_managers import * 
from fabric.contrib.console import confirm 

env.user = 'centos' 
env.password = 'centos' 

env.hosts = [ 
       '10.41.121.78', 
       '10.41.121.79', 
       '10.41.121.80', 
       '10.41.121.81', 
       '10.41.121.82', 
       '10.41.121.83', 
       '10.41.121.84', 
       '10.41.121.85' 
      ] 

clusters = env.hosts 

env.hostnames = dict([h, 'gt-%d' % (i + 1)] for i, h in enumerate(clusters)) 

env.roledefs = { 
    'clusters' : clusters, 
    'kafka' : clusters[0:5], 
    'zookeeper' : clusters[5:8] 
} 

@task 
def status(op=None): 
    if op=='zookeeper': 
     execute(chk_zk) 
    elif op == 'kafka': 
     execute(chk_kafka) 
    else: 
     execute(chk_all) 

@roles('zookeeper') 
def chk_zk(): 
    run('jps') 

@roles('kafka') 
def chk_kafka(): 
    run('jps') 

@roles('clusters') 
def chk_all(): 
    run('jps') 

回答

1

将@runs_once注释添加到方法'status'中为我解决了问题。

0

问题是您正在明确设置env.hosts。这是Fabric将执行任务的主机列表。通常,如果您想选择要执行的特定主机,它将通过-H--hosts)命令行选项进行设置。在你的设置中,最好将env.hosts完全取出,因为你通过@roles装饰器在特定角色的主机上执行多数任务。

我不确定您的解决方案是否按预期工作。 @runs_once将导致status任务仅在每个fab运行中执行一次,这意味着它只能在一台机器上运行,而不是每台机器运行一次,随后多次触发chk_*任务。我希望其他任务仍然可以在env.hosts中提到的所有机器上运行,而不管通过@roles给出的角色如何。

TL; DR:删除env.hosts并在status任务中保留@runs_once,您应该没问题。