AmazonLinux2 に Java11 + Tomcat9 を Ansible2.7 で突っ込む
やろうと思ったきっかけは、そんなわりかし新しい構成でサーバ作ってと頼まれたので。
そして、やってみるとわかるのだけど、2019/03/21 時点でこれをリポジトリサポートしてるLinuxがそうそう無いと言うことに気づく。
強いて言えば Ubuntu18 が JDK11 だけサポートしてた。
でも Tomcat の Java11 対応って、Tomcat9 からなので、それなりに最新を入れざるを得なかったという問題があった。
前回もそんな流れで、JDK11 だけ先行して入ってりゃどうにかなんだろーと思ったためだ。
しかし甘かった…Tomcat9 の問題が待ち構えていたのだ。
なので、今回は前回をパワーアップチャレンジした。
インストールの段階を分離
Playbook は本来やりたいことの単位で区切っておいた方が、可読性の問題から言ってもいいので、全体として 4 つの playbook を作った。
- main.yml
メインの playbook。他の platbook を呼び出すハブ
common.yml : yum update
といってもやることは yum 操作だけなので、悩むことはない。
---
- hosts: develop-server
user: ec2-user
become: yes
tasks:
- name: Update all package
yum:
name: '*'
state: latest
- name: Install wget.
yum:
name: wget
state: latest
全部更新する場合に、name に対して '*' を指定しているくらい。
java.yml : java11 インストール
ここはだいぶがっつり変えた。
というのも、JDK を DL する実行コストがバカにならない(平たく言えば遅い)。なので、事前に java コマンドがあるか?その java は指定のバージョンか?を確認する。
- hosts: develop-server
user: ec2-user
become: yes
vars:
corretto: https://d3pxv6yz143wms.cloudfront.net/11.0.2.9.3/java-11-amazon-corretto-devel-11.0.2.9-3.x86_64.rpm
java_home: /usr/lib/jvm/java-11-amazon-corretto
java_version: '11.0.2'
tasks:
- name: Check Java install.
find:
paths: /usr/bin
patterns: 'java'
file_type: any
register: java_cmd
- name: Check java version.
command: 'java -version'
register: java_vsn
when: "java_cmd.files|length > 0"
- debug:
msg: "java_vsn = {{ java_vsn }}"
- name: Install corret.
yum:
name: '{{ corretto }}'
state: present
when: "(java_cmd.files|length == 0) or (java_vsn is defined and '{{ java_version }}' not in java_vsn.stderr)"
- name: Alternatives.
alternatives:
name: '{{ item }}'
link: "/usr/bin/{{ item }}"
path: "{{ java_home }}/bin/{{ item }}"
with_items:
- java
- javac
when: "(java_cmd.files|length == 0) or (java_vsn is defined and '{{ java_version }}' not in java_vsn.stderr)"
尚この処理の参考にしたのは公式。
こういうドキュメントの充実性はさすが Python さすが RedHat という印象。
一つだけ問題があるとすれば、なぜか java -version コマンドの応答が stdout ではなくて stderr だと言う点。
解せぬ…
Tomcat9 のインストール
参考にしたのはこちら
ただし見ればわかるのは、Tomcat をバイナリダウンロードで入れて言うと言う点。
コレは要するに完全に同じ手順を2回やろうとするとコケる事を意味してる。
冪等性(何回やっても指定した状況になること)の確保のため、ここでは Tomcat 指定バージョンのインストールディレクトリ有無でインストールプロセスを実行するかどうか決定するようにした。
- hosts: develop-server
user: ec2-user
become: yes
vars:
tomcat: http://ftp.jaist.ac.jp/pub/apache/tomcat/tomcat-9/v9.0.17/bin/apache-tomcat-9.0.17.tar.gz
tomcat_home: /opt/tomcat
tomcat_version: '9.0.17'
tasks:
- name: Create tomcat user.
user:
append: yes
create_home: no
name: tomcat
shell: /sbin/nologin
- name: Create tomcat dir.
file:
mode: '700'
path: /opt/tomcat
owner: tomcat
group: tomcat
state: directory
- name: Check current version tomcat {{ tomcat_version }}.
find:
paths: "/opt/tomcat/apache-tomcat-{{ tomcat_version }}"
patterns: "*"
file_type: any
register: tomcat_files
- name: Stop tomcat service.
command: systemctl stop tomcat.service
when: tomcat_files.matched != 0
- name: Download tomcat.
get_url:
dest: /opt/tomcat
owner: tomcat
url: "{{tomcat}}"
when: tomcat_files.matched == 0
- name: Extract tomcat.
unarchive:
dest: /opt/tomcat
owner: tomcat
group: tomcat
remote_src: yes
src: "/opt/tomcat/apache-tomcat-{{ tomcat_version }}.tar.gz"
when: tomcat_files.matched == 0
- name: Create sybolic link /opt/tomcat/latest
file:
src: "/opt/tomcat/apache-tomcat-{{ tomcat_version }}"
dest: /opt/tomcat/latest
state: link
owner: tomcat
group: tomcat
when: tomcat_files.matched == 0
- name: Register service.
template:
src: templates/tomcat.service.j2
dest: /etc/systemd/system/tomcat.service
owner: root
group: root
mode: '755'
backup: yes
when: tomcat_files.matched == 0
- name: Register startup.
command: systemctl enable tomcat.service
when: tomcat_files.matched == 0
- name: Remove archives.
file:
path: "/opt/tomcat/apache-tomcat-{{ tomcat_version }}.tar.gz"
state: absent
when: tomcat_files.matched == 0
Tomcat のサービス起動スクリプトはこちら。
latest のシンボリックリンクがあるなら、別にバージョンごときのために template 使う意味なくね?という気はする。
そのうち何かに使うかも知れないので、取り敢えずおいてある雰囲気で。
[Unit]
Description=Apache Tomcat {{ tomcat_version }}
After=network.target
[Service]
User=tomcat
Group=tomcat
Type=oneshot
PIDFile=/opt/tomcat/latest/tomcat.pid
RemainAfterExit=yes
ExecStart=/opt/tomcat/latest/bin/startup.sh
ExecStop=/opt/tomcat/latest/bin/shutdown.sh
ExecReStart=/opt/tomcat/latest/bin/shutdown.sh;/opt/tomcat/latest/bin/startup.sh
[Install]
WantedBy=multi-user.target
やっぱローカル上で検証できるっていいわー。
main.yml
コレは上記3つを呼ぶだけなので特筆すべきものはないはず
--- - import_playbook: common.yml - import_playbook: java.yml - import_playbook: tomcat.yml
ということで、AmazonLinux2 に Tomcat9 + Java11 構成ができた。
web アプリケーションを置くなら、「/opt/tomcat/latest/webapps」以下に突っ込めばいいのではなかろうか。
実行
$ ansible-playbook main.yml PLAY [develop-server] ***************************************************************************************************************************************************** TASK [Gathering Facts] **************************************************************************************************************************************************** Enter passphrase for key '/Users/xxxx/workspace/VirtualBox/virtualbox': ok: [192.168.56.2] TASK [Update all package] ************************************************************************************************************************************************* ok: [192.168.56.2] TASK [Install wget.] ****************************************************************************************************************************************************** ok: [192.168.56.2] PLAY [develop-server] ***************************************************************************************************************************************************** TASK [Gathering Facts] **************************************************************************************************************************************************** ok: [192.168.56.2] TASK [Check Java install.] ************************************************************************************************************************************************ ok: [192.168.56.2] TASK [Check java version.] ************************************************************************************************************************************************ skipping: [192.168.56.2] TASK [debug] ************************************************************************************************************************************************************** ok: [192.168.56.2] => { "msg": "java_vsn = {'changed': False, 'skipped': True, 'skip_reason': 'Conditional result was False'}" } TASK [Install corret.] **************************************************************************************************************************************************** [WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: (java_cmd.files|length == 0) or (java_vsn is defined and '{{ java_version }}' not in java_vsn.stderr) changed: [192.168.56.2] TASK [Alternatives.] ****************************************************************************************************************************************************** [WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: (java_cmd.files|length == 0) or (java_vsn is defined and '{{ java_version }}' not in java_vsn.stderr) ok: [192.168.56.2] => (item=java) ok: [192.168.56.2] => (item=javac) PLAY [develop-server] ***************************************************************************************************************************************************** TASK [Gathering Facts] **************************************************************************************************************************************************** ok: [192.168.56.2] TASK [Create tomcat user.] ************************************************************************************************************************************************ changed: [192.168.56.2] TASK [Create tomcat dir.] ************************************************************************************************************************************************* changed: [192.168.56.2] TASK [Check current version tomcat 9.0.17.] ******************************************************************************************************************************* ok: [192.168.56.2] TASK [Stop tomcat service.] *********************************************************************************************************************************************** skipping: [192.168.56.2] TASK [Download tomcat.] *************************************************************************************************************************************************** changed: [192.168.56.2] TASK [Extract tomcat.] **************************************************************************************************************************************************** changed: [192.168.56.2] TASK [Create sybolic link /opt/tomcat/latest] ***************************************************************************************************************************** changed: [192.168.56.2] TASK [Register service.] ************************************************************************************************************************************************** changed: [192.168.56.2] TASK [Register startup.] ************************************************************************************************************************************************** changed: [192.168.56.2] TASK [Remove archives.] *************************************************************************************************************************************************** changed: [192.168.56.2] PLAY RECAP **************************************************************************************************************************************************************** 192.168.56.2 : ok=18 changed=9 unreachable=0 failed=0
しれっと中にインストールされ、サービスも無事起動するようになっている。
あとはサービス起動前に war を所定の位置にコピーして、ansible の handlers あたりでサービス起動もしてやれば OK だ。
[root@amazonlinux ~]# systemctl start tomcat.service [root@amazonlinux ~]# wget http://127.0.0.1:8080/ --2019-03-21 13:56:33-- http://127.0.0.1:8080/ 127.0.0.1:8080 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 長さ: 特定できません [text/html] `index.html' に保存中 [ <=> ] 11,266 --.-K/s 時間 0.001s 2019-03-21 13:56:34 (11.5 MB/s) - `index.html' へ保存終了 [11266]
あと、あくまで検証環境なので、Tomcat 内のデフォルトアプリとかセキュリティ設定とかはやってない。
その辺はこれを元に作り込んで欲しい GoodLuck!