この記事は Pepabo Advent Calendar 2015の14日目の記事と Puppet Advent Calendar 2015の24日目の記事です。
ペパボアドベントカレンダーのネタを考えていたのですが、全く思いつかなかったのでこの記事を兼用とさせていただきます。。
ペパボでは、サーバの構成管理ツールとして主にpuppetを使用しています。 また、外部DSLと言えどpuppetの書きっぷりも人によってまちまちになってしまうので、独自のコーディング規約を取り決めています。
ただ、このコーディング規約を熟読しても漏れが出てきてしまいます。 そこで、これを自動でチェックし漏れを防ぐようにする方法を考えました
puppet-lint
さすがに1からツールを作るのは厳しいです。。 しかし、ググったらpuppet用のlintツールを発見しました。 それが、puppet-lintです。
このツールは、デフォルトで幾つかのチェックが行えるのはもちろん、プラグインに対応していて第3者がルールを追加することができます。 今回やろうとしていることはまさにうってつけのツールです。
プラグインの作り方
プラグインの作り方ですが、公式のドキュメントがものすごく詳しいのでそちらをご参照ください。 ここに書かれている通りにやっていけば迷わず作成できると思います。というか私はできました。
puppet-lint-pepabo-style
正直作りかけです。。意外とハマってしまい完成には至っていません。。 🙇🙇🙇 いまいまできているのは以下の3つです。
- 予約語となっているパラメータ引数はクオートしない
- 同一タイプリソースの間に空行
- include は1つずつ
残りの部分は冬休みの宿題とさせてください 🙇
使い方
以下の様なGemfileを用意して bundle install
します。
source 'https://rubygems.org' gem 'puppet-lint', '~> 1.0' gem 'puppet-lint-pepabo-style', :github => 'buty4649/puppet-lint-pepabo-style'
bundle install
したら実行します。
$ bundle exec puppet-lint foo.pp
実際に以下のような、 同一タイプリソースの間に空行
が守られていないマニフェストファイルをチェックしてみます。
$ cat test.pp file { '/foo/baa': source => 'puppet///foo/baa', mode => '0644', require => File['/foo']; '/aaa/bbb': content => template('aaa/bbb'), mode => '0755'; } $ bundle exec puppet-lint test.pp WARNING: blank lines not between the same resource on line 5
期待通りWARNINGとなりました。
まとめ
ペパボではpuppetの独自コーディング規約を取り決めています。 そのチェックを自動で行なうために、puppet-lintのプラグインを作りました。 同じようなやり方で、先日puppetアドベントカレンダーに投稿されていたpuppet4になったら絶対ハマるだろうという部分のチェックもできるかと思います*1
puppet-lint-pepabo-styleは今のところ未完成ですが、完成しだい別途発表したいと思います。
*1:例として上げているだけで作れと煽っているわけではない!!!