LoginSignup
7
5

More than 3 years have passed since last update.

Ansistranoでデプロイしてみる

Last updated at Posted at 2020-03-07

Ansistranoとは

CapistranoライクにデプロイできるAnsibleロール。
yamlファイルにデプロイフローを書くことで簡単にデプロイができます。
AnsistranoはAnsible Galaxyから入手可能です。

※Ansible Galaxyとは
Ansible GalaxyとはAnsibleのロールを共有できるホスティングサービスのこと。

色々なデプロイ方法に対応

アプリケーションをデプロイする方法を色々提供しています。

  • scp
  • rsync
  • git
  • svn
  • hg
  • HTTPダウンロード
  • S3 get

バージョン管理を行える

アプリケーションのバージョンを指定した数まで保持することができます。これにより、過去のバージョンへの切り戻し(ロールバック)が簡単に行えます。
また、アプリケーションのバージョン数が指定した数を超えると、最古のバージョンのものが削除されていきます。これにより、サーバのディスクスペースを食い尽くしません。

ロールバックが可能

コマンド一つで簡単にロールバック可能です。

デプロイの各ステップ前後に処理を挟める

後述しますが、Ansistranoはデプロイフローが決められています。デプロイフローは5つのステップで構成されており、それぞれのステップの前後には任意の処理を挟むことができます。

使い方

使用したバージョン

以下のバージョンを前提に記載しています。

ツール・ロールなど バージョン
ansistrano.deploy 3.4.0
ansistrano.rollback 3.0.0
ansible-playbook 2.9.6

インストール

Ansible Galaxyからデプロイ用とロールバック用のAnsistranoロールをインストールします。

$ ansible-galaxy install ansistrano.deploy ansistrano.rollback

デプロイplaybook作成

以下はgit cloneでアプリケーションを取得してそれを配置している例です。

deploy.yml
---
- hosts: webserver
  remote_user: vagrant
  become: yes

  vars:
    ansistrano_deploy_to: /var/www/my-app
    ansistrano_keep_releases: 5
    ansistrano_deploy_via: git # ここをgitにする
    ansistrano_git_repo: git@github.com:kawakawaryuryu/my-app.git
    ansistrano_git_branch: master
    ansistrano_git_identity_key_path: ~/.ssh/id_rsa
  roles:
    - ansistrano.deploy # デプロイ用のAnsistranoロールを指定する

実行(デプロイ)

$ ansible-playbook -i dev.yml deploy.yml

これだけ!

デプロイ後

デプロイ後のディレクトリ構造は以下のようになります。

-- /var/www/my-app.com
|-- current -> /var/www/my-app.com/releases/20100512131539
|-- releases
|   |-- 20100512131539
|   |-- 20100509150741
|   |-- 20100509145325
|-- shared
|-- repo

それぞれのディレクトリの意味合いは以下の通りです。

ディレクトリ 内容
current 現在のアプリケーションコードを格納する
releasesディレクトリ配下の最新のバージョンに対してシンボリックリンクを貼っている
releases リリース日時ごとにアプリケーションコードを格納する
アプリケーションコードの数はansistrano_keep_releasesで指定した数を上限とする
shared releasesディレクトリの共通アセットを格納する
repo gitで取得したソース(リポジトリ)を格納する

デプロイplaybook

基本的に書くことは以下の2つです。

  • rolesにansistrano.deployを指定する
  • varsにansistrano~の変数を定義する

varsに定義する変数はこちらを参照してください。

例1: デプロイ先でgit cloneしてアプリケーションを配置するplaybook

deploy.yml
---
- hosts: webserver
  remote_user: vagrant
  become: yes

  vars:
    ansistrano_deploy_to: /var/www/sample-spring-boot
    ansistrano_keep_releases: 5
    ansistrano_deploy_via: git # ここをgitにする
    ansistrano_git_repo: git@github.com:kawakawaryuryu/sample-spring-boot.git
    ansistrano_git_branch: master
    ansistrano_git_identity_key_path: ~/.ssh/id_rsa # git pullするためのssh秘密鍵のあるローカルのパス
  roles:
    - carlosbuenosvinos.ansistrano-deploy

例2: rsyncでローカルからサーバーに対してデプロイするplaybook

deploy.yml
---
- hosts: webserver
  remote_user: vagrant
  become: yes

  vars:
    ansistrano_deploy_from: tmp/target/sample-spring-boot-1.0-SNAPSHOT.jar
    ansistrano_deploy_to: /var/www/sample-spring-boot
    ansistrano_keep_releases: 5
    ansistrano_deploy_via: rsync
    ansistrano_before_update_code_tasks_file: create-jar.yml
    ansistrano_after_cleanup_tasks_file: cleanup.yml
  roles:
    - ansistrano.deploy

デプロイフロー

Ansistranoはデプロイのフローが決められており、以下のようになっています。
Main workflow

フェーズ 内容
Setup releasesディレクトリ配下にリリース日時を名前としたディレクトリを作成する
Update Code アプリケーションをreleasesディレクトリに配置する
Symlink Shared releasesディレクトリ配下のファイルやディレクトリのシンボリックリンクをsharedディレクトリ配下のファイルやディレクトリに向ける
Symlink デプロイ後currentディレクトリのシンボリックリンクを最新のreleasesディレクトリ配下のものに向ける
Clean Up releasesディレクトリ以下の最古のものを削除する
これはansistrano_keep_releasesで指定した数を超えた場合に実行される

またそれぞれのフェーズの前後にbefore〜とafter〜というフェーズがあり、任意のタスクを挿入することができます。
例えば先程の例2のデプロイplaybookではUpdate Codeの前にcreate-jar.yml、Clean Upの後にcleanup.yml内に書かれているタスクを実行しています。

deploy.yml
---
- hosts: webserver
  remote_user: vagrant
  become: yes

  vars:
    ansistrano_deploy_from: tmp/target/sample-spring-boot-1.0-SNAPSHOT.jar
    ansistrano_deploy_to: /var/www/sample-spring-boot
    ansistrano_keep_releases: 5
    ansistrano_deploy_via: rsync
    ansistrano_before_update_code_tasks_file: create-jar.yml # Update Code前に処理を挟む
    ansistrano_after_cleanup_tasks_file: cleanup.yml # Clean Up後に処理を挟む
  roles:
    - ansistrano.deploy

create-jar.yml:
gitからリポジトリをcloneしてソースコードをビルドしてjarを生成する

create-jar.yml
---
- block:
  - name: clone project
    git:
      repo: git@github.com:kawakawaryuryu/sample-spring-boot.git
      dest: tmp
  - name: build jar
    command: mvn clean package
    args:
      chdir: tmp

  delegate_to: localhost 
  run_once: true
  become_user: "{{ dev_user }}"

cleanup.yml:
create-jar.ymlで生成したtmpディレクトリを削除する

cleanup.yml
---
- name: delete tmp directory
  file:
    path: tmp
    state: absent
  delegate_to: localhost 
  become_user: "{{ dev_user }}"

ロールバック

アプリケーションを一つ前にリリースした状態に戻すことができます。
最新のリリースバージョンは削除されます。

ロールバック前

-- /var/www/my-app.com
|-- current -> /var/www/my-app.com/releases/20100512131539
|-- releases
|   |-- 20100512131539
|   |-- 20100509150741
|   |-- 20100509145325
|-- shared
|-- repo

ロールバック後

-- /var/www/my-app.com
|-- current -> /var/www/my-app.com/releases/20100509150741
|-- releases
|   |-- 20100509150741
|   |-- 20100509145325
|-- shared
|-- repo

ロールバックplaybook

デプロイと同様に基本的に書くことは以下の2つです。

  • rolesにansistrano.rollbackを指定する
  • varsにansistrano~の変数を定義する

varsに定義する変数はこちらを参照。

rollback.yml
---
- hosts: webserver
  remote_user: vagrant
  become: yes

  vars:
    ansistrano_deploy_to: /var/www/sample-spring-boot
  roles:
    - ansistrano.rollback # ロールバック用のAnsistranoロールを指定する

実行

$ ansible-playbook -i dev.yml rollback.yml

サンプルソースコード

今回作成したPlaybookとアプリケーションのサンプルです。

参考

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5