pythonを使ってzabbixのホストグループを全て取得する

## 概要

- zabbixのホストグループを全て取得する方法を記載します。

## TL;DR

- zabbix_apiモジュールを使えばhostgourpを全て取得することができる
- filterをかけなければ全てのhostgroupがとれてそう
- pandasで表形式にすることで人にとってみやすくなる

## 目次

1. zabbix_apiモジュールをインストールする
2. hostgroupを取得するためのコードを書く
3. 実行し情報を取得する
4. 取得したデータを整形する

## 使用するモジュール

```
zabbix_api
pandas
json
```



## zabbix_apiを使ってhost groupを全て取得する

### 1. zabbix_apiモジュールをインストールする

- 下記のコマンドを実行する

```console
pip install zabbix_api
```

### 2. hostgroupを取得するためのコードを書く

- 最低限全てのホストグループを取得するためのコード

```python
from zabbix_api import ZabbixAPI
import json

url = "http://localhost:8081"
user = "Admin"
password = "*****" #環境に応じて置き換えてください

zx = ZabbixAPI(url)
zx.login(user, password)

all_hostgroup_list = zx.hostgroup.get(
    {
        "output": ["groupid", "name"],
    }
)

zx.logout()

if __name__ == "__main__":
    print(json.dumps(all_hostgroup_list))
```

#### 解説

- zabbixのurl,ログインユーザー名,パスワードを変数として定義する
  - 今回使用しているzabbixはdockerで開発環境用に容易しています
    - dockerでzabbixを立ち上げる方法は[こちら][1]

```python
url = "http://localhost:8081"
user = "Admin"
password = "*****" #環境に応じて置き換えてください
```

- こちらのzabbix_apiのREADMEに沿ってZabbixにログインする

```python
zx = ZabbixAPI(url)
zx.login(user, password)
```

- hostgroupを取得するためのコードを書く
  - [こちら][3]の記事を参照

```python
all_hostgroup_list = zx.hostgroup.get(
    {
        "output": ["groupid", "name"],
    }
)
```

- ログアウトする

```python
zx.logout()
```

### 3. 実行し情報を取得する

```console
>>>python3 zabbix_hostgroup.py
[{"groupid": "5", "name": "Discovered hosts"}, {"groupid": "7", "name": "Hypervisors"}, {"groupid": "2", "name": "Linux servers"}, {"groupid": "1", "name": "Templates"}, {"groupid": "12", "name": "Templates/Applications"}, {"groupid": "13", "name": "Templates/Databases"}, {"groupid": "8", "name": "Templates/Modules"}, {"groupid": "9", "name": "Templates/Network devices"}, {"groupid": "10", "name": "Templates/Operating systems"}, {"groupid": "18", "name": "Templates/Power"}, {"groupid": "16", "name": "Templates/SAN"}, {"groupid": "11", "name": "Templates/Server hardware"}, {"groupid": "15", "name": "Templates/Telephony"}, {"groupid": "17", "name": "Templates/Video surveillance"}, {"groupid": "14", "name": "Templates/Virtualization"}, {"groupid": "6", "name": "Virtual machines"}, {"groupid": "4", "name": "Zabbix servers"}]
```

### 4. 取得したデータを整形する

```console
pip install pandas
```

#### データ整形するためのコードを追加

```python
from zabbix_api import ZabbixAPI
import json
import pandas as pd #←追加

url = "http://localhost:8081"
user = "Admin"
password = "zabbix"

zx = ZabbixAPI(url)
zx.login(user, password)

all_hostgroup_list = zx.hostgroup.get(
    {
        "output": ["groupid", "name"],
    }
)

hostgroup_df = pd.DataFrame(all_hostgroup_list) #←追加
hostgroup_df.to_csv("all_hostgroup.csv", encoding="utf_8_sig") #←追加

zx.logout()

if __name__ == "__main__":
    print(json.dumps(all_hostgroup_list))
```

- 生成されたcsv file
  - ``encoding="utf_8_sig"``にしているため文字化けもしない

```csv
,groupid,name
0,5,Discovered hosts
1,7,Hypervisors
2,2,Linux servers
3,1,Templates
4,12,Templates/Applications
5,13,Templates/Databases
6,8,Templates/Modules
7,9,Templates/Network devices
8,10,Templates/Operating systems
9,18,Templates/Power
10,16,Templates/SAN
11,11,Templates/Server hardware
12,15,Templates/Telephony
13,17,Templates/Video surveillance
14,14,Templates/Virtualization
15,6,Virtual machines
16,4,Zabbix servers
```

- 確認

![zabbix_hostgroup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841151/d8022ec0-1fb3-16f6-851e-d7d2b837e6ce.png)


  - 全部でホストグループは17なので間違いなさそうですね。

## 最後に

- データ整形の仕方は色々あるのでpandasで自分の使いやすいデータの形にしてみてください
  - 今後pandasの使い方も記事を書いていく予定です-
- このやり方でtemplateなど他のzabbixの情報も取れるので試してみてください。時間があれば記事にしていきます。


---

## 参考

- https://github.com/erigones/zabbix-api
- https://www.zabbix.com/documentation/current/en/manual/api/reference/hostgroup/get


[1]:https://qiita.com/ke_honda/items/6ecc9d14a44a362e5f6a
[2]:https://github.com/erigones/zabbix-api
[3]:https://www.zabbix.com/documentation/current/en/manual/api/reference/hostgroup/get