見出し画像

【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 のドキュメントにある

Best Practices

の中で、個人的に一押しの “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 で対応できるのですが、入れものであるホストグループ自体は、事前に作成しておく必要があります)

さて、ホストの登録はこれで楽ができそうなものの、テンプレート作成が大変だなぁ……

ブロードバンドタワーのエンジニアブログ『 Tower of Engineers 』で公開されていた記事をnoteに再投稿させていただきました。

過去(2019年9月27日掲載)のものではありますが、皆様に再び楽しんでいただけると嬉しいです。これからも、価値ある記事や興味深い内容を、noteでシェアさせていただく予定です。どうぞ楽しみにお待ちください。

X(旧Twitter)でも情報を発信しております。ぜひフォローお願いします!