こちらの記事を見て、インストールしてみたが、pacemakerのバージョンが異なるのか、自分の環境では動作しなかったorz
調べてみたら、「無償版ESXiでPacemakerのSTONITHを実装する」の作成日時が、「2020年7月30日木曜日」で今入手可能なGitHUBのfence_ESXi(以下)が
0050b0a on May 22, 2021 Git stats なので、更新が入っていることが分かった。
今回使用している私の環境は以下の通り、
[root@CENT01 ~]# cat /etc/redhat-release
CentOS Stream release 8
[root@CENT01 ~]# rpm -qa | grep pacemaker
pacemaker-schemas-2.1.5-8.el8.noarch
pacemaker-cluster-libs-2.1.5-8.el8.x86_64
pacemaker-2.1.5-8.el8.x86_64
pacemaker-libs-2.1.5-8.el8.x86_64
pacemaker-cli-2.1.5-8.el8.x86_64
[root@CENT01 ~]# rpm -qa | grep corosync
corosynclib-3.1.7-1.el8.x86_64
corosync-3.1.7-1.el8.x86_64
[root@CENT01 ~]#
fence_ESXi をダウンロード後、「無償版ESXiでPacemakerのSTONITHを実装する」に従い、修正した箇所
・インデントスペースをtab3個に置き換え
・pythonからpython3へのパスの設定変更
それ以外の以下は、修正箇所が見当たらなかったので、放置
・exceptionsモジュールは…
・conn.log_expect関数は引数が3つに…
んで、実行すると
[root@CENT01 ~]# /usr/sbin/fence_ESXi --ip=<ESXi-IP> --username=root --password="*******" -o list
2023-04-11 17:57:46,986 ERROR: Unable to connect/login to fencing device
ふむ、わからんw
tcpdumpをとってみたところ、ESXiにSSHしに行っているので、auth.logを見たところ、普通にログインできているっぽい?
しょうがないので、fence_ESXiにprint構文を突っ込んで、デバッグしたところ、呼び出している/usr/share/fence/fencing.py内で、エラーになっているっぽい。
更に「fencing.py」にprint構文をあっちこっち仕掛け確認したところ、ログイン後のプロンプト状態を取得して、継続しているっぽいことが分かった。
「fence_ESXi」の「def main():」で「 all_opt["cmd_prompt"]["default"] = [ ":~]" ]」と
なっている為、未指定の場合は「:~]」になっている可能性が高い。
ESXiにログインしてみると、
===================================================
[root@CENT01 ~]# ssh <ESXi-IP>
Password:
The time and date of this login have been sent to the system logs.
VMware offers supported, powerful system administration tools. Please
see www.vmware.com/go/sysadmintools for details.
The ESXi Shell can be disabled by an administrative user. See the
vSphere Security documentation for more information.
~ #
===================================================
あれ?「~ #」やん?つーわけで、
/usr/sbin/fence_ESXi --ip=XXXXXXXXXXX --username=root --password="*******" -o list -c '~ #'
としてみた。「-c '~ #'」が追加内容。
[root@CENT01 ~]# /usr/sbin/fence_ESXi --ip=XXXXXX --username=root --password="****" -o list -c '~ #'
Traceback (most recent call last):
File "/usr/sbin/fence_ESXi", line 95, in <module>
main()
File "/usr/sbin/fence_ESXi", line 77, in main
result = fence_action(conn, options, set_power_status, get_power_status, get_list)
File "/usr/share/fence/fencing.py", line 941, in fence_action
outlets = get_outlet_list(connection, options)
File "/usr/sbin/fence_ESXi", line 16, in get_list
if mach[0].isdigit():
IndexError: list index out of range
まだダメですね。。。
それでも、ログインは完了し「vim-cmd vmsvc/getallvms|grep '^[0-9]'」コマンドの発行と取得した値の出力までは出来ている様です。
更にprintをあっちこっちに仕掛けて、変数の内容を取得しまくった結果、
fence_ESXi
===============================
6 def get_list(conn, option):
・・・
12 for machine in machine_lines:
13 mach = machine.split()
14 if mach[0].isdigit():
===============================
ここの「machine_lines」には
「vim-cmd vmsvc/getallvms|grep '^[0-9]'」の実行結果が含まれ、
1 CENT01 [ssd] CENT01/CENT01.vmx other26xLinux64Guest vmx-08
2 CENT02 [ssd] CENT02/CENT01.vmx other26xLinux64Guest vmx-08
forで1行ずつ処理され、mach=machine.split()で先頭の数字を返していることが
print(mach)で分かったのだが、どうやら空行が最後に入っているらしく、
print(len(mach))を入れてみてわかった
print(len(mach))結果
[root@CENT01 ~]# /usr/sbin/fence_ESXi --ip=XXXXXX --username=root --password="****" -o list -c '~ #'
3
6
6
0 <<<これ
Traceback (most recent call last):
File "/usr/sbin/fence_ESXi", line 96, in <module>
main()
File "/usr/sbin/fence_ESXi", line 78, in main
result = fence_action(conn, options, set_power_status, get_power_status, get_list)
File "/usr/share/fence/fencing.py", line 941, in fence_action
outlets = get_outlet_list(connection, options)
File "/usr/sbin/fence_ESXi", line 17, in get_list
if mach[0].isdigit():
IndexError: list index out of range
というわけで、「len(mach)」結果が0の時はforループをbreakしてやることに
fence_ESXi
===============================
6 def get_list(conn, option):
・・・
12 for machine in machine_lines:
13 mach = machine.split()
14 if len(mach) == 0:
15 break
16 if mach[0].isdigit():
===============================
修正後再てすと!
[root@CENT01 ~]# /usr/sbin/fence_ESXi --ip=XXXXXX --username=root --password="****" -o list -c '~ #'
CENT01,1
CENT02,2
行けた!
ということで、やっと登録できました。
同じところで詰まっている人いたら、ご参考までに…( ^ω^)
因みに、「-o on|off|status」を発行する場合や、stonith登録(pcs stonith create)の際は
必ず「-c '~ #'」つけ忘れずにしないと、エラー出ますよ。