【初心者向けハンズオン】インフラ構築自動化 ~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の構築方法を御紹介しますので、ぜひ見てもらえると嬉しいです。
    【Ansible/インフラ構築自動化】Step3:Postgresインストール/データベース作成

    6. 参考文献

    Ansible実践ガイド

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

    コメント