Как заставить Матрицу проигнорировать офлайновые хосты в списке 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.hosts.

Я использовал ENV, устанавливающий "warn_only=True", но возможно я использую его неправильно.

Как я могу изменить это поведение так, чтобы оно было только печатать ошибку и продолжать выполняться?

11
задан Community 23 May 2017 в 12:34
поделиться

2 ответа

Согласно документации Fabric по warn_only,

env.warn_only "определяет, предупреждать или нет, вместо прерывания, когда run/sudo/local сталкиваются с условиями ошибки".

Это не поможет в случае падения сервера, поскольку сбой происходит во время попытки SSH перед выполнением run/sudo/local.

Одним из решений может быть создание функции для проверки работоспособности каждого сервера перед выполнением ваших задач. Ниже приведен код, который я использовал.

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
15
ответ дан 3 December 2019 в 01:44
поделиться

Вы используете его неправильно. Вы даже можете просто указать - warn-only = true в командной строке. Это задокументированный метод, предложенный командой разработчиков.

1
ответ дан 3 December 2019 в 01:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: