RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

【Ansible Zabbixモジュール】監視設定の自動化

はじめに

はじめまして、インフラ担当のfasahikoです。
今回のブログでは、「Ansibleを利用してZabbixサーバの設定を行う」をテーマに書きたいと思います。

Zabbixで監視を行っている且つ、Ansibleで設定を管理したい方(かなりピンポイントですが)を対象に、
AnsibleのインストールからZabbixモジュールを利用した設定までをご紹介したいと思います。
日々の運用を楽にするために、少しでもお役に立てれば幸いです。

導入のきっかけ

今回ブログテーマのZabbixの設定自動化を導入した背景ですが、現在担当している商材では管理対象サーバが多く、
メンテナンスや構成変更時、新規サーバ構築時などにZabbixのGUIでポチポチと設定を行うことが苦痛に感じたことが発端です。
ZabbixのGUI操作で行うと1時間かかる設定作業が、Ansibleでの自動化で数分で設定できるので、運用をかなり楽にすることが出来たと思います。
次項から、今回のテーマであるAnsibleとZabbixモジュールについての概要を紹介します。   

Ansibleとは

インフラ構成管理ツールとして多く利用されているためご存知の方も多いと思いますが、
Ansibleとはどのようなものなのか簡単におさらいをしておきます。

  • Ansibleとは

Ansibleとは、システム設定やソフトウェアの導入(インストール)などを自動化、効率化する構成管理ツールの一つ。米レッドハット(Red Hat)社が開発・販売しており、オープンソースソフトウェアとしても公開されている。                                IT用語辞典 e-wordsより抜粋

Ansibleは、Playbookというファイル群(ファイルの形式はYAML)に管理対象のサーバ構成を記載していきます。
Ansbileで管理できる設定や対象機器は多岐に渡っており、できないことはほぼないのではと思えるくらい構成管理用のモジュール(機能)が豊富に用意されています。

Ansible Zabbixモジュールとは

次に、Ansible Zabbixモジュールについてです。
AnsibleでZabbix上の設定を管理するためのモジュール群で、設定箇所毎にモジュールが開発されています。
現在、Ansible公式のモジュール一覧を参照すると以下のようなZabbixモジュールが用意されているようです。

・zabbix_action
・zabbix_group
・zabbix_group_info
・zabbix_host
・zabbix_host_info
・zabbix_hostmacro
・zabbix_maintenance
・zabbix_map
・zabbix_proxy
・zabbix_screen
・zabbix_template

等、詳しくはAnsible公式ドキュメントに載っています。 今回は上記の中から"zabbix_host"モジュール、"zabbix_maintenance"モジュールの実装例について紹介します。

Ansible,Zabbix-apiのインストール

それでは、実際にAnsibleのインストールからZabbixモジュールの利用までを見ていきたいと思います。
今回はCentOS7の上にAnsibleをインストールします。
以下のコマンドを実行し、Ansible本体とZabbixモジュール利用時に必要となるzabbix-apiをインストールします。

$ yum install epel-release
$ yum install python-pip
$ pip install ansible
$ pip install zabbix-api

Ansible Zabbixモジュールでの自動化

ホスト設定

Ansibleとzabbix-apiのインストールが完了したので、早速Zabbixサーバ上のホスト設定をAnsibleで実行したいと思います。
まずは簡単に、以下のようなコードを作成して設定されるか実際にテストしてみます。
それぞれのパラメータについては公式に解説がありますが、以下のような形でそれぞれZabbixサーバのホスト設定に登録するパラメータを記載します。

$ zabbix_host_set.yml
- hosts: localhost                                # Ansible接続先をlocalhostに指定
  tasks:
    - name: Create host on zabbix
      local_action:                               # zabbix_hostモジュール利用時はlocal_action: にてローカルでのタスク実行とする
        module: zabbix_host                       # 利用モジュールの指定
        server_url: "http://192.168.1.10/zabbix"  # ZabbixサーバのURL
        login_user: admin                         # Zabbixサーバのユーザ
        login_password: admin                     # Zabbixサーバのパスワード
        host_name: "test-vm01.localdomain"        # 登録するホスト名
        host_groups:                              # 登録するホストグループ
          - test
        link_templates:                           # ホストに割り当てる監視テンプレート
          - Template_OS_Linux_Monitor
        status: enabled                           # 監視の有効化・無効化の選択
        state: present                            # ホストの設定の有無、『present』はホストを登録、『absent』であれば削除になる
        interfaces:                               # 監視対象ホストのインターフェース設定
          - type: 1
            main: 1
            useip: 1
            ip: "192.168.1.21"
            dns: ""
            port: 10050

設定したいホストの情報を上記の通りPlaybookに記載し、以下コマンドを実行します。

$ ansible-playbook zabbix_host_set.yml

コマンドの実行完了後、Zabbixサーバ側を見てみると確かに追加されています。

  

上記の通り追加はできましたが、このままだとPlaybookに登録対象の設定をベタ書きしており
複数台の登録に対応できないのでもう少しAnsibleの関数を上手く利用できる形にしたいと思います。

以下のような構成でコードを再作成しました。

|-- inventories
|   `-- hosts
|-- roles
|   `-- zabbix
|       `-- tasks
|           `-- host_setting.yml
|-- zabbix_host_set.yml

それぞれのファイルの中身は以下の通りです。

  • inventories/hosts

対象はテストサーバとして2台を設定しています。

$ inventories/hosts
[test_server]
192.168.1.21    # ホスト名はtest-vm01.localdomain
192.168.1.22    # ホスト名はtest-vm02.localdomain
  • zabbix_host_set.yml

上述のテストではhostsをhosts: localhostとしていましたが、
test_serverにAnsibleで接続する形hosts: test_serverに変更し、かつgather_facts:Trueとして
test_serverのサーバ構成情報を取得・利用できるようにしています。

$ zabbix_host_set.yml
---
- hosts: test_server
  gather_facts: True
  tasks:
    - include_role:
        name: zabbix
        tasks_from: host_setting.yml
  • roles/zabbix/tasks/host_setting.yml

前述の通りgather_facts:Trueとしてfact変数を利用できる形にしていたので、
可変部分のパラメータ設定(host_name,ip)はそのfact変数から取ってこれるようにしています。
(対象サーバのIPアドレスやホスト名はfact変数を利用せず、varsファイル内で変数定義をすべきなのですが、
導入時点では対象サーバ個々の構成管理は出来ていなかったため、実行時に対象サーバに接続し都度取得できるよう以下のようなコードとしました。)

$ roles/zabbix/tasks/host_setting.yml
---
- name: Create host on Zabbix
  local_action:
    module: zabbix_host
    server_url: "http://192.168.1.10/zabbix"
    login_user: admin
    login_password: admin
    host_name: "{{ ansible_fqdn }}"
    host_groups:
      - test
    link_templates:
      - Template_OS_Linux_Monitor
    status: enabled
    state: present
    interfaces:
      - type: 1
        main: 1
        useip: 1
        ip: "{{ ansible_eth0.ipv4.address }}"
        dns: ""
        port: 10050

以下のコマンドで実行してみます。

$ ansible-playbook -i inventories/hosts zabbix_host_set.yml

Zabbixサーバ側を確認するとホスト名やIPアドレスも誤りなく登録されています。    

実際に私が利用したケースでは、Zabbix上のホスト設定のIPアドレス部分の更新が必要となったため、
上記のようなコードで設定を一括更新しました。
御覧の通り実装はすごく簡単なため、似たような手動の運用がある場合はすぐに切り替えることをお勧めします。

メンテナンス設定

次に簡単ではありますが、メンテナンス設定時に利用するzabbix_maintenanceモジュールについて記載します。

Zabbix上のホストグループ単位でメンテナンス設定を入れる場合は必要性はあまり感じませんが、
特定のホストグループ内の数十台だけにメンテナンス設定したいといった場合はかなり役立つと思います。

具体的には以下の形でコードを作成しました。

$ add_zabbix_maintenance.yml
- hosts: localhost
  connection: local
  tasks:
    - name: Create maintenance Setting
      connection: local
      zabbix_maintenance:                 # 利用モジュールの指定
        name: Maintenance for VersionUP   # メンテナンスの名前 
        state: present                    # メンテナンス設定の有無、『present』は登録、『absent』であれば削除になる
        collect_data: yes                 # メンテナンスタイプの『データ収集あり』か『データ収集なし』の設定
        minutes: 300                      # メンテナンス期間(ここでは設定反映時点から300分間のメンテナンス設定となる)
        server_url: http://192.168.1.10/zabbix
        login_user: admin
        login_password: admin
        host_names:                       # メンテナンス設定を行うホスト
          - test-vm01.localdomain
          - test-vm02.localdomain

メンテナンス設定対象のホスト名を最後のhost_names以下に羅列し、
以下のコマンドを実行します。

$ ansible-playbook add_zabbix_maintenance.yml

実行後、確かに意図した通りのメンテナンス設定が入っており、指定したホストもメンテナンス対象に指定されています。
ただし、実行した時間からメンテナンス設定が開始となります。
この部分についてはメンテナンスの開始・終了時間が指定できればと惜しく思ったところです。
他力本願でお恥ずかしいですが今後のモジュールのメンテナンスに期待したいと思います。

   

終わりに

Ansible Zabbixモジュールを用いたZabbixサーバ上の設定自動化を紹介しました。
Zabbixサーバ設定を自動化するにはZabbixAPIを利用する方法も考えられますが、
APIは使い慣れていないけど、Ansibleなら使っているといった方にはこのZabbixモジュールを利用する方が導入しやすいと思います。

今回は設定作業をAnsible Zabbixモジュールで自動化した形ですが、Ansible本来の目的はコードでの構成管理です。
そのため今後は、Zabbixモジュールを用いてZabbixサーバ自体の構成管理を進めていければと考えています。

以上、最後までお読み頂きましてありがとうございました。


◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.