Open Liberty の Ansible + Jenkins による自動構築・構成管理を試す


## はじめに
AnsibleやJenkinsを使ったDevOpsのプロセスを学習することになったので、Open Libertyを導入・構成管理するユースケースで実際に動かして見たときのメモです。
完全初学者のメモなので、間違ってる箇所・こうした方がいい箇所などあると思うので、気になるところがありましたらコメントいただけると幸いです。

## 前提条件
 - ホスト：
	 - Mac OS High Sierra
	 - VirtualBox
	 - Vagrant
	 
 - ゲスト：
	 - コントローラーVM
		 - CentOS 7.1
		 - Ansible 2.6.2
		 - Jenkins 2.135
		 
	 - ターゲットVM
		 - CentOS 7.1
		 - Open Liberty 18.0.0.2
		 - Eclipse OpenJ9: 1.8.0_162

## 手順
### ホスト側の準備
1. VirtualBox + Vagrantの導入は他記事を参考に。また以下は打鍵したコマンドを記していますが、実行途中・結果のログは割愛しています。

```AddCentOS7.1box
vagrant box add centos71 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.1/vagrant-centos-7.1.box
```

２. vagrant initでVM設定

```init
vagrant init centos71
```

```Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.define "controller" do |node|
        node.vm.box = "centos71"
        node.vm.hostname = "controller"
        node.vm.network :private_network, ip: "192.168.100.10"
        node.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2210
	node.vm.network :forwarded_port, id: "jenkins", guest:8080, host: 18080
  end
  config.vm.define "target" do |node|
        node.vm.box = "centos71"
        node.vm.hostname = "target"
        node.vm.network :private_network, ip: "192.168.100.20"
        node.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2220
  end
end
```

３. vagrant upでVMが2つ上がってくることを確認

```up
vagrant up
```

```status
vagrant status
Current machine states:

controller                running (virtualbox)
target                    running (virtualbox)
```


４. 2つのVMで通信できるように鍵作って交換

```ssh
ssh root@localhost -p 2210
ssh-keygen -t rsa
ssh-copy-id root@192.168.100.20
```


５. Open LibertyとOpenJ9を入手

- https://openliberty.io/
- https://www.eclipse.org/openj9/


### ゲスト（コントローラー）側の準備
１. Ansible導入は他記事を参考に

- 前提のPythonはCentOSには最初から入ってるので略

```python
python --version
Python 2.7.5
```

```ansible
sudo yum install ansible

ansible --version
ansible 2.6.2
```

２. Jenkins導入は他記事を参考に

- 前提のJavaとwget入れる
- jenkinsがsudoできるようにしておく

```java
sudo yum install java-1.8.0-openjdk wget
```

```jenkins
sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
sudo yum install -y jenkins
service jenkins start
chkconfig jenkins on
```

```visudo
sudo /usr/sbin/visudo

#Defaults requiretty
Defaults:jenkins !requiretty
jenkins ALL=(ALL) NOPASSWD:ALL

```

### ゲスト（ターゲット）側の準備
1. unzip導入（unarchiveモジュールの前提）

```unzip
sudo yum install unzip
```

### コントローラーのAnsibleからOpen Liberty + OpenJ9の導入
1. OpenLibertyとOpenJ9のファイルをコピー

```copy
mkdir ansible
cp openliberty-18.0.0.2.zip /ansible/
cp OpenJDK8-OPENJ9_x64_Linux_jdk8u162-b12_openj9-0.8.0.tar.gz /ansible/
```

２. roles作成

```mkdir
mkdir roles
cd roles
mkdir common
mkdir OpenJ9
mkdir OpenLiberty
```

- common

```roles/common/tasks/main.yml
---
- name: create group oladmin
  group:
    name: oladmin

- name: create user oladmin
  user:
    name: oladmin
    group: oladmin

- name: create directories
  file:
    group: oladmin
    owner: oladmin
    mode: 0770
    path: "{{ item }}"
    state: directory
  with_items:
    - "/opt/IBM/OpenJ9"
    - "/opt/IBM/OpenLiberty"
```

- OpenJ9

```roles/OpenJ9/tasks/main.yml
---
- name: unarchive OpenJ9
  unarchive:
    copy: yes
    src: /ansible/OpenJDK8-OPENJ9_x64_Linux_jdk8u162-b12_openj9-0.8.0.tar.gz
    dest: /opt/IBM/OpenJ9
    owner: oladmin
    group: oladmin
    keep_newer: no
    list_files: no
    mode: 0770
```

- OpenLiberty

```roles/OpenLiberty/tasks/main.yml
---
- name: unarchive Open Liberty
  unarchive:
    copy: yes
    src: /ansible/openliberty-18.0.0.2.zip
    dest: /opt/IBM/OpenLiberty/
    owner: oladmin
    group: oladmin
    keep_newer: no
    list_files: no
    mode: 0770
```

３. inventory/hosts作成

```inventory/hosts
[targets]
192.168.100.20
```

４. install.yml作成

```install.yml
---
- name: install liberty
  become: true
  hosts: targets

  roles:
    - common
    - OpenJ9
    - OpenLiberty

  tasks:

```

５. Playbook全体ディレクトリ構成は以下：
	
```ansibleディレクトリ
ansible	
	　L install.yml
	　L roles
	　 L common
	　  L task
	　   L main.yml
	　 L OpenJ9
	　  L task
	　   L main.yml
	　 L OpenLiberty
	　  L task
	　   L main.yml
	　L inventory
	　 L hosts
```

６. Jenkinsでジョブ作成（Ansibleコマンド実行）
![Kobito.71GRfx.png](https://qiita-image-store.s3.amazonaws.com/0/129662/be8efc8d-442c-a5b6-622e-f7856dcd3289.png "Kobito.71GRfx.png")


７. Jenkinsからジョブ実行して成功するのを確認（以下は初回実行して導入後に再実行してるので冪等性が保たれ、okが出ている）
![Kobito.0Ge78S.png](https://qiita-image-store.s3.amazonaws.com/0/129662/c599db08-60ba-0e64-2eca-dd5ea6d9f98f.png "Kobito.0Ge78S.png")


### Open Liberty + OpenJ9の導入＠ターゲット
1. Open LibertyとOpenJ9が入ってることを確認
![Kobito.kRObnk.png](https://qiita-image-store.s3.amazonaws.com/0/129662/dee24c2d-394f-410a-7253-9ce1a9a183e3.png "Kobito.kRObnk.png")


### まとめ
最低限のAnsibleのPlaybookと、Jenkinsのジョブを使って、OpenJ9とOpenLibertyを導入しました。
server.envファイルにJavaのパスを設定して、サーバー（JVM）作成＆起動するtaskは次回に追加したいと思います。
またAnsibleのディレクトリ設計やJenkinsのジョブ構成についても最低限なので今後改善をしていきたいと思います。