
ansistrano.deployおよびansistrano.rollbackは、スクリプトプログラミング言語(PHP、Python、Rubyなど)で作成されたアプリケーションの展開プロセスを制御するために設計されたAnsibleロールです。 これは本質的にAnsibleのCapistranoの実装です。
Ansistranoを使用すると、次の利点があります。
- 秒単位のロールバック(ansistrano.rollbackの役割);
- 重要なステップの「前」および「後」イベントハンドラーメソッドを使用して展開手順を設定します。
- 限られた数のリリースを保存することにより、ディスク使用量を最適化する
- SCP、RSYNC、GIT、SVN、HTTPダウンロードまたはS3 GET展開戦略の選択(さらに、 アーカイブ解除も使用できます)。
アンシストラノの登場
最初は、サーバー管理自動化ツールであるCapistranoがありました。 現在のバージョンには3という番号が付けられています。RoRアプリケーションを展開するためにバージョン2.0が作成されました。 プラグインを使用すると、さまざまな展開戦略、テスト環境などを使用して、PHPやPythonなどで記述された非Railsアプリケーションを操作できます。 そしてそれは良かった。
Capistrano 2は、引き続き機能する優れたツールです。 しかし、開発者が3番目のバージョンに切り替えたため、サポートされなくなりました。 同時に、Ansistranoの作成者によると、Capistrano 3は柔軟性が低く、それほど強力ではなく、以前のバージョンと同じ機能セットも備えていません。 さらに、他のアプリケーション展開ツール(Ansibleなど)はまだ機能せず、常に改善されています。
Ansistranoの開発者は、バージョン2のサポートの欠如とv3の機能の欠如、および必要なすべてのタスクをAnsibleで実行できるという事実によるCapistranoの放棄について説明しています。 別の方法は、FabricとChef Soloを調べることです。
ちなみに、プロジェクトの名前-Ansistranoは、AnsibleとCapistranoを組み合わせて取得されました。
Ansistrano匿名使用統計
最近、追加のオプションのステップがAnsistranoに追加されました。これにより、開発者は、Ansistranoを使用してアプリケーションを展開している人数を知ることができます。 Ansible Galaxyはダウンロードや使用に関する統計情報を提供していないため、Ansistranoの著者は、これがプロジェクトのユーザー数を調べるためのほぼ唯一の方法であると主張しています。
匿名統計を収集するためのコードはこちらです。 これも プローブ すべてのプレイブックでansistrano_allow_anonymous_stats
設定をfalseに設定すると、機能を無効にできます。
誰がAnsistranoを使用していますか?
Ansistranoを使用する準備はできていますか?
インストールとアップグレード
Ansistranoでアプリケーションをデプロイするには、次のものが必要です。
- 中央のマシンで実現可能。
- ターゲットマシン上の
rsync
(デプロイメント戦略がrsync
、git
またはansistrano_current_via = rsync
)。
AnsistranoはAnsible Galaxyから入手できます。 インストールを開始するには、次を実行します。
$ ansible-galaxy install carlosbuenosvinos.ansistrano-deploy carlosbuenosvinos.ansistrano-rollback
Ansistranoをアップグレードするには、--force オプションを追加します 。
$ ansible-galaxy install --force carlosbuenosvinos.ansistrano-deploy carlosbuenosvinos.ansistrano-rollback
基本的な仕事のスキーム
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_current_dir: "current" # , . ansistrano_current_via: "symlink" # "current". : "symlink" "rsync". ansistrano_shared_paths: [] # . ansistrano_shared_files: [] # . ansistrano_keep_releases: 0 # , . . « ». ansistrano_deploy_via: "rsync" # . : "copy", "rsync", "git", "svn", "s3" "download". "copy", "download" "s3" (unarchive) ( "_unarchive"). *tasks/update-code*. ansistrano_allow_anonymous_stats: yes # , "rsync" ansistrano_rsync_extra_params: "" # , rsync . Ansible , "--include". . https://github.com/ansistrano/deploy/commit/e98942dc969d4e620313f00f003a7ea2eab67e86 ansistrano_rsync_set_remote_user: yes # . [ansible synchronize module](http://docs.ansible.com/ansible/synchronize_module.html). : "yes", "no". # , Git ansistrano_git_repo: git@github.com:USERNAME/REPO.git # git. ansistrano_git_branch: master # . 40- SHA-1, HEAD, (tag name). ansistrano_git_repo_tree: "" # (subtree) . ansistrano_git_identity_key_path: "" # , git, , . # , SVN # : Ansible 1.8.x subversion (https://github.com/ansible/ansible-modules-core/issues/370), Ansible 1.9. ansistrano_svn_repo: "https://svn.company.com/project" # svn ansistrano_svn_branch: "trunk" # . ansistrano_svn_revision: "HEAD" # . ansistrano_svn_username: "user" # SVN authentication username ansistrano_svn_password: "Pa$$word" # SVN authentication password # , download ansistrano_get_url: https://github.com/someproject/somearchive.tar.gz # , S3 ansistrano_s3_bucket: s3bucket ansistrano_s3_object: s3object.tgz # _unarchive ansistrano_deploy_via, (, s3_unarchive) ansistrano_s3_region: eu-west-1 ansistrano_s3_rgw: false # Ansible >= 2.2, Ceph RGW ( "true", ansistrano_s3_region) ansistrano_s3_url: http://rgw.example.com # Ceph RGW url # , ansistrano_s3_aws_access_key: YOUR_AWS_ACCESS_KEY ansistrano_s3_aws_secret_key: YOUR_AWS_SECRET_KEY # Hooks: ( ) ansistrano_before_setup_tasks_file: "{{ playbook_dir }}/<your-deployment-config>/my-before-setup-tasks.yml" ansistrano_after_setup_tasks_file: "{{ playbook_dir }}/<your-deployment-config>/my-after-setup-tasks.yml" ansistrano_before_update_code_tasks_file: "{{ playbook_dir }}/<your-deployment-config>/my-before-update-code-tasks.yml" ansistrano_after_update_code_tasks_file: "{{ playbook_dir }}/<your-deployment-config>/my-after-update-code-tasks.yml" ansistrano_before_symlink_shared_tasks_file: "{{ playbook_dir }}/<your-deployment-config>/my-before-symlink-shared-tasks.yml" ansistrano_after_symlink_shared_tasks_file: "{{ playbook_dir }}/<your-deployment-config>/my-after-symlink-shared-tasks.yml" ansistrano_before_symlink_tasks_file: "{{ playbook_dir }}/<your-deployment-config>/my-before-symlink-tasks.yml" ansistrano_after_symlink_tasks_file: "{{ playbook_dir }}/<your-deployment-config>/my-after-symlink-tasks.yml" ansistrano_before_cleanup_tasks_file: "{{ playbook_dir }}/<your-deployment-config>/my-before-cleanup-tasks.yml" ansistrano_after_cleanup_tasks_file: "{{ playbook_dir }}/<your-deployment-config>/my-after-cleanup-tasks.yml"
{{ playbook_dir }}
は、現在のプレイブックへのパスを格納するAnsible変数です。
展開
Ansistranoを使用して展開するには、いくつかの手順を実行します。
- 新しい
hosts
作成hosts
。 質問がある場合は、 Ansible Inventoryのドキュメントを参照してください。 このファイルには、ターゲットマシンが表示されます。 - 新しいプレイブックを作成して、アプリケーションをデプロイします(例:
deploy.yml
)。 - ロール変数を構成します。
- スクリプトに
carlosbuenosvinos.ansistrano-deploy
ロールを含めます(再生)。 - プレイブックを起動します。
ansible-playbook -i hosts deploy.yml
すべてが正しく構成されていれば、このコマンドはサーバー上におよそ次のディレクトリ構造を作成します。 1つ、2つ、および3つの展開の後にhostsディレクトリがどのように見えるかを確認します。
-- /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
順次展開
serial
オプションを使用して複数のサーバーに展開するときに異なるタイムスタンプがインストールされるのを防ぐには、 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
デプロイされたリリースの数を1または0にロールバックしようとすると、エラーが発生します。 アクションは実行されません。
ロールバックシナリオでは、デプロイと比較してカスタム変数がはるかに少なくなります。
- vars: ansistrano_deploy_to: "/var/www/my-app" # . ansistrano_version_dir: "releases" # . ansistrano_current_dir: "current" # , . # Hooks: ( ) ansistrano_before_symlink_tasks_file: "{{ playbook_dir }}/<your-deployment-config>/my-before-symlink-tasks.yml" ansistrano_after_symlink_tasks_file: "{{ playbook_dir }}/<your-deployment-config>/my-after-symlink-tasks.yml" ansistrano_before_cleanup_tasks_file: "{{ playbook_dir }}/<your-deployment-config>/my-before-cleanup-tasks.yml" ansistrano_after_cleanup_tasks_file: "{{ playbook_dir }}/<your-deployment-config>/my-after-cleanup-tasks.yml"
多段階環境(開発、事前生産、生産など)
さまざまな環境(たとえば、 devel 、 preprodおよびprod )にデプロイする場合は、それぞれに異なるホストファイルを作成することをお勧めします。 -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
前に依存関係をダウンロードするか、 Symlink
前に実稼働で行う必要があります。 したがって、カスタムタスクを完了するには、3つの主要な各ステップの前または後にAnsistranoが完了するフックが必要です。
-- /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
たとえば、 after-symlink.yml
ステップ後にApacheを再起動するには、 after-symlink.yml
次の行を追加します。
- name: Restart Apache service: name=httpd state=reloaded
展開がメールで完了したことを通知するか、キャッシュをクリアするにはどうすればよいですか? とても簡単です! ロールansistrano_before_*_tasks_file
およびansistrano_after_*_tasks_file
の変数を使用して、各ステップの「前」および「後」のポイントにカスタムタスクを持つファイルを指定できます。
カスタムタスクの変数
カスタムタスクファイルを作成する場合、Ansistranoで使用可能な変数のいくつかが必要になる場合があります。
-
{{ ansistrano_release_path.stdout }}
:展開のための現在のリリースへのパス(これはおそらく最も必要な変数です)。 -
{{ ansistrano_releases_path.stdout }}
:リリースディレクトリへのパス。 -
{{ ansistrano_shared_path.stdout }}
:共有フォルダーへのパス(すべてのリリースに共通のファイルを保存できる場所); -
{{ ansistrano_release_version }}
:リリースディレクトリの相対名(デフォルトはUTCゾーンの現在のタイムスタンプになります)。
古いリリースを削除する
継続的デリバリーが使用される環境では、通常、商用で使用するための多くのリリースがあります。 空きディスク領域が過剰にある幸運な人は、これを問題とは思わないかもしれませんが、限られた数のリリースのみを保存するのが一般的です。
展開後に古いリリースを削除するには、保持したい量をansistrano_keep_releases
変数に書き込みます。
3つのリリースとansistrano_keep_releases: 2
デプロイするときのAnsistranoの動作を見てみましょうansistrano_keep_releases: 2
:
-- /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
削除され20100509145325
いることに注意してください。
プレイブックの例
Ansistranoリポジトリのexample
ディレクトリには、小さなアプリケーションをデプロイする例を提供するデモプロジェクトがあります。
実行するには、VagrantロールとAnsistranoロールが必要です。 Vagrantの操作については、 https: //www.vagrantup.comを参照してください 。
$ cd example/my-playbook $ vagrant up $ ansible-playbook -i hosts deploy.yml
これらのコマンドを実行すると、 my-app
ディレクトリにあるindex.htmlファイルがVagrantを使用して作成された両方のマシンにデプロイされます。
ロールバックをテストするには、 deploy.ymlを少なくとも2回実行する必要があります(そのため、ロールバックするものがあります)。 その後:
$ ansible-playbook -i hosts rollback.yml
テストフォルダーには、Travis-CIを使用するより複雑な例があります。