ansistrano.deploy

Ansistrano

ビルドステータス 総デプロイ数 年次デプロイ数 月次デプロイ数 今日のデプロイ数

ansistrano.deployansistrano.rollback は、PHP、Python、Rubyなどのスクリプトアプリケーションのデプロイプロセスを簡単に管理するためのAnsibleロールです。これはCapistranoのAnsibleポートです。

歴史

Capistrano はリモートサーバー自動化ツールで、現在はバージョン3です。元々バージョン2.0はRoRアプリケーションをデプロイするために考案されました。追加のプラグインを使用することで、PHPやPythonなどのRails以外のアプリケーションも異なるデプロイ戦略、ステージなどを用いてデプロイできました。私はCapistrano v2が大好きで、頻繁に使用していました。プラグインも開発しました。

Capistrano 2は素晴らしいツールで、今でもかなりの活躍をしています。しかし、元のチームがv3に取り組んでいるためもあり、もはやメンテナンスされていません。この新しいバージョンでは同じ機能セットがなく、柔軟性に欠けます。また、Ansibleのようにアプリケーションをデプロイするための他の新しいツールの方が、使いやすくなっています。

そのため、Capistranoの利用をやめ、v2がメンテナンスされず、v3に十分な機能がないこと、AnsibleでCapistranoができることのすべてが実行可能であると判断しました。代替手段を探している場合は、FabricやChef Soloをチェックしてください。

プロジェクト名

AnsistranoはAnsible + Capistranoから来ています。簡単ですね?

Ansistranoの匿名使用統計

Ansistranoには、HTTPリクエストをサーバーに送信するオプションのステップがあります。Ansible Galaxyから得られるメトリクスは限られているため、現在のアクティブユーザー数を測定する数少ない方法の一つです。

このデータは使用統計のためだけに使用しますが、もし不安な場合は、プレイブック内でansistrano_allow_anonymous_statsをfalseに設定することで、この追加ステップを無効にできます。

誰がAnsistranoを使っていますか?

Ansistranoは使用可能ですか? 以下は、現在使用しているいくつかの企業です:

もしあなたも使用している場合は、PRを通じてこのドキュメントに知らせてください。

要件

Ansistranoでアプリをデプロイするには、以下が必要です。

  • デプロイ先のマシンにAnsible
  • rsyncがターゲットマシンに必要です(rsyncrsync_directgitデプロイメント戦略を使用する場合、またはansistrano_current_via = rsyncを使用する場合)

インストール

Ansistranoは、Ansible Galaxyを通じてグローバルに配布されるAnsibleロールです。Ansistranoロールをインストールするには、以下のコマンドを使用できます。

$ ansible-galaxy install ansistrano.deploy ansistrano.rollback

更新

ロールを更新するには、インストール時に**--force**パラメータを渡す必要があります。以下のコマンドをチェックしてください:

$ ansible-galaxy install --force ansistrano.deploy ansistrano.rollback

機能

  • 数秒でのロールバック(ansistrano.rollbackロールを使用)
  • 重要なステップの前後でフックを使用してデプロイのカスタマイズ
  • ホスト内での固定リリース数を保持することでディスクスペースを節約
  • SCP、RSYNC、GIT、SVN、HG、HTTPダウンロード、またはS3 GETデプロイメント戦略からの選択(オプションの解凍ステップを含む)

主なワークフロー

AnsistranoはCapistranoのフローに従ってアプリケーションをデプロイします。

  • セットアップフェーズ:リリースを保持するためのフォルダ構造を作成
  • コード更新フェーズ:新しいリリースをホストに配置
  • シンリンクフェーズ:新しいリリースをホストにデプロイした後、このステップでcurrentソフトリンクを新しいリリースに変更
  • クリーンアップフェーズ:ansistrano_keep_releasesパラメータに基づいて古いバージョンを削除(「役割変数」を参照)

Ansistranoフロー

役割変数

vars:
  ansistrano_deploy_from: "{{ playbook_dir }}/" # ローカルプロジェクトのパス(相対または絶対パス)
  ansistrano_deploy_to: "/var/www/my-app" # デプロイ先の基準パス
  ansistrano_version_dir: "releases" # リリースフォルダ名
  ansistrano_shared_dir: "shared" # 共有フォルダ名
  ansistrano_current_dir: "current" # ソフトリンク名。あまり変更するべきではありません。
  ansistrano_current_via: "symlink" # コードが現在のパスにデプロイされるためのデプロイ戦略。選択肢はsymlinkまたはrsync
  ansistrano_keep_releases: 0 # 新しいデプロイ後に保持するリリース数。「古いリリースの削除」を参照。

  # 共有されるディレクトリとファイルの配列
  ansistrano_shared_paths: []
  ansistrano_shared_files: []

  # 共有パスとベースディレクトリの自動作成設定
  ansistrano_ensure_shared_paths_exist: yes
  ansistrano_ensure_basedirs_shared_files_exist: yes
  
  # デプロイ戦略 - コードを届けるために使用するメソッド。選択肢はcopy、download、git、rsync、rsync_direct、svn、またはs3。
  ansistrano_deploy_via: rsync 

  # rsync/rsync_directデプロイメント戦略で使用される変数
  ansistrano_rsync_extra_params: "" # rsyncでデプロイする際に使用する追加パラメータ
  ansistrano_rsync_set_remote_user: yes 
  # (内容に関しては[ansible synchronize module](http://docs.ansible.com/ansible/synchronize_module.html)を参照)
  ansistrano_rsync_path: "" 
  ansistrano_rsync_use_ssh_args: no 

  # Gitデプロイメント戦略で使用される変数
  ansistrano_git_repo: [email protected]:USERNAME/REPO.git # gitリポジトリの場所
  ansistrano_git_branch: master # チェックアウトするリポジトリのバージョン
  ansistrano_git_repo_tree: "" 
  ansistrano_git_identity_key_path: "" 
  ansistrano_git_identity_key_remote_path: "" 
  ansistrano_git_identity_key_shred: true 
  ansistrano_git_refspec: ADDITIONAL_GIT_REFSPEC 
  ansistrano_git_ssh_opts: "-o StrictHostKeyChecking=no" 
  ansistrano_git_depth: 1 
  ansistrano_git_executable: /opt/local/bin/git 

  # SVNデプロイメント戦略で使用される変数
  ansistrano_svn_repo: https://svn.company.com/project 
  ansistrano_svn_branch: trunk 
  ansistrano_svn_revision: HEAD 
  ansistrano_svn_username: user 
  ansistrano_svn_password: Pa$$word 
  ansistrano_svn_environment: {} 

  # HGデプロイメント戦略で使用される変数
  ansistrano_hg_repo: https://[email protected]/USERNAME/REPO 
  ansistrano_hg_branch: default 

  # ダウンロードデプロイメント戦略で使用される変数
  ansistrano_get_url: https://github.com/someproject/somearchive.tar.gz 

  # S3デプロイメント戦略で使用される変数
  ansistrano_s3_bucket: s3bucket
  ansistrano_s3_object: s3object.tgz 
  ansistrano_s3_region: eu-west-1 
  ansistrano_s3_rgw: false 
  ansistrano_s3_url: http://rgw.example.com

  # GCSデプロイメント戦略で使用される変数
  ansistrano_gcs_bucket: gcsbucket
  ansistrano_gcs_object: gcsobject.tgz 
  ansistrano_gcs_region: eu-west-1 

  # フック:カスタムタスクが必要な場合
  ansistrano_before_setup_tasks_file: "{{ playbook_dir }}/<your-deployment-config>/my-before-setup-tasks.yml"
  # その他のフックも同様に設定

{{ playbook_dir }}は現在のプレイブックへのパスを保持するAnsibleの変数です。

デプロイ

Ansistranoでデプロイするには、いくつかのステップを行う必要があります:

  • 新しいhostsファイルを作成します。アドバイスが必要な場合は、ansible inventory documentationを確認してください。このファイルはデプロイするホストを特定します。マルチステージ環境についてはマルチステージ環境を参照してください。
  • アプリをデプロイするための新しいプレイブックを作成します。例えば、deploy.ymlです。
  • 役割変数を設定します(「役割変数」を参照)。
  • プレイの一部としてansistrano.deployロールを含めます。
  • デプロイプレイブックを実行します。

ansible-playbook -i hosts deploy.yml

すべてが正しく設定されていれば、このコマンドはサーバーに以下のような大まかなディレクトリ構造を作成します。1回目、2回目、3回目のデプロイ後のホストフォルダの構造を見ることができます。

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

シリアルデプロイ

複数のサーバーにデプロイする際に異なるタイムスタンプが発生するのを防ぐために、ansistrano_release_version変数を設定することをお勧めします。

ansible-playbook -i hosts -e "ansistrano_release_version=`date -u +%Y%m%d%H%M%SZ`" deploy.yml

ロールバック

Ansistranoでロールバックするには、デプロイメントを設定し、ロールバックプレイブックを実行する必要があります。

ansible-playbook -i hosts rollback.yml

デプロイされたリリースがゼロまたは一つの場合、エラーが発生しアクションは実行されません。

ロールバックロールで調整可能な変数は、デプロイ時よりも少なくなります:

vars:
  ansistrano_deploy_to: "/var/www/my-app" # デプロイ先の基準パス
  ansistrano_version_dir: "releases" # リリースフォルダ名
  ansistrano_current_dir: "current" # ソフトリンク名。あまり変更するべきではありません。
  ansistrano_rollback_to_release: "" # 指定された場合、アプリケーションはこのリリースバージョンにロールバックされます。
  ansistrano_remove_rolled_back: yes # 後での確認のためにロールバックされたリリースをサーバーに保持する設定を変更可能
  ansistrano_allow_anonymous_stats: yes

  # フック:カスタムタスクが必要な場合
  ansistrano_rollback_before_setup_tasks_file: "{{ playbook_dir }}/<your-deployment-config>/my-rollback-before-setup-tasks.yml"
  # その他のフックも同様に設定

マルチステージ環境(開発、前準備、本番など)

開発、前準備、本番など、異なる環境にデプロイしたい場合は、異なるホストファイルを作成することをお勧めします。作成が完了したら、デプロイプレイブック実行時に**-i**パラメータを使用して異なるホストファイルを指定できます。各ホストファイルに異なるユーザーやパスワード、接続パラメータなどを指定できます。

ansible-playbook -i hosts_devel deploy.yml

ansible-playbook -i hosts_preprod deploy.yml

ansible-playbook -i hosts_prod deploy.yml

フック:カスタムタスク

通常、Symlinkステップの後にウェブサーバーを再起動する必要があります。または、Code updateの前に依存関係をダウンロードする必要があるかもしれません。これを行うために、各主要3つのステップの前後に実行されるフックが用意されています。これは、他の類似のデプロイメントロールとの主な利点です。

-- /my-local-machine/my-app.com
|-- hosts
|-- deploy.yml
|-- my-custom-tasks
|   |-- before-code-update.yml
|   |-- after-code-update.yml
|   |-- before-symlink.yml
|   |-- after-symlink.yml
|   |-- before-cleanup.yml
|   |-- after-cleanup.yml

たとえば、Symlinkステップの後にApacheを再起動するには、after-symlink.ymlに以下を追加します。

- name: Apache再起動
  service: name=httpd state=reloaded
  • Q: デプロイ後にメール通知を送信するにはどこに追加しますか?
  • Q: (PHPとSymfony開発者向け) キャッシュをクリーンアップするのはどこですか?

カスタムタスクファイルを記述する際に、ansistrano_before_*_tasks_fileansistrano_after_*_tasks_file役割変数を使用して任意のカスタムタスクファイルを指定できます。「役割変数」を参照してください。

カスタムタスクの変数

カスタムタスクファイルを書く際に、Ansistranoが提供する変数が必要になるかもしれません:

  • {{ ansistrano_release_path.stdout }}: 現在のデプロイメントリリースのパス
  • {{ ansistrano_releases_path }}: リリースフォルダのパス
  • {{ ansistrano_shared_path }}: 共有フォルダのパス
  • {{ ansistrano_release_version }}: リリースの相対ディレクトリ名(デフォルトはUTCタイムゾーンの現在のタイムスタンプと等しい)

古いリリースの削除

継続的デリバリー環境では、稼働中のリリースが多くなる可能性があります。十分なスペースがある場合は問題ありませんが、一般的には、カスタム数のリリースのみを保持することが推奨されます。

デプロイ後、古いリリースを削除したい場合は、ansistrano_keep_releases変数に保持したいリリースの総数を設定します。

ansistrano_keep_releases: 2の設定で3回デプロイされたときの状況を見てみましょう:

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

リリース20100509145325が削除されたことがわかります。

サンプルプレイブック

exampleフォルダ内には、Ansistranoで小さなアプリケーションをデプロイする方法を示すサンプルプロジェクトがあります。

実行するには、Vagrantとansistranoロールがインストールされている必要があります。Vagrantに関する詳細は、https://www.vagrantup.com を確認してください。

$ cd example/my-playbook
$ vagrant up
$ ansible-playbook -i hosts deploy.yml

これらのコマンドを実行すると、my-appフォルダ内のindex.htmlが両方のvagrantボックスにデプロイされます。

ロールバックプレイブックをテストするには、少なくとも2回(ロールバック対象があるように)deploy.ymlを実行する必要があります。それが完了したら、以下を実行するだけです。

$ ansible-playbook -i hosts rollback.yml

テストフォルダ内にあるより高度なサンプルも確認できます。

サンプルプロジェクト

Ansistranoは、私たちが取り組んでいる他のプロジェクトでもサポートされています。

例として、LastWishesデプロイメントの実行ログを見てみましょう:

PLAY [最後の願いアプリケーションをサーバーにデプロイ] ************************************

事実収集 ***************************************************************
ok: [quepimquepam.com]

タスク: [ansistrano.deploy | デプロイメントの基本パスが存在することを確認] ***
ok: [quepimquepam.com]

タスク: [ansistrano.deploy | リリースフォルダが存在することを確認] ***
ok: [quepimquepam.com]

タスク: [ansistrano.deploy | 共有要素フォルダが存在することを確認] ***
ok: [quepimquepam.com]

タスク: [ansistrano.deploy | リリースのタイムスタンプを取得] ***********
changed: [quepimquepam.com]

タスク: [ansistrano.deploy | リリースパスを取得] ****************
changed: [quepimquepam.com]

タスク: [ansistrano.deploy | リリースパスを取得] ***************
changed: [quepimquepam.com]

タスク: [ansistrano.deploy | 共有パスを取得(rsyncの場合)] ***
changed: [quepimquepam.com]

タスク: [ansistrano.deploy | リモート共有コピーにアプリケーションファイルをrsync(rsyncの場合)] ***
changed: [quepimquepam.com -> 127.0.0.1]

タスク: [ansistrano.deploy | サーバーに既存コードをデプロイ] ***
changed: [quepimquepam.com]

タスク: [ansistrano.deploy | リモートサーバーに既存コードをデプロイ] ***
skipping: [quepimquepam.com]

タスク: [ansistrano.deploy | リモートリポジトリをアップデート] ********
skipping: [quepimquepam.com]

タスク: [ansistrano.deploy | リポジトリのコピーをエクスポート] *******
skipping: [quepimquepam.com]

タスク: [ansistrano.deploy | サーバーにコードをデプロイする] *****
skipping: [quepimquepam.com]

タスク: [ansistrano.deploy | リリースバージョンにREVISIONファイルをコピー] ***
changed: [quepimquepam.com]

タスク: [ansistrano.deploy | リリースコードをアップデート] *****
changed: [quepimquepam.com]

タスク: [ansistrano.deploy | 新しいリリースへのソフトリンクを変更] ***
changed: [quepimquepam.com]

タスク: [ansistrano.deploy | Apacheを再読み込み] *******************
changed: [quepimquepam.com]

タスク: [ansistrano.deploy | リリースのクリーンアップ] ***************
skipping: [quepimquepam.com]

プレイ概要 ********************************************************************
quepimquepam.com           : ok=14   changed=10   unreachable=0    failed=0

私たちのことを話している人たち

ライセンス

MIT

その他のリソース

プロジェクトについて

Ansible role to deploy scripting applications like PHP, Python, Ruby, etc. in a Capistrano style

インストール
ansible-galaxy install ansistrano.deploy
ライセンス
mit
ダウンロード
2.5M
所有者
Deploying applications with Ansible in Capistrano style