CSVファイルを読み込んでZabbixにホスト登録

# 1. はじめに

GUI画面で１サーバずつ登録していたのですが、非常に面倒なので、ZabbixAPIとpyzabbixを使用して、一括で登録してみました。Githubにリポジトリ作成していますが、もう少し詳細にして、日本語で記載してみました。
登録するのは、ZabbixAgentでの監視を前提として、ホストグループと登録するテンプレートは固定としています。

# 2. 使用する環境
以下を使用します。
- Zabbix 6.0
- python 3.11
- pyzabbix
- pandas

# 3. 環境準備

Zabbixは以下のURLを参照して構築してください。
https://www.zabbix.com/download?zabbix=6.0&os_distribution=alma_linux&os_version=9&components=server_frontend_agent&db=mysql&ws=apache

構築が完了したら、以下のコマンドを実行して、パッケージのインストールと
githubからクローンします。
```
dnf install python
pip install pyzabbix pandas
git clone https://github.com/doublethink-bps/zabbixHostregist.git
```

コマンドの実行が完了したら、CSVファイルを用意します。
CSVファイルにはホスト名とIPアドレスの情報を記載します。
```
hostname,IP1,IP2,IP3,IP4,IP5,IP6
```

例として、以下の通りとなります。
```
hostname,IP1,IP2,IP3,IP4,IP5,IP6
test01,,192.168.4.2,1.1.1.102,172.231.4.10,10.176.3.56,
test02,10.1.1.2,,1.1.1.103,,10.176.3.57,
```
CSVのファイルの用意が完了したら、hostRegist.pyを実行します。

# 4. 実装

まず、Zabbixのログイン情報、CSVファイルパス、テンプレートID、グループIDを指定します。
```py
url = "http://192.168.3.19/zabbix"
user = "Admin"
password = "zabbix"
csvPath = "./zabbixHostinfo.csv"
templateid=10577
groupid=21
```

pyzabbixでZabbixAPIを呼び出し、ログインします。

```py
zabbix = pyzabbix.ZabbixAPI(url)
zabbix.login(user,password)
```


テンプレートIDとグループIDはSQLかZabbix APIを実行して確認する必要があります。
以下はpyzabbixを使用して、Zabbix APIを実行して確認する例です。
```py:
zabbix = pyzabbix.ZabbixAPI("ZabbixのwebコンソールURL")
zabbix.login("Zabbixのwebコンソールユーザ","Zabbixのwebコンソールパスワード")
template = zabbix.template.get(
    output=["host","templateid"],
    filter={
	 # 適用したいテンプレート名
        "host":["テンプレート名"]
    }
)
group= zabbix.hostgroup.get(
    output=["groupid","name"],
    filter={
	# 適用したいホストグループ名
        "name":["ホストグループ名"]
    }
)
print(template[0])
print(group[0])
```


CSVファイルを一行ずつ読みだして、処理します。
また、Zabbixは各ホストに対し、複数インタフェースを登録する場合、どのインタフェースをデフォルトで使用するのか設定する必要があるため、最初に登録されるインタフェースをデフォルトとするために、IP１以外は、main関数内で条件分岐させ、interfacesリストが空の場合、mainParamへ１を代入し、最初にinterfacesリストに追加されたインタフェースをデフォルトとして設定します。

```py
# read csv file for every one row
    for rows in df.iterrows():
        row = rows[1]
        interfaces = []
        # If "IP1" item isn't nan, 
        # add the interface infomatin to the [interfaces] list and assign 0 to [mainParam]
        if(pandas.notna(row["IP1"])):
            interfaces.append(createInterface(row["IP1"],1))
            mainParam=0
        # If "IP2" item isn't nan and [interfaces] isn't empty, 
        # add the interface infomatin to the [interfaces] list and assign 0 to [mainParam]
        if(pandas.notna(row["IP2"])):
            if(interfaces == []):
                mainParam=1
            interfaces.append(createInterface(row["IP2"],mainParam))
            mainParam=0
        # If "IP3" item isn't nan and [interfaces] isn't empty, 
```

分岐が終わったら、ホストの登録を行い、最後にホストのインタフェース情報が格納されたinterfacesリストをリセットし、次のホスト登録処理を開始します。

```py
        createHost(row["hostname"],interfaces)
        # When finish registration host to zabbix, empty [interfaces] list 
        interfaces.clear()
```
```py
def createHost(host,interfaces):
    zabbix.host.create(
        host=host,
        interfaces=interfaces,
        groups=[{"groupid":groupid}],
        templates=[{"templateid":templateid}]
    )
```


実行すると、以下のようにCSVに記載されたホストが登録されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3143329/da772c45-1496-dd8a-0328-a0bced174508.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3143329/e2e08756-d961-2330-6515-7db642591941.png)


# 5.URL

■Github
https://github.com/doublethink-bps/zabbixHostregist

■Zabbix
https://www.zabbix.com/documentation/6.0/jp/manual/api

■pyzabbix
https://pypi.org/project/pyzabbix/