【2019年9月27日掲載】Ansible で zabbix のホスト登録をしてみる
ブロードバンドタワー國武です。
最近、しばらく離れてたZabbixですが、再び本格的に触り始めました。
ちょっと復習がてら、いろいろ調べてたら、最近はZabbixへのホスト登録に Ansible が使えるんですね!ネットワーク機器を大量に登録することを考えてたので、これは助かります。
Zabbix host creates/updates/deletes
自分でプログラム書き、ちまちまAPI叩いてたことが、嘘のように楽になった気がします(と書きながら、一部で機能が足りてなくて、Ansible本体に手を入れるか、やっぱりAPIで叩くか悩むことに……)
下記は、上記サイトにあるサンプルからの抜粋ですが、ansible を使って、zabbix-api経由でホストが登録できます。
- name: Create a new host or update an existing host's info
local_action:
module: zabbix_host
server_url: http://monitor.example.com
login_user: username
login_password: password
host_name: ExampleHost
visible_name: ExampleName
description: My ExampleHost Description
host_groups:
- Example group1
- Example group2
link_templates:
- Example template1
- Example template2
status: enabled
state: present
interfaces:
- type: 1
main: 1
useip: 1
ip: 10.xx.xx.xx
dns: ""
port: 10050
試したところ、host_groups のエントリに日本語を含むホストグループ名を使っていても、ちゃんと登録できました。
これは良さそう!ということで、これを使ってzabbixに登録しようかと思ったんですが、ベタにファイルに書いて
1
$ ansible-playbook entries.yaml
を実行するのは、さすがにナンセンスだと感じたので、Ansible のドキュメントにある
の中で、個人的に一押しの “Alternative Directory Layout”の形で使うことを考えてみます。
ディレクトリレイアウトについて
今回やりたかったことは
ホストの登録(IPアドレス&SNMP設定)
対象なるホストは、ネットワーク機器
ホストのグループ設定
グループは、iDCと機種別にします。
機種別に、事前準備したテンプレートをリンク
Zabbix Server は完全別系統で2重で持つ
でした。それに合わせ、今回使うディレクトリレイアウトは下記のような形にしました、
├── inventories
│ ├── zabbix-blue
│ │ ├── group_vars
│ │ │ └── Model
│ │ │ ├── AX3800S.yml
│ │ │ ├── AX3830S.yml
│ │ │ └── AX4600S.yml
│ │ ├── host_vars
│ │ │ ├── sw1.yml
│ │ │ ├── sw2.yml
│ │ │ ├── sw3.yml
│ │ │ └── sw4.yml
│ │ └── hosts
│ └── zabbix-green
│ ├── group_vars -> ../zabbix-blue/group_vars
│ ├── host_vars -> ../zabbix-blue/host_vars
│ └── hosts
├── main.yml
└── roles
└── zabbix-hosts
└── tasks
└── main.yml
zabbix は blue と green の2系統で分けてますが、設定するホストの内容は一緒なので、ansibleのインベントリファイル以外は一緒になるように、シンボリックリンクを張っています。
詳細について触れていきます。
zabbix_host モジュールの呼び出し
main.yml を見てみましょう
---
- hosts: all
gather_facts: no
roles:
- zabbix-hosts
呼び出し部分はこれだけです。
zabbix-hosts ロールについて
別に名前はなんでもよかったんですが、zabbix-hosts ロールとして、 Ansible の zabbix_host モジュールをここから呼び出しています。
roles/zabbix-hosts/tasks/main.yaml
の中身を見ましょう
---
- name: Create a new host or update an existing host's info
local_action:
module: zabbix_host
server_url: "{{ zabbix_server_url }}"
login_user: "{{ zabbix_login_user }}"
login_password: "{{ zabbix_login_password }}"
host_name: "{{ inventory_hostname }}"
visible_name: "{{ inventory_hostname }}"
description: "{{ description }}"
host_groups: "{{ group_names }}"
link_templates: "{{ link_templates }}"
status: enabled
state: present
interfaces: "{{ interfaces }}"
この内、zabbix-api の接続情報である
zabbix_server_url
zabbix_login_user
zabbix_login_password
などは、zabbix-blue, zabbix-green で値が異なるので
inventories/zabbix-blue/host_vars
に埋め込んでいます。
[all:vars]
zabbix_server_url=http://zabbix-blue.example.com
zabbix_login_user=api-user
zabbix_login_password=api-user-pwd
当然 inventories/zabbix-green/host_vars に埋め込んでいるのは別のURLです。
host_vars について
“ホスト名.yml” の形式でホスト固有の情報を記述しておきます。
description: test entry
interfaces:
- type: 1
main: 1
useip: 1
ip: 127.0.0.1
dns: ""
port: 10050
- type: 2
main: 1
useip: 1
ip: 192.0.2.1
dns: "sw1.example.com"
port: 161
type やら useip などの意味は Zabbix の
https://www.zabbix.com/documentation/2.0/manual/appendix/api/hostinterface/definitions#host_interface
にそのまま準拠しています。
group_vars について
group_varsでは、機種別にリンクすべきテンプレートを指定しています。たとえばこんな感じです。
link_templates:
- Template AX3800S
- Template Geneirc snmptrap
ちなみに、最近の Zabbix ではホストグループを階層化できるようになりました。その手法は単純で
Model
Model/AX3600S
Model/AX3800S
Model/AX4600S
のように、”/” でサブグループになってることを示すというものです。Ansible 側は、ディレクトリレイアウトで挙げたように、単純にディレクトリを作成することで、このような階層化されたグループと整合性を取ることができました。
インベントリファイルについて
hosts というファイル名で、下記のように記載します(下記の例は、zabbix-blue側)
[iDC/大手町]
sw1
sw2
[iDC/新大手町サイト]
sw3
sw4
sw5
[Model/AX3600S]
sw1
sw4
[Model/AX3800S]
sw1
sw2
[Model/AX4600S]
sw5
[all:vars]
zabbix_server_url=http://zabbix-blue.example.com
zabbix_login_user=api-user
zabbix_login_password=api-user-pwd
これにより sw1 は “iDC/大手町” と “Model/AX3800S” の2つのホストグループに入れられます。その他のホストも同様に、zabbix上で、インベントリファイルに書いてあるグループ名と同じホストグループに入れられます。
実際の利用
$ ansible-playbook -i inventries/zabbix-blue main.yaml
のように使います。正常に登録できれば zabbix-green 側も設定します。
$ ansible-playbook -i inventries/zabbix-green main.yaml
ただ、当然ながら Zabbixのウェブインターフェース側でホスト情報を書き換えてしまうと、次回 ansible 実行時に ansible 側の設定情報で書き戻ってしまうことに注意が必要です(なお、ホストグループ自体の出し入れは今回の ansible playbook で対応できるのですが、入れものであるホストグループ自体は、事前に作成しておく必要があります)
さて、ホストの登録はこれで楽ができそうなものの、テンプレート作成が大変だなぁ……