2020年12月17日木曜日

NGTによる仮想マシンの識別方法と証明書の更新方法について

前回は、仮想マシンクローン時の一括仮想マシンへのNGT設定情報アップデートの方法をお伝えしました。
そもそもこのngt_uuidは仮想マシン毎に個別で発行されますが、クローンする前の元の仮想マシンで利用したuuidに対してクローンした仮想マシンではNGTが有効にならない理由については触れていませんでした。もし発行されているuuidという識別だけであれば、クローン元の仮想マシンとクローン先の仮想マシンで同じuuidがngt_config.jsonに書き込まれているので、マスター仮想マシンがシャットダウンされていれば、クローンした仮想マシンでこのuuidは利用可能であると思いますが、実際にはこのクローンした仮想マシンでngtのステータスが有効になることはありません。前回の説明どうりNGTのISOをマウントし設定ファイルを更新する必要があります。

ではどのようにして仮想マシンそれぞれ固有の情報を識別しているかというと、それは仮想マシン毎に発行されるクライアント証明書に秘密があります。

Windowsの場合、ngt_config.jsonが配置されているディレクトリと同じ「C:\Program Files\Nutanix\config」配下に、「client-cert.pem」と「client-key.pem」ファイルがあることが分ります。これが各クライアント毎に生成される秘密鍵と証明書です。この証明書情報とその仮想マシンが疎通するIPアドレスから仮想マシンUUIDが識別され、Nutanix側で持っている仮想マシンUUIDに紐付く情報と一致しているかを見ています。

さてここで勘の良い方は気づいたと思います。

証明書ということは有効期限があります。証明書の有効期限が切れるとNutanixクラスターとNGTの間の疎通はできなくなります。

証明書の有効期限が近づいたら、またNGTのISOをマウントして仮想マシン再起動したらいいんでしょ?と思うかも知れませんが、現行AOS5.18のバージョンにおいては一度仮想マシンに対して証明書が発行されると、その情報が保持されたままとなり、この証明書情報を削除して再度生成するという手順を踏まないと有効期限を持った証明書が生成されません。

今回はこの証明書の更新方法について見ていきます。

わかりやすいように今回はWindows環境におけるNGT証明書の更新方法を紹介いたします。

Linuxなど別のOSや原則証明書更新方法の詳細は、KB:8120を参考にして頂くことをおすすめします。


<現行の証明書の日付の確認>

「C:\Program Files\Nutanix\config」の配下にある、「client-cert.pem」ファイルを確認します。このファイルをファイル名を「client-cert.pem.cer」に変更します。


拡張子を変更した、「clinet-cert,pem.cer」ファイルをダブルクリックすると証明書の日付を確認することが出来ます。


この証明書は、現時点で証明書の日付は切れていませんが、期限切れまで三ヶ月を切っています。今回はこの
確認後は、元のファイル名「client-cert.pem」にファイル名を戻しておきます。

<証明書の更新>

該当の仮想マシンが稼働するNutanixクラスターの任意のCVMにSSHで接続します。

仮想マシンのUUIDをncliを利用して取得します。(acliで取得しても構いませんが、vSphere環境のNutanixクラスターの場合「acli」が利用できませんのでここではncliを利用します。「ncli vm list name="仮想マシン名"」

ncli vm list name="Windows Server 2016 Template"
    Id                        : 00056d28-59d3-7bbc-0000-000000014005::20edafba-0644-4e57-a3cf-4abef2f69a5f
    Uuid                      : 20edafba-0644-4e57-a3cf-4abef2f69a5f  
    Name                      : Windows Server 2016 Template
    VM IP Addresses           : 192.168.1.91, 169.254.117.111
    Hypervisor Host Id        : 00056d28-59d3-7bbc-0000-000000014005::1591223829
    Hypervisor Host Uuid      : 92dad1eb-6562-4489-aca2-5e15ca07adc4
    Hypervisor Host Name      : NX-AHV-2
    Memory                    : 4 GiB (4,294,967,296 bytes)
    Virtual CPUs              : 2
    VDisk Count               : 1
    VDisks                    : 00056d28-59d3-7bbc-0000-000000014005::NFS:4:0:313
    Protection Domain         :
    Consistency Group         :
こちらのUUIDを元に、
「nutanix_guest_tools_cli delete_vm_tools_entity <UUID>」コマンドを実行し、証明書データーを削除します。

$nutanix_guest_tools_cli delete_vm_tools_entity 20edafba-0644-4e57-a3cf-4abef2f69a5f
2020-12-12 09:00:59,358Z:24911(0x7fa2ecb59a80):ZOO_INFO@log_env@960: Client environment:zookeeper.version=zookeeper C client 3.4.3
2020-12-12 09:00:59,359Z:24911(0x7fa2ecb59a80):ZOO_INFO@log_env@964: Client environment:host.name=ntnx-17sm6c100126-b-cvm
2020-12-12 09:00:59,359Z:24911(0x7fa2ecb59a80):ZOO_INFO@log_env@971: Client environment:os.name=Linux
2020-12-12 09:00:59,359Z:24911(0x7fa2ecb59a80):ZOO_INFO@log_env@972: Client environment:os.arch=3.10.0-1127.19.1.el7.nutanix.20201004.cvm.x86_64
2020-12-12 09:00:59,359Z:24911(0x7fa2ecb59a80):ZOO_INFO@log_env@973: Client environment:os.version=#1 SMP Sun Oct 4 12:55:45 UTC 2020
2020-12-12 09:00:59,359Z:24911(0x7fa2ecb59a80):ZOO_INFO@zookeeper_init@1008: Initiating client connection, host=zk3:9876,zk2:9876,zk1:9876 sessionTimeout=20000 watcher=0x556be811c6e0 sessionId=0 sessionPasswd=<null> context=0x7ffc5bf9bfc0 flags=0
2020-12-12 09:00:59,361Z:24911(0x7fa2ecace700):ZOO_INFO@zookeeper_interest@1954: Connecting to server 192.168.XX.YY:9876
2020-12-12 09:00:59,361Z:24911(0x7fa2ecace700):ZOO_INFO@zookeeper_interest@1991: Zookeeper handle state changed to ZOO_CONNECTING_STATE for socket [192.168.XX.YY:9876]
2020-12-12 09:00:59,361Z:24911(0x7fa2ecace700):ZOO_INFO@check_events@2191: initiated connection to server [192.168.XX.YY:9876]
2020-12-12 09:00:59,364Z:24911(0x7fa2ecace700):ZOO_INFO@check_events@2239: session establishment complete on server [192.168.XX.YY:9876], sessionId=0x1762179677dcf90, negotiated timeout=20000
2020-12-12 09:00:59,467Z:24911(0x7fa2ecb59a80):ZOO_INFO@zookeeper_close@3104: Closing zookeeper sessionId=0x1762179677dcf90 to [192.168.XX.YY:9876]
result_vec: kNoError

kNoErrorで終わっていれば、削除は無事に終了しています。

続いて、CVM上で「nutanix_guest_tools_cli create_vm_tools_entity <UUID>」コマンドを実行し、新しい証明書を作成します。

$ nutanix_guest_tools_cli create_vm_tools_entity 20edafba-0644-4e57-a3cf-4abef2f69a5f
2020-12-12 09:05:17,306Z:31766(0x7f33f5eaaa80):ZOO_INFO@log_env@960: Client environment:zookeeper.version=zookeeper C client 3.4.3
2020-12-12 09:05:17,306Z:31766(0x7f33f5eaaa80):ZOO_INFO@log_env@964: Client environment:host.name=ntnx-17sm6c100126-b-cvm
2020-12-12 09:05:17,306Z:31766(0x7f33f5eaaa80):ZOO_INFO@log_env@971: Client environment:os.name=Linux
2020-12-12 09:05:17,306Z:31766(0x7f33f5eaaa80):ZOO_INFO@log_env@972: Client environment:os.arch=3.10.0-1127.19.1.el7.nutanix.20201004.cvm.x86_64
2020-12-12 09:05:17,306Z:31766(0x7f33f5eaaa80):ZOO_INFO@log_env@973: Client environment:os.version=#1 SMP Sun Oct 4 12:55:45 UTC 2020
2020-12-12 09:05:17,306Z:31766(0x7f33f5eaaa80):ZOO_INFO@zookeeper_init@1008: Initiating client connection, host=zk3:9876,zk2:9876,zk1:9876 sessionTimeout=20000 watcher=0x565041b156e0 sessionId=0 sessionPasswd=<null> context=0x7fffe016f240 flags=0
2020-12-12 09:05:17,308Z:31766(0x7f33f5e1f700):ZOO_INFO@zookeeper_interest@1954: Connecting to server 192.168.XX.YY:9876
2020-12-12 09:05:17,309Z:31766(0x7f33f5e1f700):ZOO_INFO@zookeeper_interest@1991: Zookeeper handle state changed to ZOO_CONNECTING_STATE for socket [192.168.XX.YY:9876]
2020-12-12 09:05:17,309Z:31766(0x7f33f5e1f700):ZOO_INFO@check_events@2191: initiated connection to server [192.168.XX.YY:9876]
2020-12-12 09:05:17,320Z:31766(0x7f33f5e1f700):ZOO_INFO@check_events@2239: session establishment complete on server [192.168.XX.YY:9876], sessionId=0x1762179677dcf9f, negotiated timeout=20000
2020-12-12 09:05:17,423Z:31766(0x7f33f5eaaa80):ZOO_INFO@zookeeper_close@3104: Closing zookeeper sessionId=0x1762179677dcf9f to [192.168.XX.YY:9876]
result_vec: kNoError

同じくNoErrorで終わっていることを確認します。

続いて、Prism Elementから該当の仮想マシンのNGTのISOをマウントします。


なお、NGTのISOマウントはCVMから
「nutanix_guest_tools_cli mount_guest_tools <uuid> 」
で、マウントさせることも可能です。

「Nutanix Guest Tools Agent」サービスを先どうするか、仮想マシンを再起動します。

再起動後は、証明書の日付が新しくなっているか確認してましょう。
再度、「C:\Program Files\Nutanix\config」の配下にある、「client-cert.pem」ファイルを確認します。このファイルをファイル名を「client-cert.pem.cer」に変更します。

拡張子を変更した、「clinet-cert,pem.cer」ファイルをダブルクリックすると証明書の日付を確認することが出来ます。


変更したファイル名「client-cert.pem.cer」は、「client-cert.pem」に戻しておきましょう。(でないと証明書ファイルが読めずにNGTの疎通が出来なくなります)


あとは、NGTのコミュニケーションがただしく取れているかも確認しておきましょう。

$ ncli ngt get vm-id=20edafba-0644-4e57-a3cf-4abef2f69a5f
    VM Id                     : 00056d28-59d3-7bbc-0000-000000014005::20edafba-0644-4e57-a3cf-4abef2f69a5f
    VM Name                   : Windows Server 2016 Template
    NGT Enabled               : true
    Tools ISO Mounted         : true
    Vss Snapshot              : true
    File Level Restore        : false
    Communication Link Active : true

これで証明書の更新が正常に行い、NGTのコミュニケーションもNutanixクラスターと仮想マシン間で行えていることが分ります。

なお、証明書の有効期限が近づいた場合に何らかのアラートを表示する機能は、AOS5.18点ではまだ実装されていません。

今後のバージョンでこのあたりの仕様は変更になる見込みと聞いておりますので、今の間はNGTの証明書有効期限についてはすこし気に掛けて頂く必要があります。














0 件のコメント:

コメントを投稿