SpringBootのアプリをansibleでデプロイ
Spring Bootのアプリをansibleでデプロイ
CentoOS7の環境で確認
初期設定
1. ansibleをインストール
2. 疎通設定
管理側端末で鍵生成
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で接続してコマンド実行ができるか確認する
Spring BootのアプリをリストアするPlayBookを書いてみる
とりあえず疎通が確認できたところでjavaとapacheさえ入っていれば動く簡単な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のインストールですが、とりあえずyumでjavaをインストールするものだけ記述しておきました。
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