<p>根据<a href="http://docs.fabfile.org/0.9.0/usage/env.html#warn-only" rel="noreferrer">Fabric documentation on warn_only</a></p>
<blockquote>
<p><code>env.warn_only</code> "specifies whether or not to warn, instead of abort, when <code>run</code>/<code>sudo</code>/<code>local</code> encounter error conditions.</p>
</blockquote>
<p>在服务器关闭的情况下,这将没有帮助,因为在执行<code>run</code>/<code>sudo</code>/<code>local</code>之前,SSH尝试期间发生故障。</p>
<p>一种解决方案是创建一个函数,在执行任务之前检查每个服务器是否已启动。下面是我使用的代码。</p>
<pre><code>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
</code></pre>