2016-05-15 3 views
1

下記の私のfabfile.pyコンテンツを見つけてください。 env.hostsのリストを変更して、自分で確認したいかもしれません。fabric.apiループでスタックが実行される

chk_ *メソッドへの直接呼び出しは実行されますが、意図しないホストに対しても実行されます。 chk_kafkaは、動物園のノードグループに対しても実行されます。

何か助けていただければ幸いです。私に耐えてくれてありがとう。

#!/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)コマンドラインオプションで設定します。あなたの設定では、デコレータを使って特定の役割のホストでmostsタスクを実行しているので、env.hostsを完全に終了させるのが最も賢明です。

あなたのソリューションが意図した通りに正確に動作するかどうかはわかりません。 @runs_onceを実行するとstatusタスクはfab実行ごとに1回だけ実行されます。つまり、1台のマシンで1回実行してから、複数のタスクを複数回起動するのではなく、1台のマシンで実行されます。私はで与えられた役割にかかわらず、env.hostsに記載されているすべてのマシンで他のタスクが実行されることを期待しています。

TL; DR:env.hostsを削除し、@runs_oncestatusタスクに保存してください。正常であるはずです。

関連する問題