初めまして、インフラソリューション部の"のなか"です。
今回は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のインストールを手動で実施したり、パッケージのインストールだけでも別で作成する等の工夫でもう少しシンプルにできます。
サーバーやルーターを毎回構築しているとかなりの手間なので、よく使うサーバーの設定やパッケージのインストールだけでも自動化しておくと便利かと思うので皆さんも是非試してみてください。
■ AGESTは一緒に働くメンバーを募集しています!