約1か月前、私は「テーブル上の」パペット用モジュールを作成する(つまり、内部インフラストラクチャ用)か、それをユニバーサルにするか、ソースを開いてパペットフォージで公開するかを選択しました 。 もちろん、2〜3学年をすばやくスケッチして落ち着かせる方が速くて簡単ですが、モジュールの公開中に得た経験は貴重であり、共有したいと思います。 RuNetには、Puppet Development Kit(以降PDK )の使用に関する情報がないため、これは一種のチュートリアルと考えることができます。
についての記事は何ですか
モジュール(または2つ)を開発する過程で、モジュールの開発と保守の両方を大幅に促進するPDKを発見しました。 すなわち:
- 最終更新時に
metadata.json
自動的にフォーマットする - 以下を実行できるさまざまなCIシステムの構成生成:
- rubocop linterでルビーコードを確認する
- 単体テストの実行
- 特定の条件下-Puppet Forgeの作業コードの自動入力
- yardを使用したコメント内のタグベースのドキュメントの生成
-
[PDK]
のモジュール用のプレート[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つあります。
- HTML / Markdown / JSONとして生成し、コードの隣に置きます。 これは、
puppet string generate [--format FORMAT]
コマンドで行われます。このコマンドでは、フォーマットを省略したり、json
/puppet string generate [--format FORMAT]
設定したりできます。
- ドキュメントの標準として、
puppet strings generate --format markdown
によって生成されるリポジトリのルートにREFERENCE.md
ファイルを置くのが一般的です。
- ドキュメントの標準として、
- コードを使用してリポジトリに公開します(githubにある場合)github-pages。 これは非常に簡単で、3つのコマンドが必要です。
# Gemfile.lock, PDK rm -f Gemfile.lock # Gemfile bundle bundle install --path vendor/bundle # gh-pages rake-task bundle exec rake strings:gh_pages:update
魔法ではないようですが、出力には命令のあるモジュールがあります。 プラスは、たとえば@param
タグを使用して各パラメーターを記述しなくても、出力はクラスとタイプ/関数であり、パラメーターの最小限の記述はタイプとデフォルト値であるということです。 私の謙虚な意見では、これでさえも何もないよりはましであり、モジュールの使用がより魅力的になります。
もちろん、これはすべて自動化でき、CIステージとして追加できます。 それは完璧なオプションです。 私の手はまだ到達していませんが、未処理品にほこりがたまっています。 突然誰かがこのトピックについて何か言いたいことがあれば-私は感謝します。 考えとして:少なくとも、puppet-stringsの実行後にREFERENCE.mdが変更されるかどうかを確認するチェックを追加します。 もしそうなら、テストが失敗したと考えてください。
テンプレートのカスタマイズ
テンプレートのドキュメントは、 pdk-templatesリポジトリにあります。 つまり、モジュールのルートディレクトリにある.sync.yml
ファイルを使用してすべてを構成し、 pdk update
コマンドを使用して変更を適用します。 このファイルの各パラメーターは、モジュールのディレクトリにある別のファイルの名前であり、何らかの方法で変更する必要があります。 各テンプレートのパラメーターのほとんどは、「タッチ」で選択する必要があり、多くの場合、試行錯誤によってソースコードを確認しました。 ここでのドキュメントは、遅れることがあります。 残念ながら、あなた自身のリポジトリからの例へのリンクを提供することを除いて、言うことはほとんどありません。
上記の例から.sync.yml
を使用して変更したいくつかのパラメーターを非常に.sync.yml
に説明します。
-
Gemfile
:2つのGemfile
が異なるグループの依存関係として追加されました。開発グループのpdk。 依存関係グループのxml-simple。 テストを開始するときに、system_testsグループがインストールされていないため、依存関係を別のグループに追加します。 -
spec/spec_helper.rb
:モーキングメソッドが変更され、テストカバレッジの最小しきい値が追加されました。これを下回ると、テストは失敗したと見なされます。 -
.travis.yml
:このファイルは、コードベースを確認し、完成したモジュールをpuppet-forgeにロードするために使用されるため、長い間洗練されています。 変更点:
- puppet-forgeのモジュールに入力するためのユーザーおよび暗号化されたパスワード。 Travisを使用したpuppet-forgeのデプロイの詳細については、 こちらをご覧ください 。
- テストのシーケンスが作成され、テストが成功した場合にのみ後者を起動して展開しました。
- CIが文字「v」で始まるタグから起動される場合、モジュールをpuppet-forgeにデプロイするステージを追加しました。
-
Rakefile
:リンターにいくつかの例外を追加しました。
さまざまな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を使用しない場合と使用する場合のモジュールの開発方法を比較すると、私にとっては次のようになります。
なしの開発 | PDK開発 |
---|---|
自分自身や同僚の生活を楽にしてください。 潜在的な質問に喜んでお答えします。
霧化が私たちと共にありますように!