Это связано с моим предыдущим вопросом, но другим.
У меня есть следующий 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", но возможно я использую его неправильно.
Как я могу изменить это поведение так, чтобы оно было только печатать ошибку и продолжать выполняться?
Согласно документации 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
Вы используете его неправильно. Вы даже можете просто указать - warn-only = true
в командной строке. Это задокументированный метод, предложенный командой разработчиков.