OSS Fan ~OSSでLinuxサーバ構築~

このエントリーをはてなブックマークに追加

Ansible 2.2.1.0のPlaybookでCentOS 7.3へApacheとWildFlyをインストール

カテゴリ:OSSセットアップ | ソフトウェア:Ansible | タグ:
最終更新日:2020/11/01 | 公開日:2017/04/23

目次

概要

 Ansibleを利用してApacheとWildFlyのインストールと設定を行います。 今回初めてPlaybookを作成したので、Ansibleのコンセプトである冪等性はあまり考慮しないものとし、 Ansibleを使った構築の自動化をやってみようぐらいの感じで試しています。

 始めにAnsibleを実行するための基本的な設定を行い、 Apacheインストール用のPlaybookを作成して実行します。 続いてOracle JDKとWildFlyインストール用のPlaybookを作成して実行します。 1つのPlaybookでApacheからWildFlyまで一連の流れでインストールしても良いのですが、 Webサーバ、APサーバと役割毎にPlaybookを分けておいた方が後々使いやすいかなと思い分けました。

 今回はお試しのためAnsibleをインストールしたサーバを1台用意し、 このサーバ上にApacheやWildFlyをインストールします。 インストールに必要なRPMファイルや各種インストーラは都度インターネットから 取得する内容になっていますが、事前にAnsibleのサーバに集めておいてインストール時に配布するとか、 LAN内のサーバから取得するとか、大量のサーバを構築する場合には工夫が必要です。

構成

想定環境

Ansible実行構成

サーバ構成

OSバージョン

CentOS 7.3.1611 x86_64

ソフトウェア・パッケージ一覧

  • ansible-2.2.1.0-1.el7.noarch.rpm

環境構築

事前準備

インストール済みAnsibleのバージョン確認

 CentOS 7.3にAnsibleがインストール済みである前提で以下の手順を進めていきます。 まずはインストール済みのAnsibleのバージョンを確認します。

# ansible --version
ansible 2.2.1.0 ←2.2.1.0がバージョン
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides

Ansibleの簡易動作確認

 Ansibleがインストール済みであることが確認できたので、続いて簡易的に動作確認します。 pingモジュールを実行してみます。

# ansible localhost -m ping
 [WARNING]: provided hosts list is empty, only localhost is available

localhost | SUCCESS => {
    "changed": false, ←失敗ではなく、モジュールの実行により環境の変更がなかったという意味
    "ping": "pong" ←pongと表示されれば成功
}

秘密鍵・公開鍵のペア作成

 Ansibleでは管理対象サーバに対してSSH接続したうえで各種操作を行います。 接続の都度パスワードを入力するのは面倒なので、秘密鍵・公開鍵のペアを利用した SSHの認証を行うようにします。 今回は全てrootユーザで実行しますので、rootユーザ向けに秘密鍵・公開鍵のペア作成を行います。 キーに対してパスフレーズは設定しません。 キーペアは /root/.ssh/ ディレクトリに作成されます。

 ※rootユーザでの実行を推奨するわけではありません。 今回は初めてPlaybookの作成・実行を行ったため、権限周りで悩まないように手抜きしました。

# ssh-keygen -t rsa -C "testuser@example.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): ←何も入力せずに[Enter]キーを押す
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): ←何も入力せずに[Enter]キーを押す
Enter same passphrase again: ←何も入力せずに[Enter]キーを押す
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
eb:83:ea:a2:95:53:75:3e:a9:90:29:73:a6:ea:36:ec testuser@example.com
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|      . .        |
|     + o .       |
|  o B   S        |
|   O . . o       |
|. =   ...        |
| *..  ...        |
|*E.oo.  ..       |
+-----------------+
# cd /root/.ssh/
# ls -l
合計 12
-rw------- 1 root root 1675  4月 19 00:52 id_rsa ←秘密鍵
-rw-r--r-- 1 root root  395  4月 19 00:52 id_rsa.pub ←公開鍵
-rw-r--r-- 1 root root  569  4月 19 00:54 known_hosts

authorized_keysに公開鍵を登録

 秘密鍵・公開鍵でのSSH接続を許可するために、公開鍵の内容をauthorized_keysファイルにコピーします。 今回は他に登録された公開鍵がなかったため、authorized_keysファイル自体が存在していませんでした。 そのため id_rsa.pub ファイルをコピーして authorized_keys ファイルを作成しました。 既に authorized_keys ファイルが存在している場合は id_rsa.pub ファイルの中身を authorized_keys ファイルに追記するようにしてください。

# cp -piv id_rsa.pub authorized_keys
`id_rsa.pub' -> `authorized_keys'
# ls -l
合計 16
-rw-r--r-- 1 root root  395  4月 19 00:52 authorized_keys
-rw------- 1 root root 1675  4月 19 00:52 id_rsa
-rw-r--r-- 1 root root  395  4月 19 00:52 id_rsa.pub
-rw-r--r-- 1 root root  569  4月 19 00:54 known_hosts

Ansibleの設定

Ansibleの設定ファイル作成

 ここからはAnsibleの設定を行います。 始めに実行したAnsibleのバージョン確認でも表示されていましたが、 設定ファイルとして /etc/ansible/ansible.cfg が使用されます。 初期状態で ansible.cfg ファイルは存在していますが、コメントが大量に書かれており、 可読性が良くないので、ファイルをバックアップしてゼロから新規に作成します。 (コメントとして解説や設定例があること自体は歓迎なのですが)

# cd /etc/ansible/
# mv ansible.cfg ansible.cfg.bk ←ファイルをリネームしてバックアップ
# vi ansible.cfg ←viエディタでファイルを新規作成
ファイル名:/etc/ansible/ansible.cfg
※ファイルを新規作成※
[defaults]
inventory = hosts ←インベントリファイルのファイル名
remote_user = root ←Ansibleでの操作はrootユーザで実行
host_key_checking = False ←SSH接続時のセキュリティチェック省略
private_key_file = /root/.ssh/id_rsa ←使用する秘密鍵のフルパス

インベントリファイル作成

 Ansibleでは間違って関係ないサーバに対して操作を行わないようにするために、 事前に実行対象サーバをインベントリファイルに登録します。 同じ操作を複数のサーバに対して行うためにホストグループを構成することもできます。 今回は自ホストに対してのみ実行するため関係ありませんが、 書き方例として webservers というホストグループを作成しています。 インベントリファイルはAnsible設定ファイルと同様に初期状態で色々書かれていて可読性が良くないので バックアップしてゼロから新規に作成します。

# mv hosts hosts.bk ←ファイルをリネームしてバックアップ
# vi hosts ←viエディタでファイルを新規作成
ファイル名:/etc/ansible/hosts
※ファイルを新規作成※
[webservers] ←ホストグループ
192.168.0.11 ←管理対象サーバのIPアドレス(今回は自ホスト)

動作確認1

 始めに行った動作確認ではループバックアドレスに対して操作を実行しましたが、 今回は管理対象サーバ(今回は自ホスト)を指定して実行します。

# ansible 192.168.0.11 -m ping
192.168.0.11 | SUCCESS => {
    "changed": false,
    "ping": "pong" ←成功
}

動作確認2

 続いてインベントリファイルに登録したホストグループの webservers に対して 操作を実行します。ここでは -a オプションで、直接操作コマンドを記述しています。 管理対象サーバで Hello World という文字を標準出力に表示します。

# ansible webservers -a 'echo Hello World'
192.168.0.11 | SUCCESS | rc=0 >>
Hello World

#

ApacheをインストールするPlaybookの作成と実行

Playbookの作成

 ここからは Playbook を作成して構築自動化を試してみます。 Ansibleの本来のコンセプトである冪等性は一旦置いときます。 まずは実行して試してみましょう。 始めにyumでApache HTTP Serverをインストールします。 そのため管理対象サーバはインターネットに接続している必要があります。 その後Apacheを起動し、自動起動設定を有効化します。 Apacheの設定ファイルは初期状態でもテストページにアクセスできるため、 変更しないことにします。

# cd /etc/ansible/
# vi playbook_httpd.yml ←viエディタでファイルを新規作成
ファイル名:/etc/ansible/playbook_httpd.yml
※ファイルを新規作成※
---
- name: Webサーバのセットアップ
  hosts: webservers
  tasks:
    - name: Apacheのインストール
      yum: name=httpd state=present

    - name: Apacheを起動し、サービスの自動起動を有効化
      systemd: name=httpd state=started enabled=yes

Playbookの実行

 作成したApacheインストール用のPlaybookを実行します。

# cd /etc/ansible/
# ansible-playbook playbook_httpd.yml

PLAY [Webサーバのセットアップ] ***********************************************************

TASK [setup] *******************************************************************
ok: [192.168.0.11]

TASK [Apacheのインストール] ***********************************************************
changed: [192.168.0.11]

TASK [Apacheを起動し、サービスの自動起動を有効化] ************************************************
changed: [192.168.0.11]

PLAY RECAP *********************************************************************
192.168.0.11               : ok=3    changed=2    unreachable=0    failed=0

#

 上記のように unreachable と failed が 0 となっていれば成功です。

Playbookの実行結果確認

 Playbookによる実行がうまくいったか確認します。

# rpm -qa | grep httpd
httpd-tools-2.4.6-45.el7.centos.4.x86_64
httpd-2.4.6-45.el7.centos.4.x86_64 ←yumでインストールされた
# 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 水 2017-04-19 23:49:29 JST; 3min 20s ago ←起動済み
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 3712 (httpd)
   Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
   CGroup: /system.slice/httpd.service
           tq3712 /usr/sbin/httpd -DFOREGROUND
           tq3713 /usr/sbin/httpd -DFOREGROUND
           tq3714 /usr/sbin/httpd -DFOREGROUND
           tq3715 /usr/sbin/httpd -DFOREGROUND
           tq3716 /usr/sbin/httpd -DFOREGROUND
           mq3717 /usr/sbin/httpd -DFOREGROUND

 4月 19 23:49:22 centos73 systemd[1]: Starting The Apache HTTP Server...
 4月 19 23:49:27 centos73 httpd[3712]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, usi...message
 4月 19 23:49:29 centos73 systemd[1]: Started The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.
# ps -ef | grep httpd
root       928     1  0  4月22 ?      00:00:00 /usr/sbin/httpd -DFOREGROUND ←プロセスが存在している
apache    1072   928  0  4月22 ?      00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    1073   928  0  4月22 ?      00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    1074   928  0  4月22 ?      00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    1075   928  0  4月22 ?      00:00:00 /usr/sbin/httpd -DFOREGROUND
apache    1076   928  0  4月22 ?      00:00:00 /usr/sbin/httpd -DFOREGROUND
root      7097  2172  0 02:58 pts/0    00:00:00 grep --color=auto httpd

Oracle JDKとWildFlyをインストールするPlaybookの作成と実行

Playbookの作成

 次はOracle JDKとWildFlyをインストールします。 Apacheの時より操作内容がちょっと複雑になっています。 また、Apacheの時と同様に一旦冪等性は考えないものとして、 構築自動化を試しているのでご了承ください。 操作の内容はPlaybook内にコメントとして記載していますのでそちらを参照してください。

# cd /etc/ansible/
# vi playbook_wildfly.yml ←viエディタでファイルを新規作成
ファイル名:/etc/ansible/playbook_wildfly.yml
※ファイルを新規作成※
---
- name: APサーバのセットアップ
  hosts: webservers
  tasks:
    - name: wgetのインストール
      yum: name=wget state=present

    - name: グループの作成
      group: name=wildfly gid=10001

    - name: ユーザの作成
      user: name=wildfly uid=10001 state=present password=Passw0rd groups=wildfly

    - name: OracleJDKのダウンロード
      shell: 'wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u92-b14/jdk-8u92-linux-x64.rpm"'
      args:
        chdir: /tmp

    - name: WildFlyのダウンロード
      get_url: url=http://download.jboss.org/wildfly/10.1.0.Final/wildfly-10.1.0.Final.tar.gz
               dest=/tmp

    - name: OracleJDKのインストール
      yum: name=/tmp/jdk-8u92-linux-x64.rpm state=present

    - name: WildFlyの解凍
      unarchive: src=/tmp/wildfly-10.1.0.Final.tar.gz dest=/opt

    - name: WildFlyのパーミッション変更
      file: path=/opt/wildfly-10.1.0.Final owner=wildfly group=wildfly state=directory recurse=yes

    - name: 設定ファイルのバックアップ
      shell: 'cp -p standalone.xml standalone.xml.bk'
      args:
        chdir: /opt/wildfly-10.1.0.Final/standalone/configuration/

    - name: WildFlyの設定変更
      replace: >
        dest=/opt/wildfly-10.1.0.Final/standalone/configuration/standalone.xml
        regexp='127.0.0.1'
        replace='0.0.0.0'

    - name: WildFlyの起動
      shell: 'su - wildfly -c "/opt/wildfly-10.1.0.Final/bin/standalone.sh &"'

Playbookの実行

 作成したPlaybookを実行します。

# cd /etc/ansible/
# ansible-playbook playbook_wildfly.yml

PLAY [APサーバのセットアップ] ************************************************************

TASK [setup] *******************************************************************
ok: [192.168.0.11]

TASK [wgetのインストール] *************************************************************
ok: [192.168.0.11]

TASK [グループの作成] *****************************************************************
changed: [192.168.0.11]

TASK [ユーザの作成] ******************************************************************
changed: [192.168.0.11]

TASK [OracleJDKのダウンロード] ********************************************************
changed: [192.168.0.11]
 [WARNING]: Consider using get_url or uri module rather than running wget


TASK [WildFlyのダウンロード] **********************************************************
changed: [192.168.0.11]

TASK [OracleJDKのインストール] ********************************************************
changed: [192.168.0.11]

TASK [WildFlyの解凍] **************************************************************
changed: [192.168.0.11]

TASK [WildFlyのパーミッション変更] *******************************************************
changed: [192.168.0.11]

TASK [設定ファイルのバックアップ] ***********************************************************
changed: [192.168.0.11]

TASK [WildFlyの設定変更] ************************************************************
changed: [192.168.0.11]

TASK [WildFlyの起動] **************************************************************
changed: [192.168.0.11]
 [WARNING]: Consider using 'become', 'become_method', and 'become_user' rather than running su


PLAY RECAP *********************************************************************
192.168.0.11               : ok=12   changed=10   unreachable=0    failed=0

#

 今回も unreachable と failed が 0 のため成功です。

Playbookの実行結果確認

 Ansibleでの操作が成功していることを確認します。

# rpm -qa | grep wget
wget-1.14-13.el7.x86_64 ←wgetがインストールされた
# tail -n 1 /etc/group
wildfly:x:10001:wildfly ←wildflyグループが作成された
# tail -n 1 /etc/passwd
wildfly:x:10001:100::/home/wildfly:/bin/bash ←wildflyユーザが作成された
# ls -l /tmp/
合計 297836
drwxr-xr-x 2 wildfly users        18  4月 23 01:36 hsperfdata_wildfly
-rw-r--r-- 1 root    root  165953904  4月  2  2016 jdk-8u92-linux-x64.rpm ←OracleJDKのインストーラがダウンロードされた
drwx------ 3 root    root         17  4月 22 18:20 systemd-private-4cdce3a3b1fc4592a010c770a6abf85b-httpd.service-Zm4Zjr
drwx------ 3 root    root         17  4月 22 18:20 systemd-private-4cdce3a3b1fc4592a010c770a6abf85b-vmtoolsd.service-P1Gob7
-rw-r--r-- 1 root    root  139025162  4月 23 01:33 wildfly-10.1.0.Final.tar.gz ←WildFlyのアーカイブがダウンロードされた
# rpm -qa | grep jdk
jdk1.8.0_92-1.8.0_92-fcs.x86_64 ←Oracle JDKがインストールされた
# ls -l /opt/
合計 0
drwxr-xr-x.  2 root    root      6  3月 26  2015 rh
drwxr-xr-x  10 wildfly wildfly 220  8月 19  2016 wildfly-10.1.0.Final ←WildFlyのプログラムが解凍された
# ls -l /opt/wildfly-10.1.0.Final/standalone/configuration/
合計 144
-rw-r--r-- 1 wildfly wildfly   711  8月 19  2016 application-roles.properties
-rw------- 1 wildfly wildfly   935  8月 19  2016 application-users.properties
-rw-r--r-- 1 wildfly wildfly  1608  4月 23 01:36 logging.properties
-rw-r--r-- 1 wildfly wildfly   669  8月 19  2016 mgmt-groups.properties
-rw------- 1 wildfly wildfly  1112  8月 19  2016 mgmt-users.properties
-rw-r--r-- 1 wildfly wildfly 28084  8月 19  2016 standalone-full-ha.xml
-rw-r--r-- 1 wildfly wildfly 24359  8月 19  2016 standalone-full.xml
-rw-r--r-- 1 wildfly wildfly 24559  8月 19  2016 standalone-ha.xml
-rw-r--r-- 1 wildfly wildfly 21336  4月 23 01:36 standalone.xml
-rw-r--r-- 1 wildfly wildfly 21342  8月 19  2016 standalone.xml.bk ←設定ファイルがバックアップされた
drwxr-xr-x 4 wildfly users     121  4月 23 01:36 standalone_xml_history
# grep 'jboss.bind.address' /opt/wildfly-10.1.0.Final/standalone/configuration/standalone.xml
            <wsdl-host>${jboss.bind.address:0.0.0.0}</wsdl-host> ←設定ファイルが変更された
            <inet-address value="${jboss.bind.address.management:0.0.0.0}"/> ←設定ファイルが変更された
            <inet-address value="${jboss.bind.address:0.0.0.0}"/> ←設定ファイルが変更された
# ps -ef | grep java
wildfly   6848  6804  0 01:36 ?        00:00:10 java -D[Standalone] -server -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -Dorg.jboss.boot.log.file=/opt/wildfly-10.1.0.Final/standalone/log/server.log -Dlogging.configuration=file:/opt/wildfly-10.1.0.Final/standalone/configuration/logging.properties -jar /opt/wildfly-10.1.0.Final/jboss-modules.jar -mp /opt/wildfly-10.1.0.Final/modules org.jboss.as.standalone -Djboss.home.dir=/opt/wildfly-10.1.0.Final -Djboss.server.base.dir=/opt/wildfly-10.1.0.Final/standalone ←WildFlyが起動した
root      7039  2172  0 02:01 pts/0    00:00:00 grep --color=auto java

 以上で一通りの動作確認は終わりです。 今後はAnsibleのコンセプトである冪等性を考えたPlaybookを作成したり、 構築するサーバの役割毎にPlaybookを分割したり、 リモートサーバに対して実行したり、 操作ユーザを適切に割り当てたりと色々試してみたいと思います。