ブロードバンドタワー國武です。
最近、しばらく離れてた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に登録しようかと思ったんですが、ベタにファイルに書いて
$ 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 で対応できるのですが、入れものであるホストグループ自体は、事前に作成しておく必要があります)
さて、ホストの登録はこれで楽ができそうなものの、テンプレート作成が大変だなぁ……
本ブログの情報につきましては、自社の検証に基づいた結果からの情報提供であり、
品質保証を目的としたものではございません。