fabric.api执行卡在循环中

时间:2016-05-15 08:22:56

标签: python fabric

请在下面找到我的fabfile.py内容。您可能希望更改env.hosts列表以自行检查。

请注意,直接调用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')

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

我不确定您的解决方案是否完全符合预期。 @runs_once将导致status任务仅在fab运行时执行一次,这实际上意味着它将仅在一台计算机上运行,​​无论哪一台,而不是每台计算机运行一次,随后多次触发chk_*任务。我希望其他任务仍然可以在env.hosts中提到的所有计算机上运行,​​无论通过@roles给出的角色如何。

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