ansistrano.deploy
Ansistrano
ansistrano.deploy と ansistrano.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は使用可能ですか? 以下は、現在使用しているいくつかの企業です:
- ABA English
- Another Place Productions
- Aptvision
- ARTACK WebLab
- Atrápalo
- Beroomers
- CMP Group
- Cabissimo
- Camel Secure
- Cherry Hill
- Claranet France
- Clearpoint
- Clever Age
- CridaDemocracia
- Cycloid
- Daemonit
- Deliverea
- DevOps Barcelona Conference
- Durable Programming
- EnAlquiler
- Euromillions.com
- Finizens
- FloraQueen
- Fluxus
- Geocalia
- Gstock
- HackSoft
- HackConf
- Hexanet
- HiringThing
- Holaluz
- Hosting4devs
- Jobbsy
- Jolicode
- Kidfund
- Lumao SAS
- mailXpert
- MEDIA.figaro
- Moss
- Nice&Crazy
- Nodo Ámbar
- Oferplan
- Ofertix
- Òmnium Cultural
- OpsWay Software Factory
- Parkimeter
- PHP Barcelona Conference
- Scoutim
- Socialnk
- Spotahome
- Suntransfers
- TechPump
- Tienda Online VirginMobile
- The Cocktail
- Timehook
- TMTFactory
- UNICEF Comité Español
- Ulabox
- Uvinum
- VirginMobile Chile
- Wavecontrol
- WAVE Meditation
- Yubl
- AmphiBee
- Hexito
もしあなたも使用している場合は、PRを通じてこのドキュメントに知らせてください。
要件
Ansistranoでアプリをデプロイするには、以下が必要です。
- デプロイ先のマシンにAnsible
rsync
がターゲットマシンに必要です(rsync
、rsync_direct
、git
デプロイメント戦略を使用する場合、または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
パラメータに基づいて古いバージョンを削除(「役割変数」を参照)
役割変数
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_file
とansistrano_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: ドメイン駆動設計PHPサンプルアプリ:https://github.com/dddinphp/last-wishes
例として、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
私たちのことを話している人たち
- Pablo Godel - Symfonyのデプロイ - Symfony Cat 2016
- https://www.artansoft.com/2016/05/deploy-de-proyectos-php-ansistrano/
- http://alexmoreno.net/ansistrano-deploying-drupal-ansible
- http://www.ricardclau.com/2015/10/deploying-php-applications-with-ansistrano/
- http://es.slideshare.net/OrestesCA/ansible-intro-ansible-barcelona-user-group-june-2015
- http://carlosbuenosvinos.com/deploying-symfony-and-php-apps-with-ansistrano/
- https://www.youtube.com/watch?v=CPz5zPzzMZE
- https://github.com/cbrunnkvist/ansistrano-symfony-deploy
- https://www.reddit.com/r/ansible/comments/2ezzz5/rapid_rollback_with_ansible/
- Cookiecutting Ansible for Django
- Ansible、Ansible Vault、AnsistranoでPHPアプリケーションをデプロイする
ライセンス
MIT
その他のリソース
Ansible role to deploy scripting applications like PHP, Python, Ruby, etc. in a Capistrano style
ansible-galaxy install ansistrano.deploy