Ansibleを使ってzabbixにホストグループを追加・取得する

## 概要

- Ansibleを使ってzabbixのホストグループを追加・取得する方法を記載します。

## TL:DR

- Ansibleでhost groupを新規に作成する場合は、``community.zabbix.zabbix_group``を使用する
  - 既に同じホストグループ名がある場合、処理は**OK**となる
- Ansibleでhost groupの情報を取得する場合は、``community.zabbix.zabbix_group_info``を使用する
  - 取得したホストグループが存在する場合、**OK**となる
  - 取得したホストグループが1つでも存在する場合、存在するホストの情報のみ取得し**OK**となる
  - 取得したいホストグループが全て存在しない場合、**エラー**となる

## 目次

1. 準備
2. ホストグループを追加するためのyalファイルを作成
3. 実行
4. 確認
5. 登録したホスト情報を取得しAnsibleだけで登録を確認する

## Ansibleを使ってzabbixにホストグループを追加する方法

### 1. 準備

- zabbixを用意する
  - 今回はdockerを使って検証用zabbixを立てています
    - dockerでzabbixを準備する際は、[こちら][1]の記事を参照ください
- [ansibleのinstall][2]はこちらを確認ください(今回は解説を省略します) 
- zabbix-apiのinstall
    - 下記コマンドを実行

```console
$ pip install zabbix-api
```

### 2. ホストグループを追加するためのyalファイルを作成

```yml
---
- name: "fetch host group sample"
  hosts: localhost
  vars:
    url: "http://localhost:8081"
    user: "Admin"
    password: "*****" #ご自分の環境に合ったパスワードを入力ください
    ansible_python_interpreter: /usr/bin/python3
    target_groups:
      - "test group1"
      - "test group2"
  tasks:
    - community.zabbix.zabbix_group:
        server_url: "{{ url }}"
        login_user: "{{ user }}"
        login_password: "{{ password }}"
        state: present
        host_groups: "{{ target_groups }}"
```

#### 解説

```yml
- name: "fetch host group sample"
  hosts: localhost
```

- ``name``はわかりやすくするためにつけています
- ``host``はlocalhostを使用
  - 接続先(localhostは、インベントリーになくとも指定可能)

```yml
  vars:
    url: "http://localhost:8081"
    user: "Admin"
    password: "*****" #ご自分の環境に合ったパスワードを入力ください
    ansible_python_interpreter: /usr/bin/python3
    target_groups:
      - "test group1"
      - "test group2"
```

- 後々、使いまわしたいのでzabbixに必要な情報などを事前に変数として定義
- ``ansible_python_interpreter``は、Ansibleが使用するpython interpreterを指定
  - 今回はzabbix-apiが入っていないinterpreterを見に行っていたため指定しています

```yml
  tasks:
    - community.zabbix.zabbix_group:
        server_url: "{{ url }}"
        login_user: "{{ user }}"
        login_password: "{{ password }}"
        state: present
        host_groups: "{{ target_groups }}"
```

- ``community.zabbix.zabbix_group``配下に情報を記載しホストグループの登録を行う
  - 既にホストグループが存在する場合は**OK**となる
- ``host_groups``にリスト形式で登録したいホストグループを記載する
- ``state``で登録・削除の指定をする
  - present: 登録(default)
  - absent: 削除
- state以外にもキーがあるので詳しくは[こちら][3をご確認ください

### 3. 実行

- 下記コマンドで実行する

```console
$ ansible-playbook create_host_group.yml
```

- 実行結果

```console
$ ansible-playbook create_host_group.yml
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost
does not match 'all'

PLAY [fetch host group sample] ***************************************************************************

TASK [community.zabbix.zabbix_group] *********************************************************************
changed: [localhost]

PLAY RECAP ***********************************************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
```

### 4. 確認

- zabbix上で確認する
    - 登録できていた

![create_host_group_for_zabbix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841151/77bb969b-ccb1-9fb8-03dc-08bbb3bafa04.png)

### 5. 登録したホスト情報を取得しAnsibleだけで登録を確認する

#### 先ほど登録したホストグループを削除します

- コードを少し修正

```yml
  tasks:
    - community.zabbix.zabbix_group:
        server_url: "{{ url }}"
        login_user: "{{ user }}"
        login_password: "{{ password }}"
        state: absent                  # ←元々present
        host_groups: "{{ target_groups }}"
```

- 実行

```console
$ ansible-playbook create_host_group.yml
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [fetch host group sample] *************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [create host group] *******************************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
```

- 確認
  - 削除できてそう

![delete_host_group_zabbix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2841151/bca19e9e-dc3b-84cd-db6c-c696ca578008.png)


#### 登録したホスト情報を取得しAnsibleだけで登録を確認するコードを実装

```yml
---
  tasks:
    - name: "create host group"
      community.zabbix.zabbix_group:
        server_url: "{{ url }}"
        login_user: "{{ user }}"
        login_password: "{{ password }}"
        state: present
        host_groups: "{{ target_group }}"

    # 下記の内容を追加
    - name: "get host group"
      community.zabbix.zabbix_group_info:
        server_url: "{{ url }}"
        login_user: "{{ user }}"
        login_password: "{{ password }}"
        hostgroup_name: "{{ target_group }}"
      register: host_info_result

    - name: "display host_info_result"
      debug:
        var: host_info_result
```

- ``community.zabbix.zabbix_group_info``を用いてホストグループの情報を取得することができる
  - 存在しないホストグループを指定した場合エラーとなる
    ```
    fatal: [localhost]: FAILED! => {"changed": false, "msg": "Hostgroup not found: ['test group3', 'test group4']"}
    ```
  - 取得できていることで登録確認を行うことができる

- 実行結果
  - "test group1"と"test group2"の情報が取得できているため登録成功

```console
$ ansible-playbook create_host_group.yml
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [fetch host group sample] *************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [create host group] *******************************************************
changed: [localhost]

TASK [get host group] **********************************************************
ok: [localhost]

TASK [display host_info_result] ************************************************
ok: [localhost] => {
    "host_info_result": {
        "changed": false,
        "failed": false,
        "host_groups": [
            {
                "flags": "0",
                "groupid": "22",
                "internal": "0",
                "name": "test group1",
                "uuid": "8693df5fe8fa4c0f81fa36991127a5ec"
            },
            {
                "flags": "0",
                "groupid": "23",
                "internal": "0",
                "name": "test group2",
                "uuid": "be66d01bdd48439b974ca6bdee705c46"
            }
        ]
    }
}

PLAY RECAP *********************************************************************
localhost                  : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
```


## 参考

- https://docs.ansible.com/ansible/latest/collections/community/zabbix/zabbix_group_module.html#ansible-collections-community-zabbix-zabbix-group-module
- https://docs.ansible.com/ansible/latest/collections/community/zabbix/zabbix_group_info_module.html#ansible-collections-community-zabbix-zabbix-group-info-module
- https://docs.ansible.com/ansible/2.9_ja/installation_guide/intro_installation.html


[1]:https://qiita.com/ke_honda/items/6ecc9d14a44a362e5f6a
[2]:https://docs.ansible.com/ansible/2.9_ja/installation_guide/intro_installation.html
[3]:https://docs.ansible.com/ansible/latest/collections/community/zabbix/zabbix_group_module.html#ansible-collections-community-zabbix-zabbix-group-module