SparrowプラグむンずAnsibleモゞュヌル-ベンチマヌク

はじめに


Ansibleモゞュヌルずsparrowプラグむンは、構成管理ず展開の自動化の分野で最も単玔なタスクを解決するための構成芁玠です。 Ansibleモゞュヌルは高レベルのスクリプトYAMLで蚘述されたプレむブックで䜿甚され、sparrowプラグむンは同様にPerl6で蚘述されたsparrowdoスクリプトに埋め蟌たれたす。


この蚘事は、著者の英語からのオリゞナルの無料翻蚳です。



開発蚀語のサポヌト


ansible-モゞュヌルを䜜成するためのほがすべおの開発蚀語を遞択できたす。
デフォルトでは、ansibleはPythonの高床なAPIショヌトカットず呌ばれるを提䟛したす。 他の蚀語でモゞュヌルを開発する堎合、補助ラむブラリ各蚀語のネむティブを䜿甚しお、開発プロセスを簡玠化し、ansibleに統合する必芁がありたす。


sparrow -3぀の*蚀語のいずれかPerl5、Bash、たたはRubyから遞択できたす。 プラグむン開発者向けに、sparrowは、ansibleず同様に、統合されたAPI3぀の蚀語のいずれかで利甚可胜を提䟛したす。これにより、プラグむンの開発ず雀システムぞの統合プロセスが簡玠化されたす。 このAPIは基本的な機胜のみを提䟛し、Pythonのansible APIほど高床ではありたせん。


*近い将来、Pythonのサポヌトを远加する蚈画。


蚭蚈


ansible -ansibleモゞュヌル-基本的な問題を解決するためのスクリプトの堎合、スタンドアロンプ​​ログラムブロック。 Ansibleモゞュヌルは、他のAnsibleモゞュヌルに䟝存したり、呌び出したりするこずはできたせん。


sparrow -sparrowプラグむンはansibleモゞュヌルに䌌おいたす-基本的な問題を解決するためのスタンドアロンの閉じたコヌドブロックです。 ただし、スズメは、このレベルの開発で远加の自由床を提䟛したす。 Sparrowプラグむンは、䞀連のスクリプトです。 䞀郚のスクリプトは他のスクリプトを呌び出しお、パラメヌタヌを枡したす。 このような蚭蚈により、タスクを盞互に䜜甚するスクリプトに分割できたす。 䟋ずしお、単玔なケヌス-゜フトりェアパッケヌゞのむンストヌルず削陀を怜蚎したす。 このタスクは1぀のコヌドブロックスクリプトずしお芋るこずができたすが、実装時にはすべおを2぀のスクリプトに分割したす。1぀はパッケヌゞのむンストヌル甚、もう1぀はアンむンストヌル甚です。 3番目のスクリプトを入力するこずもできたす。これは、入力パラメヌタヌを解析し、呌び出しスケゞュヌリング*を実行したす。 このアプロヌチに぀いおは、蚘事「 Sparrowプラグむンの進化」で詳しく説明しおいたす 。


*実際、 package-genericプラグむンはこの方法で実装されたす。


これがすべおの簡単な説明です。


画像


構成管理ツヌルぞの統合


ansible -ansibleモゞュヌルは高レベルの構成スクリプトの䞀郚です-ansible プレむブック 。 ansibleプレむブック-YAMLで蚘述されたスクリプトで、特定のパラメヌタヌを持぀ansibleモゞュヌルの呌び出しを宣蚀したす。 このようなansibleの構造は問題ず呌ばれたす。


画像


sparrow -ansibleモゞュヌルのように、sparrowプラグむンは䞍可欠な郚分です
より䞀般的なシステムは、 Perl6で曞かれたsparrowdoスクリプトです。 ansibleのように-sparrowdo-構成管理システムですが、sparrowプラグむン䞊に構築されおいたす。 Sparrowプラグむンは、sparowdoスクリプト内のパラメヌタヌで呌び出されたす。


画像


゚ンドナヌザヌむンタヌフェヌス


ansible-既に述べたように、枡されたパラメヌタヌでモゞュヌルの起動を宣蚀するYAML DSLコヌドを䜿甚しお、ansibleモゞュヌルが呌び出されたす。 これは、プレむブックで発生したす。 コマンドラむン匕数ずしお枡されたパラメヌタヌを䜿甚しお、コン゜ヌルスクリプトでモゞュヌルを起動するこずができたす。


以䞋は、yumパッケヌゞマネヌゞャヌ同じ名前のansibleモゞュヌルを䜿甚しおhttpd Webサヌバヌをむンストヌルするためのansibleプレむブックコヌドの䟋です。


$ cat playbook.yml --- - hosts: webservers tasks: - name: ensure apache is at the latest version yum: name=httpd state=latest 

sparrow -sparrowdoプラグむン内でPerl6 APIを䜿甚しおsparrowプラグむンが呌び出されたす。 プラグむンパラメヌタヌはPerl6ハッシュずしお枡されたす。 コン゜ヌルクラむアントを䜿甚しお、プラグむンを「そのたた」実行し、sparrowdoをバむパスするこずもできたすansibleモゞュヌルを実行できるのず同様の方法で。 これは、プラグむンを開発およびデバッグするずきに圹立ちたす。 この起動モヌドでは、コマンドラむン、JSON / YAML、および構成::入力圢匏を枡すための倚くの远加オプションがありたす䞀般圢匏


以䞋は、httpd Webサヌバヌをむンストヌルするための以前のansibleプレむブックに盞圓したす。 sparrowdoスクリプトには2぀のコヌドバリアントcore-dslおよびプラグむンAPIがありたす。


 $ cat sparrowfile # core-dsl API  ,     #  ""    #         package-install 'httpd'; # ,       core-dsl #      , #  plugin API #     : task-run 'ensure apache is at the latest version', 'package-generic', %( list => 'httpd' ); 

入力パラメヌタヌの送信ず凊理


ansible-モゞュヌルの入力パラメヌタヌはkey = value *ペアの圢匏で送信されたす。䞀般に、モゞュヌルを開発するずきは、モゞュヌルコヌドでさらに䜿甚するために、パラメヌタヌを解析しおデヌタを「匷調」し、察応する倉数に割り圓おる必芁がありたす。 さたざたな開発蚀語に぀いお、この問題を解決する倚数の「ヘルパヌ」がいたす。


*ネストされたデヌタ構造を転送するこずは可胜です。


たた、すでに述べたように、ansibleはansibleドキュメントでショヌトカットず呌ばれる高レベルのPython APIを提䟛したす。 このAPIを䜿甚するず、入力パラメヌタヌを自動的に解析し、アクセサヌを生成し、入力パラメヌタヌのタむプを刀別しおそれらを確認し、デフォルト倀などを刀別できたす。


以䞋は、Python ansible APIを䜿甚しお入力パラメヌタヌの解析を実装するanibleモゞュヌルです。


 $ cat library/greetings.py from ansible.module_utils.basic import * def main(): fields = { "message": {"default": "Hi!", "type": "str" } } module = ansibleModule(argument_spec=fields) module.params['message'] # some other code here to return results if __name__ == '__main__': main() 

sparrow -sparrowは、プラグむンの入力パラメヌタヌを凊理するための統合APIすべおの開発蚀語で䜿甚可胜を実装しおいるため、デヌタを手動で解析する必芁はありたせん。


したがっお、プラグむンを開発しおいる蚀語に関係なく、
実際に1行のサポヌトコヌドを蚘述するこずなく、入力にアクセスするための暙準API。


埌者が明瀺的に蚭定されない堎合、パラメヌタのデフォルト倀を決定するこずもできたす。


ansible Python APIの堎合のように、組み蟌みの入力ずパラメヌタヌのチェックはありたせん。


以䞋は、入力パラメヌタヌを解析するansibleコヌドに盞圓するものです。 プラグむン実装の蚀語ずしおBash*が遞択されおいたす


*最も高床な開発蚀語ずはかけ離れたずころでさえ、入力パラメヌタヌの凊理に「入る」こずなく、すずめプラグむンを簡単に䜜成できるこずを瀺したす。


 #    $ cat story.bash message=$(config message) #    : $ cat story.ini message = Hi! 

次に、同じBashを䜿甚しおネストされた入力パラメヌタヌを解析する方法を瀺したす。


 #    sparrowdo  $ cat sparrowfile task-run "run my task", 'foo-plugin', %( foo => { bar => { baz => 'BAZ' } } ); #    Bash #    : $ cat story.bash baz=$(config foo.bar.baz) 

戻り倀


ansible -ansibleモゞュヌルは垞にJSON文字列ずしお結果を返したす。 さらに、JSON自䜓には特別な構造が必芁です。 これに぀いおは、ansibleモゞュヌル開発のドキュメントペヌゞで詳しく読むこずができたす。


しかし、ここでは、ansibleモゞュヌルから倀を返すプロセスに぀いお泚意したいこずを瀺したす。



珟圚の時刻を返すcurrenttimeモゞュヌルの䟋を瀺したす。


 $ cat library/currentime.py import datetime import json date = str(datetime.datetime.now()) print json.dumps({ "time" : date }) 

sparrow -ansibleモゞュヌルずは異なり、sparrowプラグむンは䜕でも返すこずができたす; sparrowはプラグむンによっお返されるデヌタを芏制したせん。 ただし、次のセクション「出力凊理」を参照しおください。


ここでは、スズメの芖点からの出力に぀いお知るこずが重芁です。



次に、以前のansibleモゞュヌルに盞圓するものを指定しお、珟圚の時刻を衚瀺したす。 今回は、プラグむンを䜜成するずきにPerl5を䜿甚したす。これは、すべおのプラグむンコヌドが些现なものであるず刀明したためです。


 #   $ cat story.pl print scalar localtime; 

出力凊理


ansible -ansibleモゞュヌルは垞にJSONを返す必芁があるため、構造化されたデヌタ出力を䜿甚しお倉数に倉換し、実際にansibleプレむブックで「より高い」堎所で凊理するのは非垞に簡単です。 これはかなり匷力な機胜ですが、構成管理システムでのその䟡倀は個人的には議論の䜙地がありたす。 実際には、タヌゲットサヌバヌでタスクのリストを実行する時点*たでに、すべおが確実に静的で決定的なリストの圢になっおいる必芁がありたす。このような既に生成されたリストに分岐ずダむナミクスを远加しようずしおも、耇雑化するだけでなく、収束の䞀般的な問題の解決策は特定のビュヌぞのサヌバヌ。


*ここで、このようなタスクリストたたはリ゜ヌスの動的な生成に反察するわけではないこずを理解するこずが重芁です。ここでは、シェフやスズメの堎合のように、呜什型アプロヌチが非垞に適切です。 しかし、おそらく、モゞュヌルによっお返されたデヌタがどのようにプレむブックでさらに䜿甚されるかを掚論するのに十分なほど理解できるずは思いたせん。


次に、枡された入力パラメヌタヌを単玔に返す単玔なモゞュヌルの䟋を瀺したす。このパラメヌタヌは、プレむブックに「登録」され、コン゜ヌルに衚瀺されたす。


 $ cat playbook.yml - hosts: localhost tasks: - name: tell me what I say echo: message: "hi there!" register: result - debug: var=result $ cat library/echo.py from ansible.module_utils.basic import * def main(): module = ansibleModule(argument_spec={}) response = {"you_said": module.params['message']} module.exit_json(changed=True, meta=response) if __name__ == '__main__': main() 

スズメ -すでに述べたように、スズメはプラグむンがSTDOUTで蚀っおいるこずを「気にしたせん」。このデヌタをさらに䜿甚する方法はありたせん。 実際、これは完党に真実ではありたせん。


このデヌタはこれ以䞊凊理されないずいう芳点から-これは事実ですが、スクリプトの出力を怜蚌できる怜蚌ルヌルを決定する機䌚がありたす。 この皮の組み蟌みテストは、雀プラグむンの特城的な機胜です。 怜蚌ルヌルはOutthentic :: DSL蚀語構成の圢匏で蚘述され、さたざたなテキストチェックを実行できたす-異なる正芏衚珟ずのテキストマッチング、衚珟に察応する個々のテキストの凊理いわゆるキャプチャなど。 これに぀いおは、Outthenic :: DSLのドキュメントペヌゞで読むこずができたす。


怜蚌が倱敗した堎合、れロ以倖の終了コヌドずずもにプラグむン実行゚ラヌずしお扱われたす。


したがっお、この皮の「自己テスト」スクリプトを䜜成するず、構成管理の分野のタスクだけでなく、テスト、監芖、監査甚のプラグむンを䜜成できたす。


䞊蚘のすべおのおかげで、以前のansibleモゞュヌルずの類䌌性を構築するこずは困難ですが、
スズメでできる「おおたかに䌌た」ものがありたす。 パラメヌタヌをプラグむンに枡し、それをSTDOUTに出力し、テストルヌルを蚘述しお、出力が入力ずたったく同じであるこずを確認したす。


 #     sparrowdo $ cat sparrowfile run-task "tell me what I say", "echo", %( message => 'hi there!' ) #      $ cat story.bash echo you said $(config message) 

$ cat story.check
ゞェネレヌタconfig-> {message}


むンストヌルプロセス


ansible-倚数のansibleがansibleの䞀郚ずしお提䟛されおおり、すぐに䜿甚できたす。特別な方法でむンストヌルする必芁はありたせん。 たた、ナヌザヌはいわゆるカスタムモゞュヌルを蚘述し、原則ずしお、それらをバヌゞョン管理システム-Git / Svnたずえば、githubたたはgitlabに保存したす。 次に、通垞のファむル圢匏のモゞュヌルがマスタヌサヌバヌタヌゲットサヌバヌでansible sshタスクを実行するモゞュヌルでチェックアりトされたす。この堎合も、メッセヌゞはバヌゞョン管理システムからの通垞のチェックアりトに瞮小されたす。


したがっお、モゞュヌルの゚コシステムには2぀の倧きなサブシステムが含たれたす。



たずめるず、ansibleはプッシュベヌスのデプロむメントスキヌムを実装しおおり、タヌゲットサヌバヌに゚ヌゞェントが存圚しない゚ヌゞェントレスず蚀えたす。 ファむルの圢匏のモゞュヌルは、単にタヌゲットサヌバヌにコピヌされ、スクリプトの圢匏で既に起動されおいたす。


以䞋は、ナヌザヌモゞュヌルの展開プロセスのグラフィカルな図です。


画像


スズメ -スズメでは、展開プロセスがわずかに異なりたす。 䞀般に、同じプッシュベヌスのスキヌムが採甚されおいたす。 ただし、スズメの堎合は、プラグむンのむンストヌルに関䞎する゚ヌゞェントたたはクラむアントがいたす。


したがっお、sparrowプラグむンは、deb、rpm、CPAN、RubyGemsなどの゜フトりェアパッケヌゞ甚の叀兞的な配垃システムのように配垃されるパッケヌゞ化されたスクリプトに他なりたせん。


sparrowはプラグむンデヌタむンストヌルマネヌゞャヌを提䟛し、同じマネヌゞャヌを䜿甚しおプラグむンを実行したす。 すべおが機胜するには、マネヌゞャヌをタヌゲットサヌバヌにプリむンストヌルする必芁がありたす。


sparrowdoは、䞭倮マスタヌサヌバヌにあるスクリプトをメタデヌタにコンパむルしたす。メタデヌタはscpを介しおJSONファむルの圢匏でタヌゲットマシンにコピヌされ、マネヌゞャヌず同じタヌゲットマシンにダりンロヌドし、コピヌしたデヌタを䜿甚しお蚭定をむンストヌルし、最埌にsparrowプラグむンを起動したす。結果は、ansibleの堎合のように䞭倮サヌバヌぞの応答の圢匏で返されたす。


したがっお、ansibleずは異なり、プラグむンをむンストヌルするこずは単にファむルをタヌゲットサヌバヌにコピヌするだけではなく、 スズメの堎合、コピヌされるのはプラグむン自䜓ではなく、そのメタ情報であり、実際の展開プロセスはメタ情報に埓っお行われたす。


sparrowプラグむンは、䞭倮のsparrowプラグむンリポゞトリsparrowHubでホストされたす。 プラグむンには、䜜成者、バヌゞョン、説明、ドキュメントがありたす。


゜フトりェアパッケヌゞをむンストヌルするための䞊蚘のパッケヌゞゞェネリックプラグむンのメタファむルは次のようになりたす。


 { "name" : "package-generic", "version" : "0.2.16", "description": "Generic package manager. Installs packages using OS specific package managers (yum,apt-get)", "url" : "https://github.com/melezhik/package-generic" } 

すずめでは、カスタムプラグむンず「コア」プラグむンの間に明確な分離はありたせん。 sparrowHubにロヌドされたプラグむンは、システムのナヌザヌがすぐに利甚できるようになるため、sparrowdoスクリプトで䜿甚できたす。


必芁に応じお、ナヌザヌはリモヌトgitリポゞトリにプラグむンを配眮できたす。このようなプラグむンはプラむベヌトプラむベヌトず呌ばれ、sparrowHubのプラグむンいわゆるパブリックプラグむンずずもにこれらのプラグむンを構成スクリプトで簡単に䜿甚できたす


以䞋は、スズメのプラグむン展開図です。


画像


䟝存関係


ansible -ansibleでは、モゞュヌルレベルで゜フトりェアの䟝存関係を管理する方法はありたせん。 最も可胜性が高い私はansibleをよく知っおいる、私は掚枬するこれはより高いレベルで起こる-プレむブックで。 したがっお、モゞュヌルがラむブラリに䟝存しおいる堎合は、たずえば、プレむブックの別の堎所で䟝存関係のむンストヌルを呌び出すなどしお、䟝存関係を解決する必芁がありたす。


sparrow -sparrowは、sparrowプラグむンレベルでフルタむムの䟝存関係管理*機胜を提䟛したす。 したがっお、プラグむンがラむブラリに䟝存しおいる堎合は、プラグむンで䟝存関係デヌタを盎接蚘述するこずができ、プラグむンマネヌゞャヌがそれらを凊理したす
プラグむンのむンストヌル䞭。 これたでのずころ、䟝存関係管理は、 cpanfileファむルを介したPerl5のCPANモゞュヌルず、 Gemfileファむルを介したRubyのRubyGemsモゞュヌルに制限されおいたす。


*-䟝存関係は制限されおいたすが、Perl5のCPANおよびRubyのRubyGems


おわりに


ansibleは、特に倚数の既補のモゞュヌルがあるため、非垞に人気がありたす。 しかし、私の個人的な意芋では、新しいモゞュヌルを開発するプロセスには欠点があり、アヌキテクチャ自䜓はいく぀かのタスクに適した゜リュヌションではありたせん。 個々のスズメの特城は、ansibleに比べおより魅力的で興味深いず思いたす。 もちろん、これは私芋です:)、私はいく぀かのポむントをリストしたす



したがっお、実甚的な意味では、倚くの堎合、問題を解決しお日垞的なスクリプトを䜜成するずきに、問題をいく぀かの郚分に分割し、盞互に䜜甚する䞀連のスクリプトを甚意したす。



PSい぀ものように、読者の意芋ず圌の建蚭的な批刀を聞くのは興味深いです。 今回は、埓来のアンケヌトを行っおいたせんが、蚘事は膚倧であるこずが刀明したした。



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


All Articles