Ansible 2.2.1.0のPlaybookでCentOS 7.3へApacheとWildFlyをインストール
目次
概要
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内のサーバから取得するとか、大量のサーバを構築する場合には工夫が必要です。
構成
想定環境
サーバ構成
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エディタでファイルを新規作成
※ファイルを新規作成※ [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エディタでファイルを新規作成
※ファイルを新規作成※ [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エディタでファイルを新規作成
※ファイルを新規作成※
---
- 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エディタでファイルを新規作成
※ファイルを新規作成※
---
- 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を分割したり、 リモートサーバに対して実行したり、 操作ユーザを適切に割り当てたりと色々試してみたいと思います。