2021年8月28日土曜日

Zabbixのディスカバリルールを作成する

Zabbixにはディスカバリルールと呼ばれる、監視対象からの情報取得結果に応じて、自動的に監視するアイテムやトリガーを生成する機能がある。

WindowsやLinuxの標準テンプレートでは、ディスカバリルールが実装されており、例えばネットワークインターフェースが複数ある場合も自動認識がされるため、それぞれのネットワークで個別で監視設定を行うことなく、必要な監視設定が実施される。

今回、OSSのロードバランサーであるZEVENETを例に、実際にディスカバリルールを作成してみたので、その手順を記載する。先に伝えると、なかなかうまくいかずに難航したので、その内容も含め記載をさせていただく。

環境

Zabbixは5.0を使用し、ディスカバリルールによる監視対象として、OSSのロードバランサーであるZEVENETを使用する。ZEVENETに登録した負荷分散対象に状態変化があった際に、トリガーにて検知できるようディスカバリルールを作成する

  • Zabbix 5.0.10
  • ZEVENET 5.11.0

ディスカバリルール作成手順

1. ディスカバリ用のデータ取得コマンドを検証

ディスカバリ時には、監視対象より必要な情報をJSON形式で取得する必要がある。以下にフォーマットを記載する。変数名を"{#変数名}の形式で定義し値を取得すると、取得した値の数だけアイテムやトリガーを自動で生成させることができる。

{
   "data": [
      {
         "{#変数名1}": "値1"
      },
      {
         "{#変数名2}": "値2"
      },

      ~(繰り返し)~

      {
         "{#変数名X}": "値X"
      }
   ]
}

ZEVENETの場合は、コマンドラインツールであるzcliを使うことで、JSON形式のデータを取得することができる。ただし、細かい箇所で記載が異なることから、sedを使って置換を行うことで対処する。

以下が、実際にZEVENETにて取得したデータとなる。変数名は{#FARMNAME}としており、それぞれに負荷分散対象グループの名前が入っている。

# /usr/bin/zcli -nc farm list -filter farmname | sed -e 's/params/data/g' -e 's/farmname/{#FARMNAME}/g'
	{
	   "data": [
	      {
	         "{#FARMNAME}": "farm-chrony"
	      },
	      {
	         "{#FARMNAME}": "farm-postfix"
	      },
	      {
	         "{#FARMNAME}": "farm-squid"
	      },
	      {
	         "{#FARMNAME}": "farm-unbound"
	      }
	   ]
	}

2. テンプレートを作成

ディスカバリルールを作成する前に、テンプレートを作成する。
先ほど作成したJSON形式の情報取得コマンドは、監視対象に対してSSHによる実行を行うことから、マクロにてあらかじめSSHログイン用のパスワードを設定しておく。

3. ディスカバリルールを作成

作成したテンプレートの「ディスカバリルール」を選択し、ディスカバリルールを以下の通り作成する。

設定項目 設定値 説明
名前 ZEVENET Farm discovery 任意で設定。
タイプ SSHエージェント zcliによるコマンド実行が必要となるため、SSHエージェントを選択する。
キー ssh.run[zcli] 任意で設定。
認証方式 パスワード SSH接続時にパスワードによる認証を利用する。
ユーザー名 root
パスワード {$ZEVENET_PASS} マクロで設定したパスワードを指定。
実行するスクリプト /usr/bin/zcli -nc farm list -filter farmname | sed -e 's/params/data/g' -e 's/farmname/{#FARMNAME}/g' 事前に作成したJSON形式のデータを取得するコマンドを指定。
監視間隔 1h 今回は1時間間隔で設定したが、要件に応じた間隔に設定する。頻繁に変更される内容ではない場合は、監視間隔を長くしても問題ないと想定。
存在しなくなったリソースの保持期間 3d 一度ディスカバリした情報が削除された場合に

4. ディスカバリのテスト

「ディスカバリルール」作成画面の「テスト」ボタンを押すことで、ディスカバリのテストを行うことができる。

取得対象のホストのIPアドレス、マクロで設定しているSSH接続用のパスワードを入力し、「値の取得とテスト」ボタンを押す。問題なく成功する場合は、結果欄にJSON形式のデータが表示される。

ただし、いくつか失敗するパターンも経験したので補足する。

Cannot read data from SSH serverのエラーで失敗する

テストをする際に以下のようにCannot read data from SSH serverのエラーが表示され、SSHの接続に失敗してしまう。この事象は毎回必ず発生するものではなく、数回に1回ランダムで発生する事象となる。

調査したところ、以下URLに原因が書いてあった。libsshのバグであり、バージョン0.9.0を使用している場合に発生するようだ。

libsshのバージョンが0.9.5以降であれば確実に直っているようだが、私の環境では0.9.4にバージョンアップすることで事象が解消した
※不要と思ったが、バージョンアップ後念のため再起動を実施した。

# rpm -qa | grep libssh
libssh-config-0.9.0-4.el8.noarch
libssh-0.9.0-4.el8.x86_64

# dnf update libssh.x86_64 -y
# reboot

# rpm -qa | grep libssh
libssh-config-0.9.4-2.el8.noarch
libssh-0.9.4-2.el8.x86_64

Invalid discovery rule valueのエラーで失敗する

Invalid discovery rule valueは、JSON形式のデータが正しく取得できていないことを表すエラーとなる。Zabbix上のエラーメッセージを見ると、確かに[38;5;188mといったおかしな情報が混入している。

Invalid discovery rule value: cannot parse as a valid JSON object: invalid object name at: '"data": [
{
"{#FARMNAME}": "farm-chrony"

しかし、実際にZEVENET上で直接コマンドを実行し取得した値は問題がないように見えるため、原因特定が難航した。

色々調べた結果、これは「ANSIエスケープシーケンス」呼ばれる制御文字列であり、ZEVENETが結果出力に色付けする際に利用しているものが、そのままZabbixに情報として連携されてしまうことが原因だった。

ちなみに、ANSIエスケープシーケンスでは[38;5;NmNで指定した番号のカラーコードで色付けされ、[0mで設定がリセットされる。

ZEVENETの場合はzcliのオプションで-ncを付けることで、結果出力に色付けをしなくなる。このオプションを付けることで事象を解消することができた。

4. アイテムのプロトタイプを作成

ディスカバリされた情報をもとに作成されるアイテムのプロトタイプを作成さる。JSON形式で受け取るデータの変数名(今回の場合は{#FARMNAME})を名前やキーに使うことで、検出した対象ごとにアイテムを作成することができる。

「ディスカバリルール」→「アイテムのプロトタイプ」にて、以下の通りアイテムのプロトタイプを作成する。

設定項目 設定値 説明
名前 ZEVENET Farm "{#FARMNAME}" Status ディスカバリされたアイテム名が重複しないよう、変数{#FARMNAME}を名前に入れるようにする。
タイプ Zabbixエージェント(アクティブ) 今回はログ監視となるため、左記のタイプを選択する。
キー log[/var/log/messages,"farmguardian.*{#FARMNAME}",,,skip] logを使用し、変数{#FARMNAME}の文字列が含まれるログの取得を行う。
データ型 ログ ログの取得のため、左記の設定を行う。
監視間隔 1m 任意で設定。

5. トリガーのプロトタイプを作成

ディスカバリされた情報をもとに作成されるトリガーのプロトタイプを作成さる。アイテムと同様に、JSON形式で受け取るデータの変数名(今回の場合は{#FARMNAME})を名前やキーに使うことで、検出した対象ごとにアイテムを作成することができる。

「ディスカバリルール」→「トリガーのプロトタイプ」にて、以下の通りトリガーのプロトタイプを作成する。

設定項目 設定値 説明
名前 ZEVENET Farm "{#FARMNAME}" Status Down from {HOST.NAME} ディスカバリされたトリガー名が重複しないよう、変数{#FARMNAME}を名前に入れるようにする。
深刻度 軽度の障害 任意の深刻度で設定。
障害の条件式 {Template Net Zevenet:log[/var/log/messages,"farmguardian.*{#FARMNAME}",,,skip].regexp(down)}=1 負荷分散対象のサーバーがダウンしたことを検知させるため、downの文字列があった場合に検知させる。
正常イベントの生成 復旧条件式 今回は復旧条件式を設定。
復旧条件式 {Template Net Zevenet:log[/var/log/messages,"farmguardian.*{#FARMNAME}",,,skip].regexp(resurrect)}=1 負荷分散対象のサーバーが復旧したことを検知させるため、resurrectの文字列があった場合に検知させる。

6. 動作確認

作成したテンプレートを実際にZEVENETのホストに割り当てを行い動作確認を行う。

ディスカバリルールで設定した監視間隔を過ぎると、負荷分散対象ごとにアイテムとトリガーが作成されていることが確認できた。


参考

【Zabbix】SNMPTTを使ってMIBを変換・登録する

ZabbixにてSNMP Trap監視を実装する際に利用される「SNMPTT (SNMP Trap Translator) 」では、あらかじめsnmpttconvertmibコマンドを使用してMIBファイルの変換を行い、SNMPTTが解釈できるフォーマットに変換したうえで登録する必要がある。

本記事では、snmpttconvertmibによるMIBの変換を行う手順と、変換したファイルを登録する手順を記載する。

環境

  • OS : CentOS 8.1
  • Zabbix : 5.0.8
  • SNMPTT : v1.4.2

単体ファイルの変換手順

単体ファイルの変換例として、QNAPのMIBであるNAS.mibを使って変換作業を説明する。

1. 作業用ディレクトリの確認

MIBファイルは、MIBファイルの中で他のMIBファイルを参照する場合がある。snmpttconvertmibでは、他MIBファイルを参照するような場合でも変換することができるが、その際に参照するMIBファイルを所定のディレクトリ (MIB search path) に配置しておく必要がある。

MIB search path: /root/.snmp/mibs:/usr/share/snmp/mibs

参照するファイルが見つからない場合はCannot find moduleというエラーで変換に失敗する。こちらのエラー内容は、本記事の最後に参考情報として記載した。

今回はMIB search pathとなっている/root/.snmp/mibsにMIBファイルを配置する。このディレクトリはMIB変換作業用のディレクトリとしても使用する。

上記をふまえ、今回MIBの変換に使用するディレクトリ構成を整理すると以下のようになる。

パス 説明
/root/.snmp/mibs オリジナルのMIBファイル配置先
/root/.snmp/mibs/snmpttconf SNMPTT用変換ファイル出力先

2. 作業用ディレクトリにMIBファイルを配置

作業用ディレクトリを作成し、変換対象のMIBファイルをコピーして配置する。

# mkdir -p /root/.snmp/mibs/snmpttconf
# cd /root/.snmp/mibs
# cp ~/NAS.mib .

3. snmpttconvertmibにて変換

snmpttconvertmibのコマンド構文は以下の通り。[SNMPTT用変換ファイル]snmptt.conf.製品名といった名前で統一して作成するとMIBファイルが増えたとしても管理しやすくてよいだろう。

# snmpttconvertmib --in=[MIBファイル] --out=[SNMPTT用変換ファイル]

今回はQNAP用のMIBとなるので、snmptt.conf.QNAPという名前で変換ファイルを作成することにする。

snmpttconvertmibを実行すると最後に変換結果が表示される。Failed translationsが0となっており、MIBの変換がすべて成功していることを確認しておこう。

# snmpttconvertmib --in=NAS.mib --out=snmpttconf/snmptt.conf.QNAP


*****  Processing MIB file *****

snmptranslate version: NET-SNMP version: 5.8
severity: Normal

File to load is:        ./NAS.mib
File to APPEND TO:      snmpttconf/snmptt.conf.QNAP

MIBS environment var:   ./NAS.mib
mib name: QTS-MIB

~(中略)~

Total translations:        6
Successful translations:   6
Failed translations:       0 ★

4. Zabbix検知用の文字列を追加

ZabbixにてSNMP Trapを受信する場合、ZBXTRAP [Trap送信元IPアドレス]を付与する必要があるので、sedを使って一括置換を行う。なお、SNMP Trapのイベント名も表示させたいため、以下コマンドでは$Nも付与している。

# cd snmpttconf/
# sed -i 's/FORMAT/FORMAT ZBXTRAP $aA $N/g' snmptt.conf.QNAP

5. 変換ファイルを反映

変換したファイルは/etc/snmp/にコピーする。

# cp snmptt.conf.QNAP /etc/snmp/

SNMPTTに先ほどコピーした変換ファイルを読み込ませるよう、[TrapFiles]の★箇所に変換ファイルの追記を行う。

# vi /etc/snmp/snmptt.ini
~(中略)~

[TrapFiles]
# A list of snmptt.conf files (this is NOT the snmptrapd.conf file).  The COMPLETE path
# and filename.  Ex: '/etc/snmp/snmptt.conf'
snmptt_conf_files = <<END
/etc/snmp/snmptt.conf.QNAP ★
/etc/snmp/snmptt.conf
END

SNMPTT設定反映のため、SNMPTTのサービス再起動を行い完了となる。

# systemctl restart snmptt

複数ファイルの変換手順

複数ファイルの変換例として、VMware製品のMIBを使って変換作業を説明する。VMwareのMIBは以下URLからダウンロードできる。
※ダウンロードにはVMwareアカウント登録が必要。

複数のMIBファイルが含まれたzipファイルをダウンロードでき、本記事ではVMware-mibs-7.0.0-15924762.zipというファイル名でダウンロードした。

1. 作業用ディレクトリの確認

ディレクトリ構成は単体ファイルの場合と特に変わらず、MIBの変換に使用するディレクトリ構成は以下とする。

パス 説明
/root/.snmp/mibs オリジナルのMIBファイル配置先
/root/.snmp/mibs/snmpttconf SNMPTT用変換ファイル出力先

2. 作業用ディレクトリにMIBファイルを配置

VMware製品のMIBを解凍すると、vmwというディレクトリにMIBファイルが展開される。

# unzip VMware-mibs-7.0.0-15924762.zip
# ls -ld vmw/
drwxr-xr-x 3 root root 4096  3月 28  2020 vmw/

作業用ディレクトリを作成し、先ほど解凍した変換対象のMIBファイルをすべてコピーして配置する。

# mkdir -p /root/.snmp/mibs/snmpttconf
# cd /root/.snmp/mibs
# cp ~/vmw/*.mib .

3. snmpttconvertmibにて変換

for文を使って、複数のMIBファイルを一度に変換する。変換結果はresult.txtに出力させる。

# cat /dev/null > result.txt
# for i in `ls *.mib`; do snmpttconvertmib --in=$i --out=snmpttconf/$i.conf >> result.txt 2>&1; done

変換結果のファイルから、MIBファイルの変換に失敗したものがないか確認する。今回は2箇所で失敗していることが確認できる。

# cat result.txt | egrep 'Failed translations.*[1-9]'
Failed translations:       1
Failed translations:       1

ログからもう少し詳細を追うと、Unknown object identifierのエラーで失敗している (★箇所) ことがわかるが、これはSNMPTTの変換ロジックとMIBの構文のミスマッチに起因する問題のようである。MIBファイルを修正することで対処できそうだが、今回は本題と関係がないので割愛をする。

Processing MIB:         LLDP-V2-MIB
#
Split line TRAP-TYPE / NOTIFICATION-TYPE found (Counter32,).
Line: 7
NOTIFICATION-TYPE: Counter32
Enterprise: ieee802dot1mibs
Looking up via snmptranslate: LLDP-V2-MIB::Counter32
Unknown object identifier: LLDP-V2-MIB::Counter32 ★

~(中略)~

Total translations:        2
Successful translations:   1
Failed translations:       1

4. Zabbix検知用の文字列を追加

MIBファイルの数だけ変換ファイルが作成されるため、catコマンドを使って1つのファイルに結合する。

# cd snmpttconf/
# cat *.conf > snmptt.conf.VMWARE

ZabbixにてSNMP Trapを受信する場合、ZBXTRAP [Trap送信元IPアドレス]を付与する必要があるので、sedを使って一括置換を行う。なお、SNMP Trapのイベント名も表示させたいため、以下コマンドでは$Nも付与している。

# sed -i 's/FORMAT/FORMAT ZBXTRAP $aA $N/g' snmptt.conf.VMWARE

5. 変換ファイルを反映

変換したファイルは/etc/snmp/にコピーする。

# cp snmptt.conf.VMWARE /etc/snmp/

SNMPTTに先ほどコピーした変換ファイルを読み込ませるよう、[TrapFiles]の★箇所に変換ファイルの追記を行う。

# vi /etc/snmp/snmptt.ini
~(中略)~

[TrapFiles]
# A list of snmptt.conf files (this is NOT the snmptrapd.conf file).  The COMPLETE path
# and filename.  Ex: '/etc/snmp/snmptt.conf'
snmptt_conf_files = <<END
/etc/snmp/snmptt.conf.VMWARE ★
/etc/snmp/snmptt.conf.QNAP
/etc/snmp/snmptt.conf
END

SNMPTT設定反映のため、SNMPTTのサービス再起動を行い完了となる。

# systemctl restart snmptt

(参考) Cannot find moduleでMIBの変換に失敗する

参考情報として、Cannot find moduleでMIBの変換に失敗した場合のsnmpttconvertmibの出力結果を記載する。参照先のMIBファイルが見つからないことによるエラーとなるため、所定のディレクトリ (MIB search path) に参照するMIBファイルを配置することでエラーが解消される。

# snmpttconvertmib --in=VMWARE-VROPS-MIB.mib --out=VMWARE-VROPS-MIB.mib.conf


*****  Processing MIB file *****

snmptranslate version: NET-SNMP version: 5.8
severity: Normal

File to load is:        ./VMWARE-VROPS-MIB.mib
File to APPEND TO:      ./VMWARE-VROPS-MIB.mib.conf

MIBS environment var:   ./VMWARE-VROPS-MIB.mib
mib name: VMWARE-VROPS-MIB


Processing MIB:         VMWARE-VROPS-MIB
#
skipping a TRAP-TYPE / NOTIFICATION-TYPE line - probably an import line.
#
Line: 232
NOTIFICATION-TYPE: vmwTrapProblemActive
Variables: vmwAlertAliveServerName vmwAlertEntityName vmwAlertEntityType vmwAlertTimestamp vmwAlertCriticality vmwAlertRootCause vmwAlertURL vmwAlertID vmwAlertMessage vmwAlertType vmwAlertSubtype vmwAlertHealth vmwAlertRisk vmwAlertEfficiency vmwAlertMetricName vmwAlertResourceKind vmwAlertDefinitionName vmwAlertDefinitionDesc vmwAlertImpact vmwAlertNotificationRules
Enterprise: vmwAlertTrap
Looking up via snmptranslate: VMWARE-VROPS-MIB::vmwTrapProblemActive
MIB search path: /root/.snmp/mibs:/usr/share/snmp/mibs
Cannot find module (VMWARE-TC-MIB): At line 15 in ./VMWARE-VROPS-MIB.mib ★
Cannot find module (VMWARE-PRODUCTS-MIB): At line 17 in ./VMWARE-VROPS-MIB.mib ★
Did not find 'VmwLongDisplayString' in module #-1 (./VMWARE-VROPS-MIB.mib)
Did not find 'vmwVrops' in module #-1 (./VMWARE-VROPS-MIB.mib)
Unlinked OID in VMWARE-VROPS-MIB: vmwVropsMIB ::= { vmwVrops 1 }
Undefined identifier: vmwVrops near line 19 of ./VMWARE-VROPS-MIB.mib
Cannot adopt OID in VMWARE-VROPS-MIB: vmwVropsMIB ::= { vmwVrops 1 }
Cannot adopt OID in VMWARE-VROPS-MIB: vmwTrapTest ::= { vmwAlertTrap 200 }

~(以下略)~

参考

2021年8月21日土曜日

Azure AD Connectを1.6.4.0から2.0.8.0にメジャーバージョンアップする手順

オンプレ環境に存在するActive Directory (以下、オンプレAD) とAzure ADの情報連携を行うAzure AD Connectは、通常自動的にバージョンアップがされる。これは、Get-ADSyncAutoUpgradeコマンドレットを使うことで確認することができる。

PS C:\> Get-ADSyncAutoUpgrade
Enabled

ただし、以下Azure AD Connectのリリースノートを見ると、「Released for download only, not available for auto upgrade」となっており、自動的にバージョンアップされないものが多く存在する。

特に2021/7/10にAzure AD Connectの新メジャーバージョンとなる2.0.3.0がリリースされており、こちらも自動的にバージョンアップはされないため、手動によるバージョンアップが必要となる。

今回、Azure AD Connectを1.6.4.0の環境から2.0.8.0に手動でバージョンアップしたので、その手順を記載する。なお、Azure AD Connect自体の導入手順については、以下別記事を参照いただきたい。

環境

バージョンアップ対象となるオンプレADは以下の通り。

  • Windows Server 2016 Standard
  • Azure AD Connect 1.6.4.0

なお、Azure AD Connect 2.0.8.0は、Windows Server 2016以降のOSでなければ使うことができない。古いOSを使っている場合は、1.x台の最新バージョンとなる「1.6.11.3」を利用し続ける必要がある。

バージョンアップ手順

1. Azure AD Connectをダウンロード

Azure AD Connectの最新版を以下からダウンロードし、オンプレADに配置する。

2. TLS 1.2を有効化

Azure AD Connect 2.xはTSL 1.2の強制が必要となる。もし未設定のままインストーラを起動すると、以下の通り「TLSの正しくないバージョン」のエラーで弾かれてしまう。

本事象を解消するため、以下マニュアルに記載のレジストリ設定を行えばよい。なお、レジストリ設定後、特に再起動は不要となる。

レジストリ設定は複数個所存在するので、以下の通りPowerShellによる設定が手っ取り早い。

New-Item 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319' -Force | Out-Null
New-ItemProperty -path 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319' -name 'SystemDefaultTlsVersions' -value '1' -PropertyType 'DWord' -Force | Out-Null
New-ItemProperty -path 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319' -name 'SchUseStrongCrypto' -value '1' -PropertyType 'DWord' -Force | Out-Null
New-Item 'HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319' -Force | Out-Null
New-ItemProperty -path 'HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319' -name 'SystemDefaultTlsVersions' -value '1' -PropertyType 'DWord' -Force | Out-Null
New-ItemProperty -path 'HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319' -name 'SchUseStrongCrypto' -value '1' -PropertyType 'DWord' -Force | Out-Null
New-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -Force | Out-Null
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -name 'Enabled' -value '1' -PropertyType 'DWord' -Force | Out-Null
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force | Out-Null
New-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -Force | Out-Null
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -name 'Enabled' -value '1' -PropertyType 'DWord' -Force | Out-Null
New-ItemProperty -path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -name 'DisabledByDefault' -value 0 -PropertyType 'DWord' -Force | Out-Null
Write-Host 'TLS 1.2 has been enabled.'

3. インストールウィザードを起動

レジストリ設定後、再度インストーラを起動すると、以下の通りChange、Repair、Removeのいずれかを選択できる画面が表示される。非常にわかりづらいが、バージョンアップの場合は「Repair」を選択する。

4. バージョンアップ開始

「Azure AD Connectへようこそ」の画面では、ライセンス条項に同意にチェックを入れ、「続行」を選択する。

「Azure Active Directory Connectのアップグレード」の画面では、「アップグレード」を選択する。

バージョンアップの処理が開始されるので数分待つと、「Azure ADに接続」の画面に遷移する。ここでは、Azure ADのグローバル管理者のユーザ及びパスワードを入力する。

「構成の準備完了」の画面に遷移するので、「構成が完了したら、同期プロセスを開始する」にチェックを入れ、「アップグレード」を選択する。

特に問題なければ「構成が完了しました」の画面に遷移し、バージョンアップが完了となる。

5. インストール後確認

コントロールパネルから「プログラムと機能」を確認すると、Azure AD Connectのバージョンが2.0.8.0になっていることがわかる。また、バージョンアップ時にMicrosoft SQL Server 2019がインストールされていることがわかる。

旧バージョンで使用されていたMicrosoft SQL Server 2012が残っているが、こちらは消してよいものかわからないため、このままの手を付けないことにした。

また、Microsoft 365管理センターにて同期状況を確認すると、前回の同期が4分前になっており、問題なく同期が成功していることがわかる。

以上で、Azure AD Connectのバージョンアップは完了となる。

2021年8月14日土曜日

Oracle VM VirtualBox (Windows版)&Guest Additionsインストール手順

WindowsやMACのPCにて手軽にLinuxなどの検証を行いたい場合がある。そのような場合には、PCにインストール可能なホスト側仮想化ソフトウェアを利用し、Linuxの仮想マシンを構築することができる。

ホスト型仮想化ソフトウェアとして利用可能なものは、以下のようなものがある。

製品名 プラットフォーム 説明
Oracle VM VirtualBox Windows, macOS, Linuxなど 様々なプラットフォームで動作し、無償であるにも関わらずかなり柔軟に仮想マシンの設定が可能。また、Vagrantを使えば構築の自動化も可能。
VMware Workstation Player Windows vSphereでおなじみのVMwareのホスト型仮想化ソフトウェア。無償版では最低限仮想マシンを動かすといったことしかできないため、ちょっと使い勝手が悪い。
VMware Fusion Player macOS macOSを所有していないため評価不可。

今回は、「Oracle VM VirtualBox」をWindows環境にインストールし、VirtualBox上にWindows Server 2019とRHEL 8.4をインストールする手順を記載する。

環境

VirtualBoxをインストールする手ごろなWindowsクライアントがすぐに用意できなかったため、たまたまインストールしていたWindows Server 2022 PreviewにVirtualBoxをインストールしたが、他Windows環境でも手順に差異はないだろう。

  • Windows Server 2022 Preview
  • Oracle VM VirtualBox 6.1.24

なお、私の環境はESXi上のOSにVirtualBoxをインストールする構成となる。このような構成の場合は、ESXiのCPUの設定にて「ハードウェア アシストによる仮想化をゲスト OS に公開」を有効にすること。

Oracle VM VirtualBoxインストール手順

1. Oracle VM VirtualBoxのダウンロード

VirtualBox本家とOracle 日本のいずれかからVirtualBoxのダウンロードができる。Oracle 日本でダウンロードできるバージョンは少し古くなってしまうことから、特に理由がなければ本家からダウンロードすれば問題ない

また、同じサイトでダウンロードできるOracle VM VirtualBox Extension Packもダウンロードしておく。Extension Packをインストールすることで、USBコントローラやディスク暗号化などの拡張機能を利用することができる。

2. VirtualBox本体のインストール

ダウンロードしたexeファイルをダブルクリックすれば、インストールウィザードを起動する。基本的には、すべてを「次へ」を押して進めばよい。

インストールが開始されると、「このデバイスをインストールしますか?」と表示されるので、「インストール」を選んでおく。

3. Extension Packのインストール

VitualBoxをインストールしたのち、Extension Packのファイル (vbox-extpack) をダブルクリックすることでインストールを開始することができる。

ライセンス規約が表示されるので、一番下までスクロールしたのち、「同意します」を選択する。

インストールが成功すると、以下のような「拡張機能パッケージ Oracle VM Virtual Box Extension Pack のインストールに成功しました。」のメッセージが表示される。

VirtualBox上にWindows Server 2019をインストール

1. 仮想マシンを作成

「新規」ボタンをクリックすることで、仮想マシンの作成ウィザードが表示される。以下のように設定を行い仮想マシンを作成する。

設定値 説明
名前 任意で指定。今回はwin2019とする。
タイプ Microsoft Windows
バージョン Windows 2019 (64-bit)
メモリーサイズ 任意で指定。デフォルトは2048MB
ハードディスク 「仮想ハードディスクを作成する」を選択
ハードディスクのファイルタイプ デフォルトの「VDI (VirtualBox Disk Image)」を選択する。なお、「VHD」 (Hyper-Vで使用) や「VMDK」 (ESXiで使用) も選択可能。
物理ハードディスクにあるストレージ 可変サイズと固定サイズが選択できる。いわゆるシックプロビジョニングとシンプロビジョニングに対応する。「固定」の場合はディスク作成時にすべての容量が割り当てられてしまい効率が悪いので、使用した分だけディスクサイズを割り当てていく「可変」を選択する。
ファイルの場所とサイズ 任意で指定。デフォルトは50GB

2. OSをインストールメディアから起動

作成した仮想マシンの「設定」を開き、「ストレージ」→「光学ドライブ」を選択する。CDマークを選択し、「ディスクファイルを選択」を選択し、Windows Server 2019のISOイメージを選択する。

仮想マシンの起動モードは以下3種類ある。VirtualBox用語となっており、初見では動作の違いが判らないため、それぞれの違いを以下に記載する。

起動モード 説明
通常起動 起動時に仮想マシンのコンソールが開く。コンソールを閉じる際は、「状態保存 (いわゆるサスペンド)」または「仮想マシンの停止」のみ選択が可能。
ヘッドレス起動 起動時に仮想マシンのコンソールが開かない。起動後に「表示」を選択することで仮想マシンのコンソールを開くことができる。コンソールを閉じる際に「バックグラウンドで動作を継続」を選択することで、仮想マシンのコンソールを閉じても起動状態を継続させることが可能。
デタッチモード起動 起動時に仮想マシンのコンソールが開く。それ以外は「ヘッドレス起動」と同様となり、「バックグラウンドで動作を継続」を選択可能。

通常は、仮想マシンのバックグラウンドでの起動が選択可能な、「デタッチモード起動」を選択しておけば問題ないだろう。

3. OSインストール

Windows Serverのインストールメディアを読み込むので、Enterを押しインストールを開始させる。インストール手順自体は特に通常と変更は不要であるため割愛する。

インストール完了後はインストールメディアは不要となることから、「デバイス」→「光学ドライブ」→「仮想ドライブからディスクを除去」を選択しインストールメディアを取り出しておこう。

4. Guest Additionsをインストール

VirtualBoxでは「Guest Additions」と呼ばれる、ESXiでいうところのVMware Toolsと同様の機能を待つエージェントのインストールが推奨される。

「デバイス」→「Guest Additions CDイメージの挿入…」を選択する。

すると、仮想CDドライブに「VirtualBox Guest Additions」というメディアがマウントされるので、これをダブルクリックすることでインストールウィザードが開始される。インストールウィザードでは、基本的には、すべてを「次へ」を押して進めばよい。

インストールが開始されると、「このデバイスをインストールしますか?」と表示されるので、「インストール」を選んでおく。

最後に再起動を求められるため、再起動して完了となる。

Guest Additionsが正常にインストールされていることの確認は、「仮想マシン」→「セッション情報」→「ランタイム情報」から確認することができる。


VirtualBox上にRHEL 8.4をインストール

1. 仮想マシンを作成~OSインストール

Windows Serverと同様の手順となるため割愛する。

2. Guest Additionsをインストール

RHELに対してGuest Additionsをインストールする場合は、GUIではなくCLIによるインストールを行う。

まず、前提パッケージとして以下が必要となる。

  • kernel-headers
  • kernel-devel
  • tar
  • bzip2
  • gcc
  • make
  • perl
  • elfutils-libelf-devel

上記パッケージをdnfまたはyumを使ってインストールを行うのだが、インターネット経由でインストールする場合、ネットワーク設定やサブスクリプション登録など手順が多くなる。そこで、今回はRHELのOSインストールメディアに含まれるパッケージを用いてインストールを行う。

まず、OSインストールメディアのパッケージが含まれるディレクトリをリポジトリとして登録する。

# cat << EOF > /etc/yum.repos.d/dvd-base.repo
[dvd-base]
baseurl=file:///media/BaseOS/
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
EOF

# cat << EOF > /etc/yum.repos.d/dvd-appstream.repo
[dvd-appstream]
baseurl=file:///media/AppStream/
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
EOF

次にOSインストールメディアをマウントし、dnfにてパッケージのインストールを行う。

# mount /dev/cdrom /media/
mount: /media: 警告: デバイスは書き込み禁止です、読み込み専用でマウントします.
# dnf install kernel-headers kernel-devel -y
# dnf install tar bzip2 gcc make perl elfutils-libelf-devel -y
# eject /dev/sr0

次に、OSインストールメディアを「Guest Additions」のメディアに変更する。Windows Serverの手順と同様、「デバイス」→「Guest Additions CDイメージの挿入…」を選択したのち、VBoxLinuxAdditions.runを実行すると、自動的にGuest Additionsがインストールされる。

# mount /dev/cdrom /media/
mount: /media: 警告: デバイスは書き込み禁止です、読み込み専用でマウントします.

# /media/VBoxLinuxAdditions.run
Verifying archive integrity... All good.
Uncompressing VirtualBox 6.1.24 Guest Additions for Linux........
VirtualBox Guest Additions installer
Removing installed version 6.1.24 of VirtualBox Guest Additions...
Copying additional installer modules ...
Installing additional modules ...
VirtualBox Guest Additions: Starting.
VirtualBox Guest Additions: Building the VirtualBox Guest Additions kernel
modules.  This may take a while.
VirtualBox Guest Additions: To build modules for other installed kernels, run
VirtualBox Guest Additions:   /sbin/rcvboxadd quicksetup <version>
VirtualBox Guest Additions: or
VirtualBox Guest Additions:   /sbin/rcvboxadd quicksetup all
VirtualBox Guest Additions: Building the modules for kernel
4.18.0-305.el8.x86_64.
ValueError: File context for /opt/VBoxGuestAdditions-6.1.24/other/mount.vboxsf already defined

最後に再起動をすれば完了となる。

# reboot
2021年8月10日火曜日

Office製品利用時に「共有コンピューターでのOfficeライセンス認証に使用することができません」で認証できない問題

Windows 365 Cloud PCは、Office製品がインストール済みの状態で提供される。

このOffice製品利用時には、Microsoft 365 Businessのライセンスが割り当てられたMicrosoftアカウントにて認証が必要となるが、この際に「共有コンピューターでのOfficeライセンス認証に使用することができません」のエラーで認証できない問題が発生した。アドレスバーの表示も「Unlicensed Product」となっている。

本記事では、Office製品のライセンス認証時に発生する上記エラーを解消するための手順を記載する。

環境

環境はWindows 365 Cloud PCのWindows 10のみで発生しており、通常のWindows 10では問題なく認証できることを確認している。

Microsoft 365のライセンスは、「Microsoft 365 Business Standard」を利用している。

解消手順

1. レジストリエディターを開く

タスクバーの検索ボックスに「regedit」を入力し、レジストリエディターを開く。

2. パラメータを修正

左ツリーからコンピューター\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configurationに移動し、SharedComputerLicensingを「1」から「0」に修正する。


3. ExcelなどのOffice製品を起動

設定後、ExcelなどのOffice製品を起動する。OSへのログインユーザーとシングルサインオンが構成されていれば、そのまま認証が成功し、Excelのアドレスバーが正常な状態に変わるはずだ。もし、シングルサインオンができない構成の場合は、手動でサインオン作業を行えばよい。

念のため、Officeユーザーの情報を確認すると、Microsoft 365 Apps for Bussinessのサブスクリプションを正常に認識していることがわかる。

以上でエラー解消は完了となる。

2021年8月5日木曜日

【PowerCLI】仮想マシンに直接コマンドを実行する「Invoke-VMScript」

PowerCLIでは、直接仮想マシンにコマンドを実行する機能がある。この機能を使うと、仮想マシンのOSにログインすることなく、設定変更や情報取得を行うことができる

このコマンドは非常に有用なので、コマンドの使い方を調べて、実際に試してみた。

環境及び前提条件

環境

  • vSphere 6.7 Update 3

前提条件

  • vCenter ServerでESXi管理されていること (要するに無償版のESXiライセンスの環境ではないこと)
  • 仮想マシンにVMware Toolsがインストールされていること

仮想マシンでコマンドを実行するInvoke-VMScript

仮想マシンに対してコマンドを実行するコマンドレットとして、Invoke-VMScriptが用意されている。構文は以下の通り。

Invoke-VMScript [-ScriptText] <String> [-VM] <VirtualMachine[]> [-HostCredential <PSCredential>] [-HostUser <String>] [-HostPassword <SecureString>] [-GuestCredential <PSCredential>] [-GuestUser <String>] [-GuestPassword <SecureString>] [-ToolsWaitSecs <Int32>] [-ScriptType <ScriptType>] [-Server <VIServer[]>] [-WhatIf] [-Confirm] [<CommonParameters>]

必要となるパラメータの説明を以下に記載する。

パラメータ 内容
VM 仮想マシン名を指定する。
GuestUser 仮想マシンのユーザを指定する。
GuestPassword 仮想マシンのパスワードを指定する。
ScriptText スクリプトのコマンドを記載する。コマンドが長くなる場合は、一度コマンドを変数に代入してから実行させるのがおすすめ。複数コマンドを実行したい場合は「;」でコマンドを複数区切って実行させることができる。
(Optional) ScriptType 実行するスクリプトのタイプを選べる。PowerShell、Bat、Bashのいずれかを選べる。WindowsのデフォルトはPowerShellで、LinuxはBashとなる。したがって、仮想マシンがWindowsで、かつコマンドプロンプト上でコマンドを実行したい場合のみ本パラメータでBatを指定すればよく、通常は設定しなくてよい。

実際にいくつか簡単なコマンドを実行してみよう。

PowerShellコマンドを実行

以下は、Windows Server 2016の仮想マシンでhostnamewhoamiGet-WinSystemLocaleを実行する例となる。きちんとコマンドの実行結果が日本語で返ってきていることがわかる。

PS C:\> $str = "hostname ; whoami ; Get-WinSystemLocale"
PS C:\> Invoke-VMScript -VM win2016 -GuestUser "Administrator" -GuestPassword "P@ssw0rd!" -ScriptText $str

ScriptOutput
---------------------------------------------------------------------------------------------------------------------------------------------
|  WIN-4DDOLQRR420
|  win-4ddolqrr420\administrator
|
|  LCID             Name             DisplayName
|  ----             ----             -----------
|  1041             ja-JP            日本語 (日本)
|
|
|
---------------------------------------------------------------------------------------------------------------------------------------------

コマンドプロンプト (Bat) のコマンドを実行

まずはverコマンドをScriptTypeオプションなしで実行してみよう。verコマンドはPowerShellで実行できないのでエラーになる。

PS C:\> $str = "ver"
PS C:\> Invoke-VMScript -VM win2016 -GuestUser "Administrator" -GuestPassword "P@ssw0rd!" -ScriptText $str

ScriptOutput
---------------------------------------------------------------------------------------------------------------------------------------------
|  ver : 用語 'ver' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。
|  名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください
|  。
|  発生場所 行:1 文字:4
|  + & {ver}
|  +    ~~~
|      + CategoryInfo          : ObjectNotFound: (ver:String) [], CommandNotFoundException
|      + FullyQualifiedErrorId : CommandNotFoundException
|
|
---------------------------------------------------------------------------------------------------------------------------------------------

このような場合は、-ScriptType Batを付けて実行すれば成功する。

PS C:\> $str = "ver"
PS C:\> Invoke-VMScript -VM win2016 -GuestUser "Administrator" -GuestPassword "P@ssw0rd!" -ScriptType Bat -ScriptText $str

ScriptOutput
---------------------------------------------------------------------------------------------------------------------------------------------
|
|  Microsoft Windows [Version 10.0.14393]
|
---------------------------------------------------------------------------------------------------------------------------------------------

実行結果から不要な罫線を削除する

Invoke-VMScriptの出力結果は、----といった罫線で囲まれており、出力結果を使って判断等を行う場合には文字列加工が必要となり使い勝手が悪い。このような場合は一度実行結果を変数に入れたのち、ScriptOutputメソッドを使うことで、純粋な実行結果のみを表示させることができる。また、コマの実行時の終了コードについても、ExitCodeメソッドを使うことで取得することができる。

以下実行例となる。

PS C:\> $str = "uname -a"
PS C:\> $res = Invoke-VMScript -VM VyOS-1.1.8 -GuestUser "vyos" -GuestPassword "P@ssw0rd!" -ScriptText $str

PS C:\> $res

ScriptOutput
-----------------------------------------------------------------------------------------------------------------------
|  Linux vyos 3.13.11-1-amd64-vyos #1 SMP Sat Nov 11 12:10:30 CET 2017 x86_64 GNU/Linux
|
-----------------------------------------------------------------------------------------------------------------------

PS C:\> $res.ScriptOutput
Linux vyos 3.13.11-1-amd64-vyos #1 SMP Sat Nov 11 12:10:30 CET 2017 x86_64 GNU/Linux

PS C:\> $res.ExitCode
0

更新履歴

  • 2020/6/3 新規作成
  • 2021/8/5 「実行結果から不要な罫線を削除する」を追記

2021年8月3日火曜日

Windows 365を無料トライアルしてみた

2021/8/2よりクラウド上でWindowsクライアントを使うことができる「Windows 365 Cloud PC」が正式リリースされた。これにより、いままではPC購入時に買い切りライセンスで購入することが一般的だったWindowsクライアントをサブスクリプション (月額課金) によるサービスとして利用することができるようになった。

Windows 365 Cloud PCは、60日間の無料トライアルによる利用ができる。本記事では、Windows 365 Cloud PCの無料トライアルライセンスを使ってクラウド上にWindows OSをデプロイし、外部からリモートデスクトップ接続する手順を記載する。

環境

私の環境では、あらかじめAzure AD Freeによるユーザ認証が可能となっている。Azure AD Freeの設定手順は以下別記事を参照いただきたい。

無料トライアルライセンスを入手

1. Windows 365 Cloud PCの製品サイトにアクセス

まずは、以下URLにアクセスする。ここでは、Windows 365 Cloud PCのプランと料金を確認することができる。

BussinessとEnterpriseの2つエディションを選ぶことができ、さらにCPUやメモリのスペックに応じて、Basic、Standard、Premiumの3種類が用意されている。今回は、BussinessエディションのBasicプランを利用する。

無料トライアルを利用するため、「2か月間無料でお試し」のリンクをクリックする。

2. 無料トライアルライセンスを入手

「試用してWindowsハイブリッド特典を使用する」は「いいえ」を選び続行する。

初めに、ライセンスを紐づけるアカウントを確認される。今回はAzure ADに登録しているアカウントを指定した。この後の手順で「Microsoft 365管理センター」にてライセンスの管理を行うため、「Microsoft 365管理センター」の操作が可能な権限が必要となる。

「購入手続きへ進む」の画面では、「無料トライアル」を選択する。

「注文の受領書」画面では「続行」を選択する。以上で無料トライアルライセンスが付与される。

3. Microsoft 365管理センターにて、ライセンスをユーザに割り当て

自動的に「Microsoft 365管理センター」に遷移する。もし遷移しなかった場合は以下URLに直接アクセスしよう。

左メニューの「課金情報」→「お使いの製品」を選択し、Windows 365 Bussinessのトライアルライセンスの「ライセンスを割り当てる」のリンクを選択する。

後は画面に従って、Windows 365 Cloud PCを使用するユーザにライセンスを割り当てる。

Cloud PCをデプロイ

1. Windows 365 Cloud PCの管理画面にアクセス

以下のWindows 365 Cloud PCの管理画面にアクセスする。

アクセスすると、突然「あなたのクラウドPCは準備中です」と表示され、Cloud PCの展開が開始される。

2. Cloud PCが自動展開されるので待機

そのまま「開始」ボタンをクリックすると、以下のような画面となる。「クラウドPCを設定しています」と表示されている場合は、まだOSが展開中であり操作ができないので待機する。私の場合は20~25分程度の時間を要した。

展開が完了すると、「Cloud PC is ready」と表示される。

3. ログイン確認

「ブラウザーで開く」を選択し、Cloud PCのアイコンをダブルクリックすると、「ローカルリソースへのアクセス」の確認が表示されるので、「許可」を選択する。

ライセンスを割り当てたユーザ及びパスワードでログインをすると、以下の通りブラウザ上でWindows OSに接続できる。なお、CPUはXeon Platinum 8168 2.70GHzとなっていた。

リモートデスクトップ接続アプリによる接続

Windows 365のCloud PCに対しては、ブラウザだけでなく専用のリモートデスクトップ接続アプリによる接続が可能となる。

1. Windows用のリモートデスクトップ接続アプリをダウンロード

先ほどのWindows 365の管理画面から、「↓」メニューをクリックすると、各種リモートデスクトップ接続アプリのダウンロードできる。

今回はWindows版をダウンロードする。その際に、「サブスクリプションURL」と呼ばれる登録用URLが表示できるため、控えておくこと。

2. Windows用のリモートデスクトップ接続アプリをインストール

リモートデスクトップ接続アプリのインストーラはmsi形式となるため、ダブルクリックしウィザードに従ってインストールすれば問題ない。

インストール完了後、リモートデスクトップ接続アプリを起動したのち、「登録」ボタンを押し、先ほど控えた「サブスクリプションURL」を入力する。

3. 接続確認

ブラウザと同様に接続可能なCloud PCが表示されるので、ダブルクリックして接続する。

資格情報を入力すれば、先ほどのCloud PCにログインできる。なお、通常のリモートデスクトップ接続とは異なり、HTTPS通信によってCloud PCと接続される。そのため、プロキシサーバ経由で問題なく接続できることを確認した。

Windows 365 Cloud PCを日本語化

Cloud PCはデフォルトで英語のみ表示と入力ができる状態になっているので、日本語化を行う。

1. 言語パックをダウンロード及び設定

Windowsの「設定」画面を開き、「Time & Language」→「Language」に移動する。「Add a language」の「+」ボタンを選択し、「日本語」の言語パックの追加を行う。

OS表示言語も変更するため、「Set as my Windows display language」にもチェックすること。

数分待つとインストールが完了し、サインアウトを求められるため、「Yes」を選択する。

2. 再ログイン

再度ログインすると、以下の通り日本語に表示が変更されていることがわかる。

参考

人気の投稿