Dockerネットワーク内にZabbixエージェントをつくる

## はじめに

以前、[Dockerを使ってZabbixを構築した](https://qiita.com/t13801206/items/ab545462c9b859853954)
今回は、Docker内にZabbixエージェントを複数作成し、Zabbixサーバーの監視対象を増やす

次回以降、Zabbixでできることを試していく

### （復習）ZabbixサーバーをDockerに構築した

Zabbixドキュメントの[使用例2](https://www.zabbix.com/documentation/6.0/jp/manual/installation/containers#%E4%BD%BF%E7%94%A8%E4%BE%8B)を参考に、PosgreSQLをサポートするZabbixサーバーを構築した
サーバーのアドレスは、ラズパイ（物理）からも直接見えるように `192.168.10.101`とした

:::note info
- `192.168.10.0/24`は家のプライベートアドレス　（ラズパイと同じセグメント）
- `172.20.0.0/16`はZabbix用のDockerネットワーク。ネットワーク名は`zabbix-net`
:::

#### Docker版Zabbix群

４つのコンテナが協働して、Zabbixサーバーを構成している

```bash:docker ps
CONTAINER ID   IMAGE                                             COMMAND                   CREATED        STATUS         PORTS                                         NAMES
7e664e4f5023   zabbix/zabbix-web-nginx-pgsql:alpine-6.2-latest   "docker-entrypoint.sh"    5 months ago   Up 7 minutes   0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp   zabbix-web-nginx-pgsql
7251684fec13   zabbix/zabbix-server-pgsql:alpine-6.2-latest      "/sbin/tini -- /usr/…"   5 months ago   Up 7 minutes   0.0.0.0:10051->10051/tcp                      zabbix-server-pgsql
74a3b475aa9f   zabbix/zabbix-snmptraps:alpine-6.2-latest         "/usr/sbin/snmptrapd…"   5 months ago   Up 7 minutes   0.0.0.0:162->1162/udp                         zabbix-snmptraps
ff29d26e827c   postgres:latest                                   "docker-entrypoint.s…"   5 months ago   Up 7 minutes   5432/tcp                                      postgres-server
```

これら４つのコンテナは`zabbix-net`と名付けられたDockerネットワークに属している

##### Dockerネットワーク `zabbix-net`


ゲートウェイ`172.20.240.0`を、後でエージェントに与えるパラメータとして使う

```powershell:docker network inspect zabbix-net
 "Subnet": "172.20.0.0/16",
 "IPRange": "172.20.240.0/20",
 "Gateway": "172.20.240.0"
```

`*.*.*.11110000/20`で絞ったIPレンジのうち、初めの`*.*.*.0`をゲートウェイとしている
（なぜこうしているのかは、わからない）

## Zabbixエージェントのコンテナ選定

[Zabbixはコンテナをいくつか提供している](https://www.zabbix.com/container_images)
その中から[Zabbixエージェント](https://hub.docker.com/r/zabbix/zabbix-agent)を使う

前回、ラズパイに`6.0.11`を入れたので、今回も`6.0.*`を使う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/e2523593-f49c-ed8f-04ba-d4618c84f174.png)

### Dockerコンテナ版Zabbixエージェントを起動する

下記コマンドの `01`, `60001` の末尾を2, 3と変えて、３つのエージェントを起動する

```bash
docker run --name zabbix-agent-01　\
    --hostname ZabbixAgent01 \
    -e ZBX_HOSTNAME="agent01" \
    -e ZBX_SERVER_HOST="172.20.240.0" \
    --privileged \
    --network=zabbix-net \
    -p 60001:10050 \
    -d zabbix/zabbix-agent:ubuntu-6.0.11

# 1行貼り付け用
docker run --name zabbix-agent-01 --hostname ZabbixAgent01 -e ZBX_HOSTNAME="agent01" -e ZBX_SERVER_HOST="172.20.240.0" --privileged --network=zabbix-net -p 60001:10050 -d zabbix/zabbix-agent:ubuntu-6.0.11
```

#### サーバーホストがゲートウェイアドレス`172.20.240.0`

`ZBX_SERVER_HOST`について、サンプルではZabbixサーバーのホスト名を指定しているが
今回は**ホストにある（ようにみえる）サーバーからDockerネットワーク内のエージェントへ接続許可するために**
ゲートウェイのアドレスをサーバーとみなしている

（下キャプチャは[使用例2](https://www.zabbix.com/documentation/6.0/jp/manual/installation/containers#%E4%BD%BF%E7%94%A8%E4%BE%8B)から抜粋したもの。この設定は使わない）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/8b8a2f8a-6258-040d-357c-a51c8d77d938.png)

:::note info
`ZBX_SERVER_HOST`の右辺は`zabbix-server-pgsql`ではなく、Dockerネットワークのゲートウェイとする
:::

### ３つZabbixエージェントが作成された状態

Dockerコンテナ一覧をみると`Ubuntu 6.0.11`のエージェントが３つ存在する
ホストから各コンテナへは、それぞれ60001,60002,60003のポートを介して接続する

参考：[コンテナに外部からアクセス（ポートフォワード）](https://qiita.com/tifa2chan/items/a58e34019d4f10097a4d)
```powershell:docker container ls (一部抜粋)
CONTAINER ID   IMAGE                                             COMMAND                   CREATED        STATUS        PORTS                                         NAMES
8aaa6f38b146   zabbix/zabbix-agent:ubuntu-6.0.11                 "/usr/bin/tini -- /u…"   36 hours ago   Up 36 hours   0.0.0.0:60003->10050/tcp                      zabbix-agent-03
070b4c9ac12a   zabbix/zabbix-agent:ubuntu-6.0.11                 "/usr/bin/tini -- /u…"   36 hours ago   Up 36 hours   0.0.0.0:60002->10050/tcp                      zabbix-agent-02
dfab8c8aa6db   zabbix/zabbix-agent:ubuntu-6.0.11                 "/usr/bin/tini -- /u…"   36 hours ago   Up 36 hours   0.0.0.0:60001->10050/tcp                      zabbix-agent-01
```

### Zabbixエージェントの中身をみてみる

PowerShellからDockerコンテナの中に入る

```powershell:Zabbixエージェントのコンテナに入る
# PowerShell
docker container exec -u root -it zabbix-agent-01 /bin/bash
```

設定ファイルをみたり、ちょっとした疎通確認をするためのパッケージをインストールしておく

```poweshell:パッケージのインストール
apt update
apt install -y vim iproute2 iputils-ping 
```

エージェントの設定ファイル`zabbix_agentd.conf`を確認する
たしかにコンテナを立ち上げたときに指定した値が入っている

```powershell:vi /etc/zabbix/zabbix_agentd.conf（一部抜粋）
# docker run で指定した値が入っている
Server=172.20.240.0
ServerActive=172.20.240.0:10051
Hostname=agent01
```

## いざ、疎通確認

### PINGで疎通確認

#### エージェントからサーバーへPING

```powershell:ping zabbix-server-pgsql
PING zabbix-server-pgsql (172.20.240.2) 56(84) bytes of data.
64 bytes from zabbix-server-pgsql.zabbix-net (172.20.240.2): icmp_seq=1 ttl=64 time=1.85 ms
```

#### サーバーからエージェントへPING

※`docker container exec -it zabbix-server-pgsql /bin/bash`でコンテナの中に入ってから実行

```powershell:ping zabbix-agent-01
PING zabbix-agent-01 (172.20.240.5) 56(84) bytes of data.
64 bytes from zabbix-agent-01.zabbix-net (172.20.240.5): icmp_seq=1 ttl=64 time=0.096 ms
```

### `zabbix_get`コマンドで疎通確認

#### Zabbixサーバーからエージェントのホスト名を取得する

```powershell
zabbix_get -s zabbix-agent-01 -p 10050 -k agent.hostname
# agent01 と表示されればOK
```

## ZabbixサーバーのGUIからエージェントを登録する

1. `localhost:80`にブラウザからアクセスし、ID/PASS=`admin/zabbix`でログインする
1. 画面左のツリーから、設定⇒ホストを選択
1. 画面右上　「ホストの作成」
1. 下記キャプチャ赤字のとおりパラメータを追加する
    1. agent02, agent03 についても連番部分を変更して登録する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/b1b440d7-b121-9c05-bfd2-e487c7dc70b0.png)

### 登録されたあとの様子

３つのエージェントがサーバーのGUIから見えるようになった！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/7b52be44-de48-b2fb-3bde-75bacf092ee7.png)

## トラブルシューティング

### Zabbixサーバーからエージェントが不通

Dockerデスクトップからコンテナのログを確認する
サーバーの指定が間違っていると、下記のようなメッセージが出ている

`failed to accept an incoming connection: connection from "172.20.240.0" rejected, allowed hosts: "zabbix-server-pgsql`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/6e71d569-d3e9-159c-cca6-21cb0602bbfa.png)

## 参考

https://docs.docker.jp/v1.12/engine/userguide/networking/default_network/binding.html

## 糸冬了！！