【Ansible/インフラ構築自動化】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ルール追加の詳細については下記サイトを参照ください。
※セキュリティの観点から、ひととおり構築が終わったら本管理コンソールは外部から接続できないようしておくことを推奨します。

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

まとめ

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

参考文献

Ansible実践ガイド

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

コメント