【Ansible/インフラ構築自動化】Step2:AWS EC2に構築したCentOSの基本設定

本シリーズではAnsibleを適用してWeb3層システム(Apache/Tomcat/Postgres)を自動構築する方法をご紹介しています。
前回の記事ではStep1として、CentOSにAnsibleをインストールしてAnsibleの基本的な動作を確認する手順をご紹介しました。
【インフラ自動構築】Step1:Ansibleのインストール方法(AWS EC2/CentOS7)

今回はStep2としてミドルウェアをインストールする前にOSの基本設定を行っていきます。SELinuxおよびipv6設定の無効化、パッケージ最新化を実施していきますのでぜひ参考にしてみて下さい。

1. ディレクトリ作成

まずは下記のようににディレクトリを作成して下さい。websystemというディレクトリの配下に各種ディレクトリ・ファイルを作成していきます。

[ansible@ip-172-31-81-212 ~]$ mkdir -p ./websystem/inventory
[ansible@ip-172-31-81-212 ~]$ mkdir -p ./websystem/roles/common/files
[ansible@ip-172-31-81-212 ~]$ mkdir -p ./websystem/roles/common/tasks
[ansible@ip-172-31-81-212 ~]$ mkdir -p ./websystem/roles/common/vars
[ansible@ip-172-31-81-212 ~]$ tree
.
├── roles
└── websystem
    ├── inventory
    └── roles
        └── common
            ├── files
            ├── tasks
            └── vars

2. Playbook作成

上記で作成したwebsystemディレクトリ配下にPlaybookを作成していきましょう。最終的にはOSだけではなくApache、Tomcat、Posstgresの設定も行っていきますが、現時点では一旦、OS設定のroleのみを有効化しています。

[ansible@ip-172-31-81-212 websystem]$ vi websystem_install.yml
[ansible@ip-172-31-81-212 websystem]$ cat 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 websystem]$

続いてtasksディレクトリ配下にmain.ymlファイルを作成します。

  1. SELinuxの無効化
    SELinuxが有効になっているとrootユーザに対してもアクセス制限がかかってしまって構築の難易度が高くなるので、ここでは無効化しておきます。
  2. ipv6インターフェースの無効化
    一般的にipv4を使用していることがほとんどでipv6は不要ですので、余計な通信が発生しないようにipv6インターフェースを無効にしておきます。
  3. パッケージの最新化
    yumコマンドで各種パッケージを最新化しておきましょう。
  4. EPEL Repository登録
    yumコマンドでEPEL Repository登録をしておきましょう。EPELとはExtra Packages for Enterprise Linuxの略でRHELやCentOS向けの追加パッケージを提供するリポジトリとなります。
  5. 環境変数設定
    各MWに必要な環境変数をここで定義しておきましょう。/etc/profileを編集します。
[ansible@ip-172-31-81-212 ~]$ cd ./websystem/roles/common/tasks/
[ansible@ip-172-31-81-212 tasks]$ vi main.yml
[ansible@ip-172-31-81-212 tasks]$ cat main.yml
---
# tasks file for ./roles/common

# 1.SELinuxの無効化
- name: configure / Selinux permissived
  selinux:
    policy: targeted
    state: permissive
  when : ansible_selinux.config_mode == 'enforcing'

# 2.ipv6インターフェースの無効化
- name: configure / Disable ipv6 interface
  sysctl:
    state: present
    name: "{{ item }}"
    value: '1'
    sysctl_set: yes
    reload: yes
  loop:
    - net.ipv6.conf.all.disable_ipv6
    - net.ipv6.conf.default.disable_ipv6

# 3.パッケージの最新化
- name: configure / Update yum packages
  yum:
    name: '*'
    state: latest
    update_cache: yes

# 4.EPEL Repository登録
- name: configure / Import EPEL Repository
  yum:
    name: epel-release
    state: latest
    update_cache: yes

# 5.環境変数設定
- name: configure / deploy profile file
  copy:
    src: profile
    dest: /etc/profile
    owner: root
    group: root
    mode: 0644
[ansible@ip-172-31-81-212 tasks]$

/etc/profileをfilesディレクトリに配置しておきます。

[ansible@ip-172-31-81-212 ~]$ ls -l ./websystem/roles/common/files/profile
-rw-rw-r--. 1 ansible ansible 1987 Mar  1 06:19 ./websystem/roles/common/files/profile
[ansible@ip-172-31-81-212 ~]$ cat ./websystem/roles/common/files/profile
# /etc/profile
~省略~

#デフォルトから下記を追加
JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.22.0.7-1.el7_9.x86_64
CATALINA_HOME=/etc/tomcat
CLASSPATH=$CATALINA_HOME/lib/*.jar
export JAVA_HOME CATALINA_HOME CLASSPATH

3. Ansibleコマンド実行

ここまでできたら、いよいよansible-playbookコマンドを実行して自動設定変更をしてみましょう。まずは–checkオプションを入れてDry Runすることで、Ansibleの処理が問題なく動くかどうかを確認してください。下記のようにokやchangedが出力されており、NGが出力されていなければ問題なく設定できています。

[ansible@ip-172-31-81-212 ~]$ ansible-playbook -i ~/websystem/inventory/inventory.ini  ~/websystem//websystem_install.yml -t common --check

PLAY [Install for web system] ***********************************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************************************************
ok: [web1i]

TASK [common : configure / Selinux permissived] *****************************************************************************************************************************
skipping: [web1i]

TASK [common : configure / Disable ipv6 interface] **************************************************************************************************************************
ok: [web1i] => (item=net.ipv6.conf.all.disable_ipv6)
ok: [web1i] => (item=net.ipv6.conf.default.disable_ipv6)

TASK [common : configure / Update yum packages] *****************************************************************************************************************************
ok: [web1i]

TASK [common : configure / Import EPEL Repository] **************************************************************************************************************************
ok: [web1i]

TASK [common : configure / deploy profile file] *****************************************************************************************************************************
ok: [web1i]

PLAY RECAP ******************************************************************************************************************************************************************
web1i                      : ok=5    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

それでは続けて、–checkをはずして実際に実行していきましょう。yum updateに時間がかかるのでしばらく待ってください。

[ansible@ip-172-31-81-212 ~]$ ansible-playbook -i ~/websystem/inventory/inventory.ini  ~/websystem//websystem_install.yml -t common

PLAY [Install for web system] ***********************************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************************************************
ok: [web1i]

TASK [common : configure / Selinux permissived] *****************************************************************************************************************************
skipping: [web1i]

TASK [common : configure / Disable ipv6 interface] **************************************************************************************************************************
ok: [web1i] => (item=net.ipv6.conf.all.disable_ipv6)
ok: [web1i] => (item=net.ipv6.conf.default.disable_ipv6)

TASK [common : configure / Update yum packages] *****************************************************************************************************************************
ok: [web1i]

TASK [common : configure / Import EPEL Repository] **************************************************************************************************************************
ok: [web1i]

TASK [common : configure / deploy profile file] *****************************************************************************************************************************
ok: [web1i]

PLAY RECAP ******************************************************************************************************************************************************************
web1i                      : ok=5    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

もしエラーが起きてしまった場合は、ansible-playbookコマンドに-vvvvオプションをつけて実行すると処理の詳細が出力されますので、問題になっている箇所を特定して修正してみて下さい。

4. 設定変更の確認

念のため適切に設定変更ができているかどうか確認してみましょう。

  1. SELinuxの無効化
    getenforceコマンドの結果がPermissiveになっていればSELinuxは無効になっています。
  2. ipv6インターフェースの無効化
    “ip a”コマンドの結果にinet6の項目が表示されていなければipv6インターフェースは無効化されています。
  3. パッケージの最新化
    yumコマンドの結果、No packages marked for updateと表示されれば最新化されています。
  4. EPEL Repository登録
    rpmコマンドでepel-releaseがインストールされていれば正しい状態となっています。
  5. 環境変数確認
#1.SELinuxの無効化の確認
[ansible@ip-172-31-81-212 ~]$ getenforce
Permissive

#2.ipv6インターフェースの無効化の確認
[ansible@ip-172-31-81-212 ~]$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 12:bb:90:98:87:e1 brd ff:ff:ff:ff:ff:ff
    inet 172.31.81.212/20 brd 172.31.95.255 scope global noprefixroute dynamic eth0
       valid_lft 3274sec preferred_lft 3274sec

#3.パッケージの最新化の確認
[ansible@ip-172-31-81-212 ~]$ sudo yum update
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
epel/x86_64/metalink                                          |  23 kB  00:00:00
 * base: download.cf.centos.org
~省略~
No packages marked for update

#4.EPEL Repository登録の確認
[ansible@ip-172-31-81-212 ~]$ rpm -qa |grep epel-release
epel-release-7-14.noarch

#5.環境変数の確認
[ansible@ip-172-31-81-212 ~]$ echo $JAVA_HOME
/usr/lib/jvm/java-11-openjdk-11.0.22.0.7-1.el7_9.x86_64
[ansible@ip-172-31-81-212 ~]$ echo $CATALINA_HOME
/etc/tomcat
[ansible@ip-172-31-81-212 ~]$ echo $CLASSPATH
/etc/tomcat/lib/*.jar

5. まとめ

今回はOSの基本設定の方法をご紹介しました。Step3以降はいよいよPostgres/Tomcat/Apacheの構築方法を御紹介しますので、ぜひ見てもらえると嬉しいです。

6. 参考文献

Ansible実践ガイド

コメント