如何使结构忽略env.hosts列表中的脱机主机?

2024-04-29 09:33:01 发布

您现在位置:Python中文网/ 问答频道 /正文

这与我的previous question有关,但不同。

我有以下fab文件:

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.hosts列表中的其他服务器。

我使用了env设置“warn_only=True”,但可能是使用不当。

如何修改此行为,使其只打印错误并继续执行?


Tags: torunenvtrueonlydferrorgrep
3条回答

根据Fabric documentation on warn_only

env.warn_only "specifies whether or not to warn, instead of abort, when run/sudo/local encounter error conditions.

在服务器关闭的情况下,这将没有帮助,因为在执行run/sudo/local之前,SSH尝试期间发生故障。

一种解决方案是创建一个函数,在执行任务之前检查每个服务器是否已启动。下面是我使用的代码。

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

你没用错。您甚至可以在命令行上提供--warn-only=trueIt's the documented method suggested by the development team.

从版本1.4开始,Fabric有一个--skip-bad-hosts选项,可以从命令行设置,也可以通过在fab文件中设置变量来设置。

env.skip_bad_hosts = True

此选项的文档如下: http://docs.fabfile.org/en/latest/usage/fab.html#cmdoption--skip-bad-hosts

别忘了还要显式地设置超时值。

相关问题 更多 >