初めまして、”のなか”です。
今回はAnsibleという自動化ツールによるZabbixサーバーの構築についての話になります。
Ansibleを使えると10分程度でZabbixサーバーを構築できるようになります。
それではAnsibleを使えるようになるためにAnsibleとは何かやどうやって使うのかについて説明していきます。
Ansibleとは
Ansibleの公式ドキュメントでは次のように説明されています。
Ansible は IT 自動化ツールです。 このツールを使用すると、
システムの構成、ソフトウェアの展開、
より高度なITタスク (継続的なデプロイメントやダウンタイムなしのローリング更新など)
のオーケストレーションが可能になります。
簡単に説明するとAnsibleはサーバーやルーターの構築・管理・設定を自動化することを目的として使用されます。
例えば今回のZabbixサーバー構築では公式サイトの手順を全て自動化しています。
さらにAnsibleは様々なモジュールが利用可能なため、DBの作成やZabbixのホスト作成等の様々な設定を自動化できます。
開発環境
・(ホストOS) windows 10
・(ゲストOS) Ubuntu desktop 20.04.4
・virtualbox 6.1
・Ansible 2.9.6
注意点
2022年5月時点ではUbuntu22.04でZabbixサーバーを構築することが出来ないためUbuntu 20.04を使用しています。
今回はパスワードを平文で設定していますが、実際にサーバーを構築する際は暗号化する等の対策をする必要があります。
※本記事は検証を目的とした手順であり、利用するMWバージョンや環境によって手順が異なる場合があります。
前提条件
・virtualboxインストール済み
・仮想環境上でUbuntu desktop 20.04がインストール済み
・Ubuntuが20.04の最新版(Ubuntu 20.04.4)でパッケージリストが最新の状態
・Zabbixサーバーの設定ファイルzabbix_server.confやapache.confを用意済み
構築
Ansibleを使用して自動化するにはplaybookを作成する必要があります。
1. Ansibleをインストール
sudo apt install -y ansible
2. Ansible用にファイルを配置
■ /etc/ansibleにzabbix-install.ymlを配置
- hosts: localhost
become: yes
tasks:
- name: install pip
apt:
name:
- python3
- python3-pip
- name: set python3 to default
shell: update-alternatives --install /usr/bin/python python /usr/bin/python3.8 0
- name: install psycopg2
shell: pip install psycopg2-binary
- name: install zabbix repos
get_url:
url: https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.0-1+ubuntu20.04_all.deb
dest: /tmp
- name: dpkg zabbix repos
shell: dpkg -i /tmp/zabbix-release_6.0-1+ubuntu20.04_all.deb
- name: apt update
shell: apt update
- name: install package
apt:
name:
- zabbix-server-pgsql
- zabbix-frontend-php
- php7.4-pgsql
- zabbix-apache-conf
- zabbix-sql-scripts
- zabbix-agent
- postgresql
- name: install zabbix-api
shell: pip install zabbix-api
- name: create db
become_user: postgres
postgresql_db:
name: zabbix
- name: create user zabbix
become_user: postgres
postgresql_user:
db: zabbix
name: zabbix
password: hogehoge
- name: configure db
shell: zcat /usr/share/doc/zabbix-sql-scripts/postgresql/server.sql.gz | sudo -u zabbix psql zabbix
- name: get server conf backup
shell: cp /etc/zabbix/zabbix_server.conf /etc/zabbix/zabbix_server.conf_org
- name: get apache backup
shell: cp /etc/zabbix/apache.conf /etc/zabbix/apache.conf_org
- name: copy server conf
shell: cp -p /etc/ansible/zabbix_server.conf /etc/zabbix/zabbix_server.conf
- name: copy apache conf
shell: cp -p /etc/ansible/apache.conf /etc/zabbix/apache.conf
- name: restart zabbix server
service:
name: zabbix-server
state: restarted
enabled: yes
- name: restart zabbix agent
service:
name: zabbix-agent
state: restarted
enabled: yes
- name:
service:
name: apache2
state: restarted
enabled: yes
■ /etc/ansibleにzabbix_server.confを配置
LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=0
PidFile=/run/zabbix/zabbix_server.pid
SocketDir=/run/zabbix
DBName=zabbix
DBUser=zabbix
# DBPasswordを追加
DBPassword=hogehoge
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
Timeout=4
FpingLocation=/usr/bin/fping
Fping6Location=/usr/bin/fping6
LogSlowQueries=3000
StatsAllowedIP=127.0.0.1
■ /etc/ansibleにapache.confを配置
# Define /zabbix alias, this is the default
<IfModule mod_alias.c>
Alias /zabbix /usr/share/zabbix
</IfModule>
<Directory "/usr/share/zabbix">
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
<IfModule mod_php7.c>
php_value max_execution_time 300
php_value memory_limit 128M
php_value post_max_size 16M
php_value upload_max_filesize 2M
php_value max_input_time 300
php_value max_input_vars 10000
php_value always_populate_raw_post_data -1
# タイムゾーンを変更
php_value date.timezone Asia/Tokyo
</IfModule>
</Directory>
<Directory "/usr/share/zabbix/conf">
Order deny,allow
Deny from all
<files *.php>
Order deny,allow
Deny from all
</files>
</Directory>
<Directory "/usr/share/zabbix/app">
Order deny,allow
Deny from all
<files *.php>
Order deny,allow
Deny from all
</files>
</Directory>
<Directory "/usr/share/zabbix/include">
Order deny,allow
Deny from all
<files *.php>
Order deny,allow
Deny from all
</files>
</Directory>
<Directory "/usr/share/zabbix/local">
Order deny,allow
Deny from all
<files *.php>
Order deny,allow
Deny from all
</files>
</Directory>
<Directory "/usr/share/zabbix/vendor">
Order deny,allow
Deny from all
<files *.php>
Order deny,allow
Deny from all
</files>
</Directory>
3. Zabbixをインストールするplaybook実行
ansible-playbook zabbix-install.yml
4. WEBインターフェースによるZabbixインストール
localhost/zabbixにアクセスし、公式ドキュメントを参考にインストールします。
Configure DB connectionの画面はポート番号とパスワードを入力することでDBに接続できます。
– Database port: 5432
– Password: hogehoge
5. Zabbixを設定するplaybookを実行
■ /etc/ansibleにconfigure-zabbix.ymlを配置
- hosts: localhost
become: yes
tasks:
- name: Create a new host or update an existing host's info
local_action:
module: zabbix_host
server_url: http://localhost/zabbix/
login_user: Admin
login_password: zabbix
host_name: ExampleHosts
host_groups:
- Linux servers
link_templates:
- Linux CPU by Zabbix agent
interfaces:
- type: 1
main: 1
useip: 1
ip: 172.0.0.1
dns: ""
port: 10051
6. 動作確認
WEB画面でExampleHostsが作成されていることを確認します。
改善点
現状では最小構成かつ冪等性があまり無いためロールや特定の条件(DBが既にある等)における処理やOS・バージョンによる分岐等を設定することで、冪等性がある状態になり複雑なサーバーの構築や設定もできるようになります。
サーバーにAnsible等の不要なパッケージをインストールしたくない場合は、構築するサーバー側のSSHやhostsを設定することでホストOSや別のサーバーからAnsibleを実行できます。
所感
今回Ansibleで構築するにあたり主に2点難しいと感じました。
まず1点目はサーバーの設定ファイルの用意です。本記事のZabbixサーバーの設定ファイルは、一度Zabbixサーバーを構築し、デフォルトの設定ファイルを元に作成しました。コードで設定ファイルを用意できれば、手間が少なくなり冪等性がある設定にできます。
次に2点目はAnsibleで自動化する時の処理の順番です。
パッケージのインストールの順番を変更したりまとめると動かなくなる部分が多々あります。今回はなるべくサーバーの構築を自動化したかったためplaybookが長くなりましたが、pythonのインストールを手動で実施したり、パッケージのインストールだけでも別で作成する等の工夫でもう少しシンプルにできます。
サーバーやルーターを毎回構築しているとかなりの手間なので、よく使うサーバーの設定やパッケージのインストールだけでも自動化しておくと便利かと思うので皆さんも是非試してみてください。