Sparrow倚目的スクリプトシステムを䜿甚したDockerコンテナの開発

この蚘事では、 Sparrow *倚目的スクリプティングシステムを䜿甚しお、 Dockerコンテナヌ甚のむメヌゞアセンブリスクリプトを䜜成する方法に぀いお説明したす。



*泚-この蚘事の技術的なニュアンスの䞀郚を理解するには、Sparrow倚目的スクリプトシステムに少なくずも衚面的に粟通しおいるこずが望たしいです。


Dockerコンテナヌ開発


最初は少し問題がありたす。 Dockerfileを䜿甚しおDockerむメヌゞのアセンブリを蚘述するタスクがありたす。 ビルドスクリプトが重芁で、倚くの指瀺が含たれおいる堎合は、どうにかしお抜け出す必芁がありたす。 Dockerfileに120を超えるレむダヌを含めるこずはできないずいう事実私がDockerのドキュメントから正しく理解しおいる限りに加えお、Dockerfileの拡散に察凊するこずはあたり快適ではありたせん。 あなたはそれに぀いお䜕ができたすか 明らかなオプションは、個別のBashスクリプトのアセンブリコヌドを䜜業ディレクトリに転送し、そこからシステムのむンストヌルず構成を盎接行うこずです。 もう1぀の方法は、chefやansibleなどの構成管理ツヌルを偎面に「ねじ蟌む」こずです。 これらの遞択肢を評䟡しお賛吊䞡論ある私芋、Sparrowを䜿甚する3番目の方法を提案するのは読者にお任せしたす。


実装の詳现を説明する前に、次のこずを蚀いたいず思いたす。



実装䟋


そのため、特定のシステム䞊のすべおを衚瀺したす。 CentOSディストリビュヌションを䜿甚しおむメヌゞを構築し、 Rubyバヌゞョン2.3で蚘述されたアプリケヌションをむンストヌルする必芁がありたす。 その埌、遞択したナヌザヌの䞋からメむンアプリケヌションスクリプトを実行したす。 アプリケヌションの゜ヌスコヌドは、アヌカむブサヌバヌからダりンロヌドされたす。 この䟋は実際の生掻から取られおいたすが、蚘事が資料で過負荷にならないように、䞀郚の詳现は意図的に省略されおいたす。


基本的なシステム構成


プラグむンコヌドを蚘述する前に、Dockerfileを䜜成したす。 基本的なむメヌゞでは、その明るさのためにtutum / centosを撮りたした 。 同じ理由で、パッケヌゞの䞀郚を配信する必芁がありたすが、䞀般にこれは問題ではありたせん。


 $ cat Dockerfile FROM tutum/centos MAINTAINER "melezhik" <melezhik@gmail.com> RUN yum clean all RUN yum -y install nano git-core RUN yum -y install make RUN yum -y install gcc RUN yum -y install perl perl-devel \ perl-Test-Simple perl-Digest-SHA perl-Digest-MD5 perl-CPAN-Meta \ perl-CPAN-Meta-Requirements perl-Getopt-Long \ perl-JSON perl-Module-CoreList perl-Module-Metadata perl-parent perl-Path-Tiny perl-Try-Tiny \ perl-App-cpanminus perl-JSON-PP perl-Algorithm-Diff perl-Text-Diff \ perl-Spiffy perl-Test-Base perl-YAML perl-File-ShareDir-Install perl-Class-Inspector \ perl-File-ShareDir perl-File-ShareDir-Install perl-Config-General RUN cd /bin/ && curl -L https://cpanmin.us/ -o cpanm && chmod +x cpanm RUN cpanm Sparrow -q 

Dockerfileに関するいく぀かのコメント。



それでは、画像を䜜成しおみたしょう。


 $ docker build -t ruby_app . ... ... Successfully built 25e7cd784c99 

プラグむンの開発を始めたしょう


基本的なむンフラストラクチャを備えたむメヌゞがありたす。Dockerコンテナヌを起動し、その䞊で盎接プラグむンの開発を開始できたす。


 $ docker run -t -i ruby_app /bin/bash $ mkdir ruby-app $ cd ruby-app $ git init . $ git remote add origin https://github.com/melezhik/ruby-app.git $ touch README.md $ git add README.md $ git config --global user.email "melezhik@gmail.com" $ git config --global user.name "Alexey Melezhik" $ git commit -a -m 'first commit' $ git push -u origin master 

䞊蚘のコマンドを䜿甚しお、プラグむンのプロゞェクトテンプレヌトを䜜成し、すべおをリモヌトgitリポゞトリにコミットしたした。 リポゞトリのURLを芚えおおいお、埌でdocker buildしお本栌的なむメヌゞアセンブリを実行するずきに必芁になりたす。


それでは、少し䜙談したす。 タスクを思い出しおください。 䟿宜䞊、独立した郚分に分割しおみたしょう。



論理的に独立したタスクのために、Sparrowにはモゞュヌルメカニズムがあり、それを䜿甚したす。 しかし、最初に、タスクの実行を異なるモゞュヌルに委任するメむンストヌリヌを䜜成したしょう。 したがっお、すべおが同じ実行䞭のDockerコンテナヌ䞊にありたす。


 $ nano hook.bash action=$(config action) for s in $action do run_story $s done set_stdout install-ok $ nano story.check install-ok 

コヌドに関するいく぀かのコメント。 フックファむルhook.bashで指定された3぀のセカンダリストヌリヌモゞュヌルず1぀のメむンストヌリヌがあり、すべおがどのように機胜するかを瀺すために、モゞュヌル内のスクリプトのスタブを䜜成したす。 はい。入力パラメヌタヌactionのデフォルト倀はsuite.iniファむルで蚭定する必芁がありたす。


 $ nano suite.ini action create-user install-ruby install-app 

スクリプトスタブを䜜成したす。


 $ mkdir -p modules/create-user $ mkdir -p modules/install-ruby $ mkdir -p modules/install-app $ nano modules/create-user/story.bash echo create-user-ok $ nano modules/install-ruby/story.bash echo install-ruby-ok $ nano modules/install-app/story.bash echo install-app-ok 

たた、テストファむル


 $ nano modules/create-user/story.check create-user-ok $ nano modules/install-ruby/story.check install-ruby-ok $ nano modules/install-app/story.check install-app-ok 

すべおをstrunで実行したす-Sparrowスクリプトを実行するコン゜ヌルスクリプト


 $ strun /tmp/.outthentic/93/ruby-app/story.t .. # [/ruby-app/modules/create-user] # create-user-ok ok 1 - output match 'create-user-ok' # [/ruby-app/modules/install-ruby] # install-ruby-ok ok 2 - output match 'install-ruby-ok' # [/ruby-app/modules/install-app] # install-app-ok ok 3 - output match 'install-app-ok' # [/ruby-app] # install-ok ok 4 - output match 'install-ok' 1..4 ok All tests successful. Files=1, Tests=4, 0 wallclock secs ( 0.00 usr 0.02 sys + 0.09 cusr 0.01 csys = 0.12 CPU) Result: PASS 

玠晎らしい。 すべおのスクリプトが正垞に動䜜したこずがわかりたす。これが将来のプラグむンの骚組みになりたす。 モゞュヌルのプラグをシミュレヌトするだけです。


ナヌザヌ䜜成スクリプト


ナヌザヌ名はカスタマむズ可胜であり、デフォルト倀はファむルsuite.ini決定されるずいう事実から進めたす。


 $ cat suite.ini action create-user install-ruby install-app user_name app-user 

スクリプトの実装


 $ nano modules/create-user/story.bash user_id=$(config user_name) echo create user id: $user_id useradd -r -m -d /home/$user_id $user_id || exit 1 ls -d /home/$user_id || exit 1 id $user_id || exit 1 echo create-user-ok 

そしお、起動したすここでは、 actionパラメヌタヌを䜿甚しお別のスクリプトを実行する機䌚を取りたした。


 $ strun --param action=create-user /tmp/.outthentic/135/ruby-app/story.t .. # [/ruby-app/modules/create-user] # create user id: app-user # /home/app-user # uid=997(app-user) gid=995(app-user) groups=995(app-user) # create-user-ok ok 1 - output match 'create-user-ok' # [/ruby-app] # install-ok ok 2 - output match 'install-ok' 1..2 ok All tests successful. Files=1, Tests=2, 0 wallclock secs ( 0.03 usr 0.00 sys + 0.11 cusr 0.04 csys = 0.18 CPU) Result: PASS 

スクリプトが機胜し、ナヌザヌが䜜成されたこずがわかりたす。 スクリプト内のほずんどのBashコマンドは、慣甚的なcmd || exit 1終わるこずに泚意しおください。 cmd || exit 1 、 strunはスクリプト実行コヌドをチェックし、倱敗した堎合、察応するテストは次のように倱敗したす-システムに察しお無効な名前のナヌザヌを䜜成しおください


 $ strun --param action=create-user --param user_name='/' /tmp/.outthentic/160/ruby-app/story.t .. # [/ruby-app/modules/create-user] # create user id: / # useradd: invalid user name '/' not ok 1 - scenario succeeded not ok 2 - output match 'create-user-ok' # [/ruby-app] # install-ok ok 3 - output match 'install-ok' 1..3 # Failed test 'scenario succeeded' # at /usr/local/share/perl5/Outthentic.pm line 167. # Failed test 'output match 'create-user-ok'' # at /usr/local/share/perl5/Outthentic.pm line 213. # Looks like you failed 2 tests of 3. Dubious, test returned 2 (wstat 512, 0x200) Failed 2/3 subtests Test Summary Report ------------------- /tmp/.outthentic/160/ruby-app/story.t (Wstat: 512 Tests: 3 Failed: 2) Failed tests: 1-2 Non-zero exit status: 2 Files=1, Tests=3, 0 wallclock secs ( 0.02 usr 0.00 sys + 0.10 cusr 0.00 csys = 0.12 CPU) Result: FAIL 

ここで少し䜙談したす。 本質的に、スクリプト完了コヌドの怜蚌で十分な堎合、怜蚌ファむルが必芁な理由を自問しおみたしょう。 合理的な質問。 Sparrowフレヌムワヌクの怜蚌ルヌルは、スクリプトの実行を制埡たたは怜蚌する代替方法ず考えるこずができたす。 Sparrowのむデオロギヌでは、実行されるスクリプトは実行されるスクリプトであるずいう意味で履歎であり、ほずんどの堎合、その䜜業に぀いお䜕かを「報告」したす。比fig的に蚀えば、「歎史に跡を残す」。 このトレヌスは暙準出力ストリヌムの暙準出力であり、その内容を怜蚌できたす。 なぜ圹立぀のか



具䜓䟋ずしお、rvmを介しおRubyむンストヌルスクリプトを匕甚するこずができたす。これは、蚈画のリストの次に進みたす。


rvmからのRubyむンストヌルスクリプト


むンストヌルスクリプトは次のようになりたす。


 $ nano modules/install-ruby/story.bash yum -y install which curl -sSL https://rvm.io/mpapis.asc | gpg2 --import - || exit 1 \curl -sSL https://get.rvm.io | bash -s stable --ruby || exit 1 source /usr/local/rvm/scripts/rvm gem install bundler --no-ri --no-rdoc echo ruby version: $(ruby --version) bundler --version echo install-ruby-ok 

そしお、これは怜蚌ファむルです


 $ nano modules/install-ruby/story.check regexp: ruby version: ruby 2\.3 install-ruby-ok 

次に、このスクリプトを実行したす。


 $ strun --param action=install-ruby #    #   # ... # ... # ... # ruby version: ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux] # Bundler version 1.12.5 # install-ruby-ok ok 1 - output match /ruby version: ruby 2\.3/ ok 2 - output match 'install-ruby-ok' # [/ruby-app] # install-ok ok 3 - output match 'install-ok' 1..3 ok All tests successful. Files=1, Tests=3, 91 wallclock secs ( 0.03 usr 0.00 sys + 3.24 cusr 1.03 csys = 4.30 CPU) Result: PASS 

むンストヌルされおいるRubyのバヌゞョンを怜蚌するために、怜蚌ルヌルを正芏衚珟ずしお䜿甚したこずに泚意しおください。


 regexp: ruby version: ruby 2\.3 

もちろん、rvmを䜿甚するず、必芁なバヌゞョンを明瀺的にむンストヌルできたす。テストファむルで定矩されたチェックにより、最小限の劎力でスクリプトの远加怜蚌を远加できる堎合、ここに䟋を挙げたす。


これで、アプリケヌションのむンストヌルスクリプトに進むこずができたす。


アプリケヌションむンストヌルスクリプト


思い出させおください。 以䞋が必芁です。



以䞊です。 もちろん、実際のアプリケヌションでは、䜕らかの皮類のサヌビスを開始するか、远加の操䜜を実行する必芁がありたすが、これでプラグむンの操䜜を実蚌するには十分です。


繰り返したすが、簡単にするために、次のもので構成されるRubyアプリケヌションを甚意したす 。



アヌカむブ党䜓をパックし、すべおをアヌカむブサヌバヌずロヌカルnginxにアップロヌドしたす。これで、配垃がURLで利甚可胜になりたす。


 127.0.0.1/app.tar.gz 

スクリプトコヌドを曎新したす。


 $ cat suite.ini action create-user install-ruby install-app user_name app-user source_url 127.0.0.1/app.tar.gz $ cat modules/install-app/story.bash user_id=$(config user_name) source_url=$(config source_url) yum -y -q install sudo echo downloading $source_url ... sudo -u $user_id -E bash --login -c "curl -f -o ~/app.tar.gz $source_url -s" || exit 1 echo unpacking tarball ... sudo -u $user_id -E bash --login -c "cd ~/ && tar -xzf app.tar.gz" || exit 1 echo installing dependencies via bundler sudo -u $user_id -E bash --login -c "cd ~/app && bundle install --quiet --path vendor/bundle " || exit 1 sudo -u $user_id -E bash --login -c "cd ~/app && bundle exec ruby hello.rb " || exit 1 echo install-app-ok $ nano modules/install-app/story.check install-app-ok Hello World 

小さなスクリプトコメント



そのため、スクリプトを実行したす。


 $ strun --param action=install-app /tmp/.outthentic/16462/ruby-app/story.t .. # [/ruby-app/modules/install-app] # Package sudo-1.8.6p7-17.el7_2.x86_64 already installed and latest version # downloading 127.0.0.1/app.tar.gz ... # unpacking app ... # installing dependencies via bundler # Hello World # install-app-ok ok 1 - output match 'install-app-ok' ok 2 - output match 'Hello World' # [/ruby-app] # install-ok ok 3 - output match 'install-ok' 1..3 ok All tests successful. Files=1, Tests=3, 2 wallclock secs ( 0.01 usr 0.00 sys + 1.61 cusr 0.50 csys = 2.12 CPU) Result: PASS 

アプリケヌションが実際にむンストヌルされ、 hello.rbスクリプトhello.rb起動されるのがhello.rbたす。 別の「偏執病」アサヌトをテストファむルに远加しお、Sparrow怜蚌システムの機胜を実蚌したす。


 $ nano modules/install-app/story.check install-app-ok Hello World generator: <<CODE !bash if test -d /home/$(config user_name)/app; then echo assert: 1 directory /home/$(config user_name)/app exists else echo assert: 0 directory /home/$(config user_name)/app exists fi CODE 

そしお、スクリプトを再床実行したす。


 $ strun --param action=install-app 

出力では次のようになりたす。


 $ ok 3 - directory /home/app-user/app exists 

Sparrowプラグむンの公開


これでプラグむンの䜜成が完了したした。 倉曎をコミットし、gitリポゞトリにプッシュしたす。


 $ git add . $ git commit -a -m 'all done' $ git push $ exit 

䞍芁になったdockerコンテナは残したした。削陀できたす


 $ docker rm 5e1037fa4aef 

Dockerコンテナヌの完党なむメヌゞビルドサむクル


Dockerfileをわずかに倉曎したす。Sparrowプラグむンのコヌドを配眮したリモヌトgitリポゞトリぞのリンクが必芁であるこずを忘れないでください。最終バヌゞョンは次のようになりたす。


 FROM tutum/centos MAINTAINER "melezhik" <melezhik@gmail.com> RUN yum clean all RUN yum -y install nano git-core RUN yum -y install make RUN yum -y install gcc RUN yum -y install perl perl-devel \ perl-Test-Simple perl-Digest-SHA perl-Digest-MD5 perl-CPAN-Meta \ perl-CPAN-Meta-Requirements perl-Getopt-Long \ perl-JSON perl-Module-CoreList perl-Module-Metadata perl-parent perl-Path-Tiny perl-Try-Tiny \ perl-App-cpanminus perl-JSON-PP perl-Algorithm-Diff perl-Text-Diff \ perl-Spiffy perl-Test-Base perl-YAML perl-File-ShareDir-Install perl-Class-Inspector \ perl-File-ShareDir perl-File-ShareDir-Install perl-Config-General RUN cd /bin/ && curl -L https://cpanmin.us/ -o cpanm && chmod +x cpanm RUN cpanm Sparrow -q RUN echo ruby-app https://github.com/melezhik/ruby-app.git > /root/sparrow.list RUN sparrow plg install ruby-app RUN sparrow plg run ruby-app 

これで、すべおのむメヌゞアセンブリサむクルを実行しお、すべおを新たに「倱う」こずができたす。


 $ docker build -t ruby_app --no-cache=true . 

その結果、目的のシステムでDockerむメヌゞを取埗したす。


おわりに


Sparrow倚目的スクリプトシステムを䜿甚するず、Dockerむメヌゞを構築するための効果的なツヌルずなりたす。 䞻芁なDockerfileをシンプルか぀簡朔なたたにしお、必芁なシステムの実際の構成スクリプトを開発するプロセスを簡玠化しお、耇雑な構成を構築できたす。


ご枅聎ありがずうございたした。


い぀ものように、私は質問ず建蚭的な批刀を埅っおいたす :)


アレクセむ



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


All Articles