Oracle Linux Virtualization und Fence Treiber für iLO 7 Protokoll

Oracle Linux Virtualization unterstützt Fencing von Servern nur mit iLO3, 4 und 5.
Neuere Server nutzen aber schon iLO 7 oder neuer kann man somit das Fencing nicht mehr
korrekt einrichten. Der Grund ist, dass die Syntax der ILO Commandos und auch der ILO
Prompt verändert wurde.

Auf Basis des Fencing Scripts für ilo5: fence_ilo5_ssh haben wir eine
Variante entwickelt, die auch iLO7 unterstützt. Im folgenden Skript wird
das alles berücksichtigt und auch die Timeouts und Retries wurden angepasst, so
dass der Reboot korrekt funktioniert.

iLO7 Fencing Script

#!/usr/bin/python3 -tt

import sys, os, re
import atexit
import logging
sys.path.append("/usr/share/fence")
from fencing import *

def get_power_status(conn, options):
conn.send_eol("power");

re_state = re.compile('The host power is (.*)\.', re.IGNORECASE)
conn.log_expect(re_state, int(options["--shell-timeout"]))

status = conn.match.group(1).lower()
# print( "status: [%s]" % (status) )

if status.startswith("on"):
return "on"
else:
return "off"

def set_power_status(conn, options):
if options["--action"] == "on":
conn.send_eol("power on")
else:
conn.send_eol("power off")

conn.log_expect(options["--command-prompt"], int(options["--power-timeout"]))

return

def reboot_cycle(conn, options):
conn.send_eol("power off")
conn.log_expect(options["--command-prompt"], int(options["--power-timeout"]))

if get_power_status(conn, options) != "off":
logging.error("Timed out waiting to power OFF\n")

conn.send_eol("power on")
conn.log_expect(options["--command-prompt"], int(options["--power-timeout"]))

if get_power_status(conn, options) != "on":
logging.error("Timed out waiting to power ON\n")
return True

def main():
device_opt = ["ipaddr", "login", "passwd", "secure", "cmd_prompt", "method", "telnet"]

atexit.register(atexit_handler)

all_opt["cmd_prompt"]["default"] = ["hpeiLO->"]
all_opt["power_wait"]["default"] = 0
all_opt["power_timeout"]["default"] = 0
all_opt["shell_timeout"]["default"] = 0
all_opt["retry_on"]["default"] = 10

options = check_input(device_opt, process_input(device_opt))

docs = {}
docs["shortdesc"] = "Fence agent for HP iLO over SSH"
docs["longdesc"] = "{} is a Power Fencing agent that connects to iLO device. It logs into \
device via ssh and reboot a specified outlet.\
\n.P\n\
WARNING: The monitor-action is prone to timeouts. Use the fence_ilo-equivalent \
to avoid this issue.".format(os.path.basename(__file__))
docs["vendorurl"] = "http://www.hp.com"
docs["symlink"] = [("fence_ilo3_ssh", "Fence agent for HP iLO3 over SSH"),
("fence_ilo4_ssh", "Fence agent for HP iLO4 over SSH"),
("fence_ilo5_ssh", "Fence agent for HP iLO5 over SSH")]
show_docs(options, docs)

options["eol"] = "\r"

conn = fence_login(options)
# conn.send_eol("SMCLP")

##
## Fence operations
####
result = fence_action(conn, options, set_power_status, get_power_status, None, reboot_cycle)
fence_logout(conn, "exit")
sys.exit(result)

if __name__ == "__main__":
main()

Hinweis: Es wird KEINE GARANTIE übernommen, dass dieses Skript in jeder Situation fehlerfrei funktioniert.
Die Nutzung ist auf eigene Gefahr/Verantwortung.