はじめに
こんにちは!
事業開発推進部インフラ運用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 | ラクス エンジニアブログ