Ansistranoを使用してWebアプリケーションをデプロイする







ansistrano.deployおよびansistrano.rollbackは、スクリプトプログラミング言語(PHP、Python、Rubyなど)で作成されたアプリケーションの展開プロセスを制御するために設計されたAnsibleロールです。 これは本質的にAnsibleのCapistranoの実装です。







Ansistranoを使用すると、次の利点があります。









アンシストラノの登場



最初は、サーバー管理自動化ツールである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でアプリケーションをデプロイするには、次のものが必要です。









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と同じパターンに従います。



















ロール変数



以下は、参照用の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を使用して展開するには、いくつかの手順を実行します。









 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"
      
      





多段階環境(開発、事前生産、生産など)



さまざまな環境(たとえば、 develpreprodおよび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_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を使用するより複雑な例があります。








All Articles