请在下面找到我的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')
答案 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
,您应该没问题。