NECネッツエスアイ

コンテナ基盤上でZabbixを自動設定してみた(連載②:AnsibleのPlaybookでZabbixへの登録を自動で行えるようにする)

はじめに

こんにちは!
事業開発推進部インフラ運用SLチームの倉田です。
連載第2回目ではZabbixへ監視対象サーバを自動登録できるような仕組みをAnsibleのPlaybookを用いて構築する流れを紹介します。

目次
①コンテナにAnsibleのインストール
②Playbook全体構成の説明
③Zabbix-agentを監視対象サーバにインストールするPlaybookの作成
④監視対象サーバをZabbixに自動登録するPlaybookの作成
⑤Role用のPlaybookの作成、実行

用語説明
・Ansible:IT 自動化ツールです。 このツールを使用すると、システムの構成、ソフトウェアの展開、より高度なITタスク (継続的なデプロイメントやダウンタイムなしのローリング更新など) のオーケストレーションが可能になります。
・Playbook:Ansible の設定、デプロイメント、オーケストレーション言語です。リモートのシステムが実施するポリシー、または一般的な IT プロセスの一連の手順を記述します。
・Role:既知のファイル構造に基づいて特定の vars_files、タスク、およびハンドラーを自動的に読み込む方法です。 ロールでコンテンツをグループ化すると、他のユーザーとのロールの共有が容易になります。
※参考記事①

コンテナ実行環境
・AWS EC2

前提条件
・監視対象サーバの設定がSSH接続の際にパスワード認証で接続できるようになっていること
・Dockerが使える環境であること

イメージ図

①コンテナにAnsibleのインストール

まずはPlaybookが実行可能な環境を作るためにRocky LinuxのコンテナにAnsibleをインストールする必要があります。Rocky Linuxを選択したのはCentOSの後継の一つであり、汎用性が高いためです。

・Rocky Linuxのコンテナ構築
<sshで接続したEC2上で操作>
例)Rocky Linuxのコンテナの構築

docker run -d -t --name <任意のコンテナ名> rockylinux/rockylinux:latest

docker runコマンドを実行後、コンテナが作成されているか確認し、 作成できていたらコンテナ内に移動します。

docker ps
docker exec -it <コンテナ名> /bin/bash

・EPEL(Extra Packages for Enterprise Linux)の追加
EPELとはRHELの公式パッケージリポジトリに含まれていないパッケージを提供するプロジェクトです。こちらに含まれるパッケージを用いるために追加します。※参考記事②
<コンテナ上で操作>

yum install epel-release

・構築したRocky Linuxのコンテナ内でAnsibleをインストール
yumコマンドを用いてAnsibleをインストールします。
<コンテナ上で操作>

yum install ansible

以上でAnsibleのインストールは完了です。

②Playbook全体構成の説明

今回の検証ではAnsibleのroleを使います。※参考記事③
「Zabbix-agentを監視対象のサーバにインストールPlaybook」と「監視対象であるサーバをZabbixに自動登録するPlaybook」の2つのグループに分けてroleを作成しました。
Playbookのroleの構成図は以下のようになります。
<構成図>

.ansible.cfgファイルとinventoryファイルについて説明します。

.ansible.cfg

[defaults]
inventory   = /root/foransible/inventory/inventory #inventoryのパス指定 
roles_path = /root/foransible/docker-ansible/roles #roleのパス指定 
host_key_checking = False #known_hostsのkeyをチェックするかを指定

.ansible.cfgはAnsibleの設定を制御する役目があります。※参考記事④

/inventory

[all:vars]
ansible_user=root #監視対象にログインするときのユーザー名 
ansible_port=22 #監視対象に接続するときのポート番号   

#監視対象サーバの情報 
[Linux_Server] 
<19*.***.***.**3> hostname=<AAA> ansible_ssh_pass=<pass>   

#Playbook内の値の変数一覧(監視項目やグループなどzabbix側の設定)
[Linux_Server:vars] 
hostgroups=Linux servers 
linktemplates=Linux by Zabbix agent 
zabbix_agent_package=zabbix-agent-6.0.10-release1.el8.x86_64.rpm 
zabbix_server_ip=<1**.***.**1> 
zabbix_host_name=Zabbix server 
serverurl=http://zabbix-web:**/api_jsonrpc.php 
loginuser=<BBB> 
loginpassword=<pass_BBB>

inventoryでは監視対象サーバの接続に必要な値やPlaybook内の変数の指定で用いる値が記載されています。

③Zabbix-agentを監視対象サーバにインストールする
 Playbookの作成


次にZabbix-agentを監視対象にインストールするPlaybookについて説明します。
Zabbix-agentインストールのrole構成

tasksの下にmain.ymlでplaybookを配置します。filesの下にインストールするZabbix-agentファイル、templatesの下にZabbix-agentの接続設定時に必要なzabbix_agentd.confのテンプレートファイルを配置しています。
/docker-ansible/roles/zabbix-agent/tasks/main.yml

--- 
#filesにあるzabbix-agentのパッケージを対象サーバーにコピー
- name: Copy Package   
  copy:     
    src: "{{ item }}"     
    dest: /tmp/   
  loop:     
     - "{{ zabbix_agent_package }}" #inventoryファイルで指定  

#zabbix-agentをインストールす
- name: Install Package   
  yum:   
   name:     
    - /tmp/{{ zabbix_agent_package }}    
   disable_gpg_check: yes    
   state: present   

#Zabbixの監視対象設定のテンプレート 
- name: Configuration for Zabbix Agent   
  template:     
    src: zabbix-agent.j2     
    dest: /etc/zabbix/zabbix_agentd.conf     
    owner: zabbix     
    group: zabbix   

#Zabbix Agentのプロセス起動 
- name: Start Zabbix Agent   
  service:     
    name: zabbix-agent     
    state: restarted      
    enabled: true

以上のような構成とPlaybookを作成することで監視対象サーバへzabbix-agentのインストール用Playbookが完了します。

④監視対象サーバをZabbixに自動登録するPlaybookの作成


次にZabbix-agentを監視対象にインストールするPlaybookについて説明します。
Zabbixに自動登録のrole構成

こちらのroleではtasksの配下にplaybook実行用のmain.ymlが配置されています。
/docker-ansible/roles/zabbix-create-host/tasks/main.yml

--- 
#Zabbixの監視設定自動登録   
  - name: Create host on Zabbix     
    local_action:       
      module: zabbix_host       
      server_url: "{{ serverurl }}" #ZabbixサーバのURL 例)http://****/api_jsonrpc.php       
      login_user: "{{ loginuser }}" #Zabbixサーバのユーザ 例)Admin       
      login_password: "{{ loginpassword }}" #Zabbixサーバのパスワード 例)Password       
      host_name: "{{ hostname }}" #登録するホスト名 例)host       
      host_groups:         
        - "{{ hostgroups }}"  #登録するホストグループ 例)linux server       
      link_templates:         
        - "{{ linktemplates }}" #ホストに割り当てる監視テンプレート 例)Linux by Zabbix agent    
      status: enabled #監視の有効化・無効化の選択       
      state: present #ホストの設定の有無       
      interfaces: #監視対象ホストのインターフェース設定         
        - type: 1           
          main: 1           
          useip: 1           
          ip: "{{ ansible_default_ipv4.address }}" #対象サーバーのデフォルトのIPアドレス        
          dns: ""           
          port: 10050

以上のような構成とPlaybookを作成することで監視対象であるサーバをZabbixに自動登録用Playbookが完了します。

⑤Role用のPlaybookの作成、実行


①の構成図を参考にplaybookを作成し、roleを実行します。実際に実行するのはansible-docker.ymlです。
/docker-ansible/ansible-docker.yml

---
- hosts: test_server
  gather_facts: true
  roles:
    - zabbix-agent
    - zabbix-create-host

上記のようにplaybook内を作成し、ansible-playbookのコマンドで実行します。

ansible-playbook ansible-docker.yml

ZabbixのGUI画面上にて「設定」→「ホスト」の画面を開き、名前の欄にインベントリファイル内にhostnameとして記載した名前が登録されていること(画像一枚目)、同画面の右側のエージェントの状態の欄が緑色になっていること(画像二枚目)が確認出来たら登録完了です。

まとめ

上記の手順より、コンテナ内でplaybookを実行するとzabbixに監視対象サーバの登録が自動で行われるようになります。

次回は「Dockerfileを用いてコンテナのイメージの作成」について投稿します。

参考記事

参考記事①
Ansible とは | Red Hat
Ansible Playbook とは | Red Hat
ロール — Ansible Documentation

参考記事②
Extra Packages for Enterprise Linux (EPEL) :: Fedora Docs (fedoraproject.org)

参考記事③
【Ansible】 Role 使用方法 まとめ – RAKUS Developers Blog | ラクス エンジニアブログ

参考記事④
ansible.cfgの項目をリスト化してみた – Qiita
 

関連記事

TOP