【初心者向けハンズオン】インフラ構築自動化 ~Step5:Apacheのインストール・Tomcat連携~

本シリーズではAnsibleを適用してWeb3層システム(Apache/Tomcat/Postgres)を自動構築する方法をご紹介しています。
今回は最後のStep5としてApacheのインストールおよびTomcatとの連携方法をご紹介しますので、ぜひ参考していただければと思います。


    まだAnsibleインストール、OS基本設定、Postgresインストール、Tomcatが済んでいない方は下記のStep1、Step2、Step3、Step4の記事を参考にしてみて下さい。
    【Ansible/インフラ構築自動化】Step1:Ansibleのインストール方法(AWS EC2/CentOS7)
    【Ansible/インフラ構築自動化】Step2:AWS EC2に構築したCentOSの基本設定

    【Ansible/インフラ構築自動化】Step3:Postgresインストール/データベース作成
    【Ansible/インフラ構築自動化】Step4:Tomcatのインストール・Postgres連携

    1. ymlファイル作成

    1.1 ディレクトリ作成

    まずはAnsibleユーザでmkdirコマンドを実行し、下記の通りディレクトリを作成して下さい。

    [ansible@ip-172-31-81-212 ~]$ tree
    .
    └── websystem
        └── roles
            ├── apache
            │   ├── files
            │   ├── tasks
            │   ├── tests
            │   └── vars
    
    1.2 プレイブック作成(main.yml)

    次はtasksディレクトリにmain.ymlを作成していきます。各タスクの内容は下記の通りです。
    ・check_install.yml:インストール前の事前準備
    ・install.yml:インストール作業
    ・configure.yml:設定作業

    [ansible@ip-172-31-81-212 ~]$ vi ./websystem/roles/apache/tasks/main.yml
    [ansible@ip-172-31-81-212 ~]$ cat ./websystem/roles/apache/tasks/main.yml
    ---
    # tasks file for ./roles/
    
    - include_tasks: roles/apache/tasks/check_install.yml
    - include_tasks: roles/apache/tasks/install.yml
    - include_tasks: roles/apache/tasks/configure.yml
    
    [ansible@ip-172-31-81-212 ~]$
    1.3 インストール事前設定用yml作成(check_install.yml)

    インストールする前の設定確認・変更を行います。下記の通りtasksディレクトリにcheck_install.ymlを作成して下さい。ここではApacheが使うポートの許可設定を入れています。実際に使用するポート番号(80)の情報は後ほど/varsディレクトリのファイルに記載しますので、ここでは一旦、下記の通り作成してみて下さい。

    [ansible@ip-172-31-81-212 ~]$ vi ./websystem/roles/apache/tasks/check_install.yml
    [ansible@ip-172-31-81-212 ~]$ cat ./websystem/roles/apache/tasks/check_install.yml 
    ---
    # tasks file for ./roles/apache
    
    - name: check_install / Allow ports for firewalld
      firewalld:
        port: "{{ item }}"
        permanent: yes
        immediate: yes
        state: enabled
      loop: "{{ apache_firewalld_port }}"
    
    1.4 インストール用yml作成(install.yml)

    続いてApacheのインストールです。tasksディレクトリに配下にinstall.ymlを作成して下さい。yumコマンドでパッケージをインストールしていきます。

    [ansible@ip-172-31-81-212 ~]$ vi ./websystem/roles/apache/tasks/install.yml
    [ansible@ip-172-31-81-212 ~]$ cat ./websystem/roles/apache/tasks/install.yml
    ---
    # tasks file for ./roles/apache
    
    - name: install / Install required packages
      yum:
        name: "{{ apache_packages }}"
        state: present
    
    1.5 設定変更用yml作成(configure.yml)

    続いてApacheの設定作業です。tasksディレクトリに配下にconfigure.ymlを作成して下さい。各処理の詳細は下記の通りです。

    1. httpd.confの配置
      Apacheの設定ファイルであるhttpd.confファイルを置き換える処理を記載しています。httpd.confファイルは事前に編集してfilesディレクトリに格納しておく必要があるので後述します。
    2. Apache起動
      systemdコマンドでApacheを起動しています。
    3. Apache起動確認
      Apache起動後のステータスを確認する処理を記載しています。起動に少し時間がかかるので適当なdelay、timoutの時間を指定します。
    [ansible@ip-172-31-81-212 ~]$ vi ./websystem/roles/apache/tasks/configure.yml
    [ansible@ip-172-31-81-212 ~]$ cat ./websystem/roles/apache/tasks/configure.yml
    ---
    # tasks file for ./roles/apache
    
    #1.httpd.conf配置
    - name: configure / Setup global configuration file
      copy:
        src: httpd.conf
        dest: /etc/httpd/httpd.conf
        owner: root
        group: root
        mode: 0644
    
    #2.Apache起動
    - name: configure / Start apache service
      systemd:
        name: httpd
        state: reloaded
        enabled: yes
    
    #3.Apache起動確認
    - name: configure / Wait for apache restart
      wait_for:
        host: "{{ ansible_default_ipv4.address }}"
        port: "{{ apache_service_port }}"
        delay: 3
        timeout: 60
    
    
    
    1.6 設定ファイル作成

    1.5で反映するための設定ファイル(httpd.conf)をfilesディレクトリ配下に格納しておいてください。要件に応じて設定内容を変更します。今回はTraceEnable設定をOFFにしています。

    [root@ip-172-31-81-212 ~]# vi /home/ansible/websystem/roles/apache/files/httpd.conf
    [root@ip-172-31-81-212 ~]# cat /home/ansible/websystem/roles/apache/files/httpd.conf |grep TraceEnable
    TraceEnable off
    [root@ip-172-31-81-212 ~]# ll /home/ansible/websystem/roles/apache/files/
    total 24
    -rw-r--r--. 1 ansible ansible 1834 Mar  2 16:21 httpd.conf
    1.7 変数定義

    続いて変数を定義しましょう。varsディレクトリ配下にmain.ymlを作成して変数に具体的な値を入れます。

    [ansible@ip-172-31-81-212 ~]$ vi ./websystem/roles/apache/vars/main.yml
    [ansible@ip-172-31-81-212 ~]$ cat ./websystem/roles/apache/vars/main.yml
    ---
    # vars file for ./roles/apache
    
    apache_service_port: 80
    apache_firewalld_port:
      - "{{ apache_service_port }}/tcp"
    apache_packages:
      - httpd
    1.8 実行対象有効化

    最後にTomcatのplaybookが実行されるように、前のStepで作成したwebsystem_install.ymlのrole:postgresに関する記載のコメントアウトを外しておきましょう。

    [ansible@ip-172-31-81-212 ~]$ vi /home/ansible/websystem/websystem_install.yml
    [ansible@ip-172-31-81-212 ~]$ cat /home/ansible/websystem/websystem_install.yml
    ---
    - name: Install for web system
      hosts: websystem
      become: true
      roles:
        - { role: common, tags: common }        ##OS setting
        - { role: postgres, tags: postgres }    ##Postgres Install/setting
        - { role: tomcat, tags: tomcat }        ##Tomcat Install/setting
        - { role: apache, tags: apache }        ##Apache Install/setting
    [ansible@ip-172-31-81-212 ~]$
    
    

    2. プレイブック実行

    2.1 プレイブック実行

    続いてansible-playbookコマンドを実行していきましょう。NGだった場合には-vvvvオプションをつけてエラー内容を確認して修正してみて下さい。

    [ansible@ip-172-31-81-212 websystem]$ ansible-playbook -i ./inventory/inventory.ini  ./websystem_install.yml -t apache
    
    PLAY [Install for web system] ***********************************************************************************************************************************************
    
    TASK [Gathering Facts] ******************************************************************************************************************************************************
    
    ok: [web1i]
    
    TASK [apache : include_tasks] ***********************************************************************************************************************************************
    included: /home/ansible/websystem/roles/apache/tasks/check_install.yml for web1i
    
    TASK [apache : check_install / Allow ports for firewalld] *******************************************************************************************************************
    ok: [web1i] => (item=80/tcp)
    
    TASK [apache : include_tasks] ***********************************************************************************************************************************************
    included: /home/ansible/websystem/roles/apache/tasks/install.yml for web1i
    
    TASK [apache : install / Install required packages] *************************************************************************************************************************
    ok: [web1i]
    
    TASK [apache : include_tasks] ***********************************************************************************************************************************************
    included: /home/ansible/websystem/roles/apache/tasks/configure.yml for web1i
    
    TASK [apache : configure / Setup global configuration file] *****************************************************************************************************************
    changed: [web1i]
    
    TASK [configure / Start apache service] *************************************************************************************************************************************
    changed: [web1i]
    
    TASK [configure / Wait for apache restart] **********************************************************************************************************************************
    ok: [web1i]
    
    PLAY RECAP ******************************************************************************************************************************************************************
    web1i                      : ok=9    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    
    
    
    
    

    ok, changedになっていたら成功です。

    2.1 プレイブック実行結果確認

    プレイブック実行によってApacheが適切にインストールおよび設定されているか確認しましょう。

    1. Apacheの起動確認
    systemdコマンドで状態確認しましょう。Activeの項目がactive (running)になっていれば正常に起動できています。

    [ansible@ip-172-31-81-212 ~]$ sudo systemctl status httpd
     httpd.service - The Apache HTTP Server
       Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
       Active: active (running) since Sat 2024-02-17 11:12:53 JST; 32min ago
         Docs: man:httpd(8)
               man:apachectl(8)
      Process: 10374 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)
     Main PID: 7999 (httpd)
       Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
       CGroup: /system.slice/httpd.service
                7999 /usr/sbin/httpd -DFOREGROUND
               10376 /usr/sbin/httpd -DFOREGROUND
               10377 /usr/sbin/httpd -DFOREGROUND
               10378 /usr/sbin/httpd -DFOREGROUND
               10379 /usr/sbin/httpd -DFOREGROUND
               10380 /usr/sbin/httpd -DFOREGROUND
    
    Feb 17 11:12:53 ip-172-31-81-212.ec2.internal systemd[1]: Starting The Apache HTTP Server...
    Feb 17 11:12:53 ip-172-31-81-212.ec2.internal systemd[1]: Started The Apache HTTP Server.
    Feb 17 11:43:21 ip-172-31-81-212.ec2.internal systemd[1]: Reloading The Apache HTTP Server.
    Feb 17 11:43:21 ip-172-31-81-212.ec2.internal systemd[1]: Reloaded The Apache HTTP Server.
    [root@ip-172-31-81-212 ~]# 
    [root@ip-172-31-81-212 ~]# [ansible@ip-172-31-81-212 websystem]$ exitlsof  -i:80
    COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    httpd    7999   root    3u  IPv4  46464      0t0  TCP *:http (LISTEN)
    httpd   10376 apache    3u  IPv4  46464      0t0  TCP *:http (LISTEN)
    httpd   10377 apache    3u  IPv4  46464      0t0  TCP *:http (LISTEN)
    httpd   10378 apache    3u  IPv4  46464      0t0  TCP *:http (LISTEN)
    httpd   10379 apache    3u  IPv4  46464      0t0  TCP *:http (LISTEN)
    httpd   10380 apache    3u  IPv4  46464      0t0  TCP *:http (LISTEN)
    
    
    

    2. Apacheが使用しているポート確認
    lsof コマンドでApacheが使用しているポートが80であることを確認しましょう。

    [ansible@ip-172-31-81-212 ~]$ sudo lsof -i:80
    COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    java    9091 tomcat   44u  IPv4  59214      0t0  TCP *:webcache (LISTEN)
    
    
    

    3. Apacheの設定ファイル確認
    catコマンドでApacheの設定ファイル(httpd.conf)が想定通り編集されているか確認しましょう。

    [ansible@ip-172-31-81-212 ~]$ cat /etc/httpd/httpd.conf |grep TraceEnable
    TraceEnable off
    
    

    4. Apache管理コンソール接続
    Apacheの管理コンソール画面にアクセスできるか確認します。EC2インスタンスのInboundルールにポート80を追加して、ブラウザからアクセスできたら成功です。
    アクセス先:http://{サーバホスト名}:80


    Inboundルール追加の詳細については下記サイトを参照ください。
    ※セキュリティの観点から、ひととおり構築が終わったら本管理コンソールは外部から接続できないようしておくことを推奨します。

    EC2にApacheをインストールしてブラウザで表示する - AWSをはじめからていねいに

    5. テストアプリ動作確認
    では最後にテストアプリが動作するか確認しましょう。Step4ではポート8080を指定してTomcatに直接アクセスしていましたが、今回はポート指定を外してデフォルトの80番ポートでアクセスします。下記の通りテストデータが表示できたら成功です!
    アクセス先:http://{サーバホスト名}/testjsp/test.jsp

    まとめ

    Step5ではApacheのインストール、各種設定、Apache/Tomcat連携まですべてAnsibleで自動構築する方法をご紹介しまいした。以上でAnsibleを適用してWeb3層システム(Apache/Tomcat/Postgres)を自動構築する方法のご紹介は終了となります。ひととおりこのシリーズで記載していることが実装できたら、ある程度Ansibleの基本はマスターできていると思いますので、ぜひ皆さんの環境に合わせてAnsibleによる構築を進めてもらえればと思います。ここまで読んでいただきありがとうございました!!

    参考文献

    Ansible実践ガイド

    Ansible実践ガイド 第3版 - インプレスブックス
    コードによるインフラ構築の自動化

    アシタカブログ:Apache HTTP ServerとApache Tomcatを連携させる

    Apache HTTP ServerとApache Tomcatを連携させる
    はじめに前回、VirtualBox上のLinux環境でTomcatを動かすことができたので、今回はApache HTTP ServerとApache Tomcatを連携したいと思います。連携した後の処理としては、ユーザーからのリクエストはA...

    コメント