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" 

倚段階環境開発、事前生産、生産など


さたざたな環境たずえば、 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_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を䜿甚するより耇雑な䟋がありたす。



Source: https://habr.com/ru/post/J317922/


All Articles