SpringBootのアプリをansibleでデプロイ

Spring Bootのアプリをansibleでデプロイ

CentoOS7の環境で確認

初期設定

 1. ansibleをインストール

yum install epel-release
yum install ansible

 2. 疎通設定
管理側端末で鍵生成

ssh-keygen -t rsa

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
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:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx root@localhost.localdomain
The key's randomart image is:

chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
openssl rsa -in id_rsa -out -out id_rsa_nopass
mv id_rsa_nopass id_rsa

管理される側の端末で操作

scp -p 192.168.xx.xx:/root/.ssh/id_rsa.pub ./id_rsa_temp.pub
cat id_rsa_temp.pub >> ~/.ssh/authorized_keys
chmod 644 ~/.ssh/authorized_keys

管理する側の端末のansibleのhostsにip追加

echo IPアドレス >> /etc/ansible/hosts

ansibleで接続してコマンド実行ができるか確認する

ansible -i /etc/ansible/hosts IPアドレス -m ping

Spring BootのアプリをリストアするPlayBookを書いてみる

とりあえず疎通が確認できたところでjavaapacheさえ入っていれば動く簡単なjavaのアプリをデプロイできるようにしたいと思います。
まず任意のディレクトリを作成しそこに移動します。

mkdiry myAnsible
cd myAnsible

それからhostsファイルを作成します。hostsファイル内で使用するsshキーを指定します。

vi hosts

[test]
IPアドレス

[test:vars]
ansible_ssh_user = root
ansible_ssh_private_key_file = ~/.ssh/ansible

次に以下のようにインストール対象のroleのフォルダを作成しておきます。

└── roles
    ├── apache
    │   ├── files
    │   ├── tasks
    │   └── templates
    ├── java
    │   ├── files
    │   ├── tasks
    │   └── templates
    └── myApp
        ├── files
        ├── tasks
        └── templates

それから実行するPlayBookを作成します。アプリのデプロイ元のパスとデプロイ先のパスはここで直接指定していますが、デプロイ元のファイルパス等環境毎に設定を行いたいものがあれば別で設定をするようにお願いします。

vi playbook.yml

- hosts: test
  sudo: true

  vars:
    - myapp_path: SpringBootのビルドディレクトリ
    - app_dest_path: アプリデプロイ先のパス

  roles:
    - role: apache
    - role: java
    - role: myApp

まずapacheのインストールを行うplaybookを書きたいと思います。

vi roles/apache/tasks/main.yml

---

 - name: install apache
   yum: name=httpd state=installed

 - copy:
     src: "{{ role_path }}/files/my_app.conf"
     dest: "/etc/httpd/conf.d/my_app.conf"
     owner: root
     group: root
     mode: 0644

 - name: add http service to firewall
   command: firewall-cmd --permanent --zone=public --add-service=http

 - name: add https service to firewall
   command: firewall-cmd --permanent --zone=public --add-service=https

 - name: reload firewall
   command: firewall-cmd --reload

 - name: restart apache
   command: apachectl restart

上から順にapacheのインストールapacheとspringboot連携用の設定ファイル、ファイアウォールを通すようにして反映、apache再起動というようになっています。apacheの設定ファイルをコピーしている箇所ではrole_pathの変数を使用していまして、ここではroles/apacheがそれに該当します。ロール毎のディレクトリにあるfilesディレクトリにはデプロイ先に配置するファイルを置いていまして、今回はapache springboot連携用の設定ファイルを配置しています。

次にjavaのインストールですが、とりあえずyumjavaをインストールするものだけ記述しておきました。

vi roles/java/main.yml

---

 - name: install java
   yum: name=java-1.8.0-openjdk state=installed

最後にjavaのアプリをデプロイするplaybookに以下のようなものを作成します。

vi roles/myApp/tasks/main.yml

---

- copy:
    src: "{{ myapp_path }}"
    dest: "{{ app_dest_path }}"
    owner: root
    group: root
    mode: 0644

 - copy:
     src: "{{ role_path }}/files/myAppRestart.sh"
     dest: "{{ app_dest_path }}/myAppRestart.sh"
     owner: root
     group: root
     mode: 0644

 - name: "stop myApp"
   shell: "sh /var/myapp/myAppRestart.sh {{ app_dest_path }}"
   ignore_errors: True


 - name: "start myApp"
   shell: nohup java -jar "{{ app_dest_path }}"/build/libs/JenkinsBuildTest-0.0.1-SNAPSHOT.jar &

copyではデプロイ元の環境にあるjavaのビルド結果をsrcとしてデプロイ先の環境にコピーしています。それからjavaのアプリ再起動用のスクリプトをコピーして実行しています。"ignore_errors: True"は実行したスクリプトが失敗した場合であっても次に進めるという動きをし、今回はjavaのアプリを停止しようとした際に既に停止済みで失敗の結果が返ってきたとしても次のjavaアプリスタートのタスクを実行するようにしています。javaのアプリ実行についてはansible実行に使うssh接続が切れた後でもプロセスが残る必要があったのでnohupコマンドを使用しています。これでおそらく簡単なjavaアプリについてはデプロイできたと思います。

ちなみに今回用意したjavaアプリ停止用のスクリプトではpkillを実行するようにしています。

#!/bin/bash

find $1/build/libs/ -name "*.jar" | gawk -F/ '{print $NF}' | xargs pkill -IO -f