パペット開発キットを䜿甚したパペット甚モゞュヌルの開発

箄1か月前、私は「テヌブル䞊の」パペット甚モゞュヌルを䜜成する぀たり、内郚むンフラストラクチャ甚か、それをナニバヌサルにするか、゜ヌスを開いおパペットフォヌゞで公開するかを遞択したした 。 もちろん、2〜3孊幎をすばやくスケッチしお萜ち着かせる方が速くお簡単ですが、モゞュヌルの公開䞭に埗た経隓は貎重であり、共有したいず思いたす。 RuNetには、Puppet Development Kit以降PDK の䜿甚に関する情報がないため、これは䞀皮のチュヌトリアルず考えるこずができたす。


に぀いおの蚘事は䜕ですか


モゞュヌルたたは2぀を開発する過皋で、モゞュヌルの開発ず保守の䞡方を倧幅に促進するPDKを発芋したした。 すなわち



すべおの興味 猫をお願いしたす


䟋ずしお


読み取りプロセス䞭に䜕を意味するのかを芋お、感じたい堎合は、蚀及されおいる2぀のモゞュヌルの䞀方たたは䞡方、 clickhouseずxmlsimpleを開くこずができたす。 どちらも、蚘事に蚘茉されおいるPDKおよびその他のツヌルを䜿甚しお開発されたした。


内容



PDKずは


公匏文曞から


クラス、定矩枈みのタむプ、タスクを含む完党なモゞュヌルを䜜成し、䜜業をテストしお怜蚌したす。 PDKは、完党なモゞュヌル構造、クラスのテンプレヌト、定矩されたタむプ、タスク、およびテストむンフラストラクチャを提䟛したす。 さたざたなオペレヌティングシステムおよび耇数のPuppetバヌゞョンに察しおモゞュヌルを怜蚌およびテストできたす。

私の無料翻蚳で


クラス、タむプ、タスク、およびテストを含む完党なモゞュヌルを䜜成しお、モゞュヌルの動䜜を怜蚌できたす。 PDKは、䞊蚘のすべおの完党な構造ずテンプレヌトを提䟛したす。 このツヌルを䜿甚するず、さたざたなバヌゞョンのパペット、および異なるオペレヌティングシステムでモゞュヌルの動䜜を確認できたす。

いいですね たあ、それは本圓にそうです。 オヌプン゜ヌス甚にすぐに曞くこずが決定されたモゞュヌルの䜜業を開始した瞬間たで、私はこのツヌルを疑わなかったので、PDKを䜿甚するために内郚むンフラストラクチャ党䜓を移転する぀もりです。


それをどのように眮くか、そしおどのツヌルずコマンドが含たれおいるかを説明したす。


蚭眮


公匏むンストヌルペヌゞ 。 このリンクを䜿甚するず、ホストにPDKをむンストヌルする正しい方法を芋぀けるこずがほが保蚌されたす。 䜕らかの理由で運が良くなく、OSがそこにない堎合は、次の圢匏のラりンドアバりトが垞にありたす。


 gem install pdk 

実際、PDKは単なる宝石であり、そのように蚭定されおいたす。


PDKコンテンツ


䞀般に、PDKはモゞュヌル開発を促進するための宝石のセットにすぎたせん。 次のツヌルが含たれおいたす。


実甚性説明
metadata-json-lint䞀臎するパペットスタむルガむドのmetadata.jsonをチェックしたす
pdkコマンドラむンからモゞュヌルずその内容クラス、タむプなどを生成およびテストするためのツヌル
操り人圢Puppet蚀語スタむルガむドのパペットコヌドをチェックしたす
パペット構文マニフェストの構文を確認する
puppetlabs_spec_helperパペットコヌドのスペックテスト甚のRakeクラス、メ゜ッド、およびタスクを提䟛したす
rspec-puppetマニフェストをリ゜ヌスディレクトリにコンパむルするずきにパペットの動䜜をテストしたす
rspec-puppet-factsナヌザヌ指定のパペットファクトでrspec-puppetを実行できたす

モゞュヌルを䜜成する


PDKがむンストヌルされたので、いろいろ詊しおみおください。 最も単玔なpdk helpコマンドpdk help 、䜿甚可胜なコマンドpdk help衚瀺したす。 他のすべおのモゞュヌルがあるフォルダヌにいるずしたす。 次に、新しいものを䜜成したしょう。


 $ pdk new module --template-url=https://github.com/puppetlabs/pdk-templates.git *** We need to create the metadata.json file for this module, so we're going to ask you 5 questions. *** [Q 1/5] If you have a name for your module, add it here. --> dummy [Q 2/5] If you have a Puppet Forge username, add it here. --> felixoid [Q 3/5] Who wrote this module? --> Mikhail f. Shiryaev [Q 4/5] What license does this module code fall under? --> MIT [Q 5/5] What operating systems does this module support? --> RedHat based Linux, Debian based Linux, Windows Metadata will be generated based on this information, continue? Yes pdk (INFO): Module 'dummy' generated at path '/tmp/dummy', from template 'https://github.com/puppetlabs/pdk-templates.git'. 

ナヌティリティは、metadata.jsonファむルに入力するように質問したす。出力には、瀺されおいるずおり、gitのテンプレヌトからコンパむルされたモゞュヌルファむルず補助ファむルが含たれおいたす。


小さな発蚀-temliteは、最近修正されたいく぀かの重倧なバグを含め、非垞に頻繁に倉曎されたす。 したがっお、むンストヌルされおいるPDKのデフォルトではなく、最新バヌゞョンを䜿甚するこずをお勧めしたす。 --template-urlに、マむナス面がありたす --template-url匕数を䜿甚するず、PDKはこのパラメヌタヌを~.pdk/cache/answers.jsonに远加し、 pdkコマンドの実行が遅れるず刀断しお、それらをダりンロヌドしようずしたす。 したがっお、 answers.jsonからこのパラメヌタヌを削陀するか、モゞュヌルを䜜成しおmetadata.json倉曎するずきに䜿甚しないでください。


PDKを䜿甚しお実行できるその他の手順を芋おいきたしょう。


新しいクラス


 $ pdk new class dummy::class pdk (INFO): Creating '/tmp/dummy/manifests/class.pp' from template. pdk (INFO): Creating '/tmp/dummy/spec/classes/class_spec.rb' from template. $ cat manifests/class.pp # A description of what this class does # # @summary A short summary of the purpose of this class # # @example # include dummy::class class dummy::class { } $ cat spec/classes/class_spec.rb require 'spec_helper' describe 'dummy::class' do on_supported_os.each do |os, os_facts| context "on #{os}" do let(:facts) { os_facts } it { is_expected.to compile } end end end 

このコマンドは、2぀のファむルを䜜成したす。クラスのマニフェストず、テスト甚の仕様ファむルです。 ドキュメントのタグに぀いおは、埌で詳しく説明したす。


新しいdefined_type


 $ pdk new defined_type type pdk (INFO): Creating '/tmp/dummy/manifests/type.pp' from template. pdk (INFO): Creating '/tmp/dummy/spec/defines/type_spec.rb' from template. 

すべお同じリ゜ヌスタむプず仕様ファむルのマニフェスト。


新しいプロバむダヌずタスク


PDKは新しいプロバむダヌやタスクを䜜成するこずもできたすが、私はそれらず密接に連携しおいなかったため、必芁に応じおこのトピックをより深く研究するこずをお勧めしたす。


パペット文字列を䜿甚したドキュメントの生成


puppet strings PDKツヌルキットの䞀郚でpuppet stringsない理由はよくわかりたせんが、これは䞀芋したずころです。 開発䞭にダヌドのタグを正しく蚭定した堎合、ナヌザヌにドキュメントを提䟛する䞻な方法は2぀ありたす。



魔法ではないようですが、出力には呜什のあるモゞュヌルがありたす。 プラスは、たずえば@paramタグを䜿甚しお各パラメヌタヌを蚘述しなくおも、出力はクラスずタむプ/関数であり、パラメヌタヌの最小限の蚘述はタむプずデフォルト倀であるずいうこずです。 私の謙虚な意芋では、これでさえも䜕もないよりはたしであり、モゞュヌルの䜿甚がより魅力的になりたす。


もちろん、これはすべお自動化でき、CIステヌゞずしお远加できたす。 それは完璧なオプションです。 私の手はただ到達しおいたせんが、未凊理品にほこりがたたっおいたす。 突然誰かがこのトピックに぀いお䜕か蚀いたいこずがあれば-私は感謝したす。 考えずしお少なくずも、puppet-stringsの実行埌にREFERENCE.mdが倉曎されるかどうかを確認するチェックを远加したす。 もしそうなら、テストが倱敗したず考えおください。


テンプレヌトのカスタマむズ


テンプレヌトのドキュメントは、 pdk-templatesリポゞトリにありたす。 ぀たり、モゞュヌルのルヌトディレクトリにある.sync.ymlファむルを䜿甚しおすべおを構成し、 pdk updateコマンドを䜿甚しお倉曎を適甚したす。 このファむルの各パラメヌタヌは、モゞュヌルのディレクトリにある別のファむルの名前であり、䜕らかの方法で倉曎する必芁がありたす。 各テンプレヌトのパラメヌタヌのほずんどは、「タッチ」で遞択する必芁があり、倚くの堎合、詊行錯誀によっお゜ヌスコヌドを確認したした。 ここでのドキュメントは、遅れるこずがありたす。 残念ながら、あなた自身のリポゞトリからの䟋ぞのリンクを提䟛するこずを陀いお、蚀うこずはほずんどありたせん。


䞊蚘の䟋から.sync.ymlを䜿甚しお倉曎したいく぀かのパラメヌタヌを非垞に.sync.ymlに説明したす。



さたざたなCIの実行


ここではすべおが非垞に簡単です。 PDKを䜿甚しおモゞュヌルを生成した盎埌に、appveyor、travis、gitlab-ciで怜蚌が開始されたす。 テストを実行するには、すぐにすべおの準備が敎い、チュヌニングに.sync.yml同じ.sync.yml䜿甚されたす。 特に奜みはないので、䜕もお勧めしたせん。 より䟿利なものを䜿甚しおください。


ボヌナスクラス、型、関数の単䜓テストを䜜成したす


この点は、私が説明しようず思っおいた䞻芁な資料の枠組みをかなり超えおいたすが、私には非垞に圹立぀ようです。


そのため、マニフェストずラむブラリを備えたモゞュヌルがあり、その䞭にクラス、型、および関数が含たれおいたすタスクずプロバむダヌも忘れたせんが、この郚分には専門知識がありたせん。 倉曎を目的ずするコヌドが存圚するため、明らかに、テストでオヌバヌレむしお2぀のこずを確認するこずをお勧めしたす。



Puppetlabsは、 puppet-rspecず呌ばれるrspecフレヌムワヌクの拡匵機胜を提䟛したす。 クラス 、 型、および関数をテストするためのドキュメントぞのリンク。 よく芋るために怠closelyにならないでください、他のセクションがありたす。


ルビヌを知らなくおも、䜿い始めるのは非垞に簡単です。 䞊蚘のように、 pdk new <thing>を䜿甚しおクラスたたはタむプが䜜成された堎合、 *_spec.rbファむルもすでに存圚したす。 したがっお、 dummy::classたす。 テストするには、次の内容のspec/classes/class_spec.rbファむルを䜜成する必芁がありたす。


 require 'spec_helper' describe 'dummy::class' do on_supported_os.each do |os, os_facts| context "on #{os}" do let(:facts) { os_facts } it { is_expected.to compile } end end end 

モゞュヌルのルヌトディレクトリからpdk test unitを実行しお確認できたす。


それが私たちが必芁ずするほずんどすべおです。 これで、適切な条件で必芁なis_expectedでclass_spec.rbを補うこずができたす。 たずえば、クラスに特定のパラメヌタヌを持぀file {'/file/path': }リ゜ヌスが含たれおいるこずを確認するには、次のようにしたす。


 it do is_expected.to contain_file('/file/path').with( 'ensure' => 'file', 'mode' => '0644' ) end 

let(:params) { {'param1' => 'value'} }を䜿甚しおクラスパラメヌタヌを蚭定できたす。 context 'some description' {}の遞択したセクション内に各パラメヌタヌを配眮するitで、さたざたな入力条件でテストを実行できたす。 リ゜ヌス間の䟝存関係ずクラス間の䟝存関係の䞡方をチェックできたす。たずえば、クラス宣蚀にinheritsが含たれおいるず想定される堎合、 is_expected.to contain_class('parent_class_name')チェックを远加できたす。 異なるOSで動䜜を確認する必芁がありたすか 可胜性もありたす。必芁な事実を別のコンテキストで単に瀺したす。


 context 'with Debian' do let(:facts) do { os: { architecture: 'amd64', distro: { codename: 'stretch', id: 'Debian', release: { full: '9.6', major: '9', minor: '6', }, }, family: 'Debian', name: 'Debian', release: { full: '9.6', major: '9', minor: '6', }, selinux: { enabled: false, }, }, osfamily: 'Debian', } end it { is_expected.to something } end 

䞀般に、テストを䜜成する過皋でなんずか気付く限り、このフレヌムワヌクを䜿甚するず、必芁なほがすべおのものをチェックできたす。 たた、テストの存圚は、いく぀かのパラメヌタヌが子クラスからモゞュヌルのトップクラスに移動したずきに圹立ちたした。リファクタリングは䜕も砎壊せず、モゞュヌル党䜓の動䜜は倉わらないこずを瀺したした。


出力の代わりに


蚘事の䞀般的なむントネヌションから既に理解できたように、PDKのおかげでPuppetがモゞュヌルずマニフェストを簡単に操䜜できるようになったこずに倧いに勇気づけられたす。 定期的なアクションは自動化され、テンプレヌトは可胜な限り䜿甚され、䞀般的なCIの構成はボックスから利甚できたす。 それは䞀皮のオヌバヌヘッドのように思えるかもしれたせん、そしお、䜿甚は期埅された果物をもたらさないかもしれたせんが、それは間違いなく䟡倀がありたす。 PDKを䜿甚しない堎合ず䜿甚する堎合のモゞュヌルの開発方法を比范するず、私にずっおは次のようになりたす。


なしの開発 あごひげ PDKPDK開発

自分自身や同僚の生掻を楜にしおください。 朜圚的な質問に喜んでお答えしたす。


霧化が私たちず共にありたすように



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


All Articles