2009-12-24 13 views
11

यह मेरे previous question से संबंधित है, लेकिन एक अलग है।फैब्रिक env.hosts सूची में ऑफलाइन होस्ट को अनदेखा कैसे करें?

मैं निम्नलिखित fabfile है:

from fabric.api import * 

host1 = '192.168.200.181' 
offline_host2 = '192.168.200.199' 
host3 = '192.168.200.183' 

env.hosts = [host1, offline_host2, host3] 
env.warn_only = True 

def df_h(): 
    with settings(warn_only=True): 
     run("df -h | grep sda3") 

और उत्पादन होता है: निष्पादन

[192.168.200.199] run: df -h | grep sda3 

Fatal error: Low level socket error connecting to host 192.168.200.199: No route to host 

Aborting. 

बाद ऑफ़लाइन सर्वर मारता है, यह परवाह किए बिना env में अन्य सर्वर के तुरंत रोकता है। मेजबान सूची।

मैंने env सेटिंग "warn_only = True" का उपयोग किया है, लेकिन शायद मैं इसे अनुचित तरीके से उपयोग कर रहा हूं।

मैं इस व्यवहार को कैसे संशोधित कर सकता हूं ताकि यह केवल त्रुटि को प्रिंट करेगा और निष्पादन जारी रखे?

उत्तर

15
Fabric documentation on warn_only के अनुसार

,

env.warn_only "निर्दिष्ट करती है या नहीं, चेतावनी देने के लिए, बीच में बंद करें के बजाय, जब run/sudo/local मुठभेड़ त्रुटि की स्थिति।

इस में मदद नहीं करेगा एक सर्वर का मामला नीचे है, क्योंकि run/sudo/local निष्पादित करने से पहले एसएसएच प्रयास के दौरान विफलता होती है।

एक समाधान यह जांचने के लिए एक फ़ंक्शन बनाना होगा कि प्रत्येक सर्वर आपके कार्यों को निष्पादित करने से पहले है या नहीं। नीचे वह कोड है जिसका मैंने उपयोग किया था।

from __future__ import with_statement 
from paramiko import Transport 
from socket import getdefaulttimeout, setdefaulttimeout 
from fabric.api import run, cd, env, roles 


roledefs = { 
    'greece': [ 
     'alpha', 
     'beta' 
    ], 
    'arabia': [ 
     'kha', 
     'saad' 
    ] 
} 

env.roledefs = roledefs 


def if_host_offline_ignore(fn): 
    def wrapped(): 
     original_timeout = getdefaulttimeout() 
     setdefaulttimeout(3) 
     try: 
      Transport((env.host, int(env.port))) 
      return fn() 
     except: 
      print "The following host appears to be offline: " + env.host 
     setdefaulttimeout(original_timeout) 
    return wrapped 


@roles('greece') 
@if_host_offline_ignore 
def hello_greece(): 
    with cd("/tmp"): 
     run("touch hello_greece") 


@roles('arabia') 
@if_host_offline_ignore 
def hello_arabia(): 
    with cd("/tmp"): 
     run("touch hello_arabia") 

यह आप एक से अधिक मेजबान और भूमिका है जब विशेष रूप से उपयोगी है:

from __future__ import print_function 
from fabric.api import run, sudo, local, env 
import paramiko 
import socket 

host1 = '192.168.200.181' 
offline_host2 = '192.168.200.199' 
host3 = '192.168.200.183' 

env.hosts = [host1, offline_host2, host3] 

def df_h(): 
    if _is_host_up(env.host, int(env.port)) is True: 
     run("df -h | grep sda1") 


def _is_host_up(host, port): 
    # Set the timeout 
    original_timeout = socket.getdefaulttimeout() 
    new_timeout = 3 
    socket.setdefaulttimeout(new_timeout) 
    host_status = False 
    try: 
     transport = paramiko.Transport((host, port)) 
     host_status = True 
    except: 
     print('***Warning*** Host {host} on port {port} is down.'.format(
      host=host, port=port) 
     ) 
    socket.setdefaulttimeout(original_timeout) 
    return host_status 
+1

मैं यह करने के लिए एक समान तरीके से उपयोग किया है, लेकिन बहुत भोली - मैं उपप्रक्रिया मॉड्यूल के साथ पिंग कमांड लिपटे -_- " मैं निश्चित रूप से मॉड्यूल आप का उपयोग किया है में और अधिक ध्यान देना चाहिए धन्यवाद, आदमी –

+0

@ jevonearth का जवाब।। --skip-बुरा-मेजबान झंडा या env.skip_bad_hosts = समारोह में यह सच है का उपयोग करके ऐसा करने का कपड़ा> = v1.4 तरह से पता चलता है। – sreenivas

1

आप इसे अनुचित तरीके से उपयोग नहीं कर रहे हैं। आप कमांड लाइन पर केवल --warn-only=true प्रदान कर सकते हैं। It's the documented method suggested by the development team.

+1

पैरामीटर "-वर्न-केवल" होना चाहिए। हालांकि, "fab --warn-only df_h" चलाएं एक ही त्रुटि संदेश आउटपुट करता है। ऐसा लगता है कि कनेक्शन विफलता "चेतावनी_ऑनली" सेटिंग द्वारा कवर नहीं है। –

1

मैथ्यू के जवाब के आधार पर, मैं एक डेकोरेटर कि सिर्फ इतना है कि पूरा करता है के साथ आया था।

19

संस्करण 1.4 कपड़ा एक --skip-bad-hosts विकल्प कमांड लाइन से, या अपने फैब फ़ाइल में चर सेट करके सेट किया जा सकता है कि के रूप में। विकल्प के लिए

env.skip_bad_hosts = True 

प्रलेखन यहाँ है: http://docs.fabfile.org/en/latest/usage/fab.html#cmdoption--skip-bad-hosts

मत भूलना स्पष्ट रूप से भी टाइमआउट मान सेट करने के लिए।

+1

इस उत्तर कपड़े> = v1.4 के लिए सही एक है और होने की जरूरत है upvoted –

संबंधित मुद्दे