AGEST Engineers Blog

株式会社AGESTのテックブログです。

AnsibleによるZabbixサーバー構築

初めまして、インフラソリューション部の"のなか"です。
今回は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は一緒に働くメンバーを募集しています!

hrmos.co

hrmos.co

hrmos.co

  • f:id:zo_03:20211213095237p:plain
  • f:id:zo_03:20211213095237p:plain
©AGEST, Inc.