Zabbixで大量のホストをインポートする方法

# 1. はじめに
インフラシステムの監視をOSSのZabbixを使って行っているSEも多いと思います（私もその一人です）。

Zabbixの運用を開始してから、システムの環境に変化がなければ特に問題ありませんが、大規模なシステムになると運用開始後に監視対象が大量に増えたりすることも多いです。

追加する監視対象が数台であれば1つ1つ手作業によって追加できますが、数百台、数千台規模の追加が発生した場合に手作業で追加するのは現実的ではありません。

そんなときのためにZabbixではいくつかホストを追加する手段が用意されています。

本記事では、大量の新規ホストをZabbixに追加する場合の方法について記載します（最近取り扱った経緯から、対象のバージョンは4.0とします）。

# 2. Zabbixにホストを追加する方法
Zabbixでホストを追加する方法は主に以下の3つあります。

- GUI画面から手動でホストを追加する
- 取り込み用ファイル（XML、YAML、JSON）を使ってホストを取り込む
- APIを使ってホストを追加する

追加する対象ホストが少ない場合はGUI画面から手動の追加で特に問題ないと思います。
ですが、大量のホストを追加する場合にはそれ以外の2つで行う方が早いです。

APIを使う場合は、そのためのプログラム/スクリプトを実装する必要があるため比較的導入コストが高めです。
なので、今回は「**取り込み用ファイル（XML、YAML、JSON）を使ってホストを取り込む**」方法について記載します。

# 3. 取り込み用ファイルを使ってホストを取り込む方法
## 3-1. 取り込み可能なファイル形式
Zabbixでファイルからホストを取り込む際に使用可能なファイル形式は3つです。

- XML
- YAML
- JSON

取り込む際だけではなく、GUI画面からホストをエクスポートする際も上記3つのファイル形式を選択可能です。
上記3つの中でも、今回紹介するのは「**XML**」ファイルを使用したホストの取り込みです。

## 3-2. 取り込み用XMLファイルの作成
ファイルからホストを取り込む場合は、取り込み用のXMLファイルを準備する必要があります。

今回はSEも様々なところで使うであろう「**Excel**」を使って取り込み用XMLを作成します。
普段から使っているExcelを使うことができるのもXMLを選択した1つの理由です。

Excelには、表からXMLデータを出力する機能があります。ExcelからXMLデータをエクスポートする概要については以下の記事を参考にしてください。

[ExcelのXMLとは？ データ管理と変換について解説](https://onechat.jp/blog/archives/5495)

取り込み用XMLファイルを作成する手順の概要は以下です。

1. Excelでホストデータを作成する
2. XMLスキーマファイルを作成する
3. ExcelでXMLファイルをエクスポートする

以下で各手順について説明します。

### 3-2-1. Excelでホストデータを作成する
XMLからホストを取り込む際に、定義しておかなければならないデータがあります。
このデータが最終的にXMLで、各ホストのデータを定義するタグに相当します。

定義する必要のあるデータについては以下のZabbix公式マニュアルを確認してください。

[定義が必要なデータ（プロパティ）一覧](https://www.zabbix.com/documentation/4.0/en/manual/xml_export_import/hosts)

具体的には、上記マニュアルの「Host tags」欄にある「Element property」にあるプロパティをExcelのデータとして定義していくイメージです。
プロパティが一致しているもの（例えば、groupのnameとhostのname）もありますが、問題ありません。
実際に定義したあとのExcelのイメージは以下です。
　

![スクリーンショット 2024-11-22 165933.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438789/0b8e7668-037a-46a8-e44b-ebc7ff807a81.png)
　

プロパティの値が「数字（integer）」のものは値の入力が必須となるため必ず入力し、
「String（文字列）」のものは省略可能となるので必要なければ空白でも構いません。

### 3-2-2. XMLスキーマファイル（XSD）を作成する
ExcelからXMLファイルをエクスポートするには、XMLスキーマファイルというものが必要になります。
このスキーマファイルは、ExcelからXMLをエクスポートする際に

**こういうXML構造でエクスポートしてね**

という構造を指示するファイルです。
このXMLスキーマファイルに、Zabbixで定義されている取り込み用のXML構造を定義します。

取り込み用XMLのフォーマットはエクスポート時のフォーマットと同様なので、マニュアルの中にあるサンプルを参考に作ります。
以下にXMLスキーマのサンプルを記載します。

```zabbix_host_base.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
	<xsd:element name="zabbix_export">
		<!--エクスポート実行後、ここに<version>タグを入れる-->
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element name="hosts">
					<xsd:complexType>
						<xsd:sequence>
							<xsd:element name="host" maxOccurs="unbounded">
								<xsd:complexType>
									<xsd:sequence>
										<xsd:element name="host" type="xsd:string"/>
										<xsd:element name="name" type="xsd:string"/>
										<xsd:element name="description" type="xsd:string"/>
										<xsd:element name="proxy" type="xsd:string"/>
										<xsd:element name="status" type="xsd:integer"/>
										<xsd:element name="ipmi_authtype" type="xsd:integer"/>
										<xsd:element name="ipmi_privilege" type="xsd:integer"/>
										<xsd:element name="ipmi_username" type="xsd:string"/>
										<xsd:element name="ipmi_password" type="xsd:string"/>
										<xsd:element name="tls_connect" type="xsd:integer"/>
										<xsd:element name="tls_accept" type="xsd:integer"/>
										<xsd:element name="tls_issuer" type="xsd:string"/>
										<xsd:element name="tls_subject" type="xsd:string"/>
										<xsd:element name="tls_psk_identity" type="xsd:string"/>
										<xsd:element name="tls_psk" type="xsd:string"/>
										<xsd:element name="templates">
											<xsd:complexType>
												<xsd:sequence>
													<xsd:element name="template">
														<xsd:complexType>
															<xsd:sequence>
																<xsd:element name="name" type="xsd:string"/>
															</xsd:sequence>
														</xsd:complexType>
													</xsd:element>
												</xsd:sequence>
											</xsd:complexType>
										</xsd:element>
										<xsd:element name="groups">
											<xsd:complexType>
												<xsd:sequence>
													<xsd:element name="group">
														<xsd:complexType>
															<xsd:sequence>
																<xsd:element name="name" type="xsd:string"/>
															</xsd:sequence>
														</xsd:complexType>
													</xsd:element>
												</xsd:sequence>
											</xsd:complexType>
										</xsd:element>
										<xsd:element name="interfaces">
											<xsd:complexType>
												<xsd:sequence>
													<xsd:element name="interface">
														<xsd:complexType>
															<xsd:sequence>
																<xsd:element name="default" type="xsd:integer"/>
																<xsd:element name="type" type="xsd:integer"/>
																<xsd:element name="useip" type="xsd:integer"/>
																<xsd:element name="ip" type="xsd:string"/>
																<xsd:element name="dns" type="xsd:string"/>
																<xsd:element name="port" type="xsd:integer"/>
																<xsd:element name="bulk" type="xsd:integer"/>
																<xsd:element name="dns" type="xsd:string"/>
																<xsd:element name="interface_ref" type="xsd:string"/>
															</xsd:sequence>
														</xsd:complexType>
													</xsd:element>
												</xsd:sequence>
											</xsd:complexType>
										</xsd:element>
										<xsd:element name="applications" type="xsd:string"/>
										<xsd:element name="macros" type="xsd:string"/>
									</xsd:sequence>
								</xsd:complexType>
							</xsd:element>
						</xsd:sequence>
					</xsd:complexType>
				</xsd:element>
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>
</xsd:schema>
```

XMLスキーマファイルの構文などについての詳細はここでは割愛します。

### 3-2-3. ExcelでXMLファイルをエクスポートする
XMLスキーマファイルを作成したら、ホストデータのExcelファイルとXMLスキーマファイルからXMLデータを作成します。

最初に、作成したスキーマファイルをExcelで読み込みます。
スキーマファイルを読み込むと下記画像のように定義した構造が表示されます。

![スクリーンショット 2024-11-26 002739.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438789/3598746e-38c8-5f74-43b5-f14a81a6d98d.png)

この状態から赤いアスタリスク（＊）がついた各要素を、シートで定義した各要素に合わせてドラッグアンドドロップしていきます。
ドラッグアンドドロップで紐づけると、シートで定義した各要素は下記画像のように「表（テーブル）」に変わります。この状態になっていれば紐づけは完了です。

![スクリーンショット 2024-11-26 002537.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438789/d05dd000-7040-9685-51f6-a1b9c1309d9a.png)

この状態でファイル形式を「**XMLデータ（*.xml）**」として別名保存するとXMLデータが出力されます。

### 3-2-4. 仕上げ
ここで出力したXMLファイルをそのまま取り込みと行きたいところですが、最後に少し手を加える必要があります。

出力されたXMLファイルに「**\<version\>タグ**」を追加します。
今回はバージョン4.0を使っているので、「**\<version>4.0\</version>**」を追加します。

追加する位置は出力されたXMLの「**\<zabbix_export\>**」タグ直下です。以下のような構造になると思います。

```zabbix_host.xml
<zabbix_export>
	<version>4.0</version>
	<hosts>
		<host>
			<host>test1</host>
			<name>ab</name>
			<description/>
			<proxy/>
			<status>1</status>
			<ipmi_authtype>-1</ipmi_authtype>
			<ipmi_privilege>2</ipmi_privilege>
			<ipmi_username/>
			<ipmi_password/>
			<tls_connect>1</tls_connect>
			<tls_accept>1</tls_accept>
			<tls_issuer/>
			<tls_subject/>
			<tls_psk_identity/>
			<tls_psk/>
			<templates>
				<template>
					<name>Test Template</name>
				</template>
			</templates>
			<groups>
				<group>
					<name>Test Group</name>
				</group>
			</groups>
			<interfaces>
				<interface>
					<default>1</default>
					<type>1</type>
					<useip>1</useip>
					<ip>10.10.10.1</ip>
					<dns/>
					<port>10050</port>
					<bulk>1</bulk>
					<interface_ref/>
				</interface>
			</interfaces>
			<applications/>
			<macros/>
		</host>
	</hosts>
</zabbix_export>
```

ここまで修正したらZabbixのGUIからこのXMLをインポートしてホストを追加することができます。

以上がXMLからホストを追加する手順になります。

# 4. 最後に
いかがだったでしょうか。
今回はXMLファイルを使ってホストを追加する方法について記載しました。

一度スキーマファイルを定義してしまえば、Excelを使ってホスト情報を定義しておくだけで
大量のホストでも比較的簡単にインポートできるのがイメージできたのではないかと思います。

今回はバージョン4.0でのやり方を紹介しましたが、多少定義する要素の増減があるだけでバージョン違いでも同様の対応ができるかと思います。

大規模なシステムのZabbixを運用されている方は、ぜひホストの追加時に今回紹介した方法を使ってみてはいかがでしょうか。