本連載では第一線のPerlハッカーが回替わりで執筆していきます。今回のハッカーはpapixこと福本貴之さんで、
本稿のサンプルコードは、
PerlでInfrastructure as Code!
Infrastructure as Codeという言葉はここ数年とても注目されています。読者のみなさんも一度は目にしたことがあるのではないでしょうか。
Infrastructure as Codeは、
今回は、
Perlを使う意味
PerlでInfrastructure as Codeを実現するメリットは、
Infrastructure as Codeを実現するツールはたくさん公開されていますが、
Infrastructure as Codeを実現するにあたっては、
とはいえ、
Daiku──Perl版make
PerlでInfrastructure as Codeを実現する場合、
Daikuとは
Daikuは、Daikufile
にまとめることができ、daiku
コマンドを利用して実行できます。
ここでは、
タスクの登録と実行
Daikuで実行したいタスクは、Daikufile
と呼ばれるファイルに記載していきます。例として、Hello, world!
という文字列を出力するhello
というタスクを実装してみましょう。この場合、Daikufile
は次のようになります。
task hello => sub {
print "Hello, world!\n";
};
task
の第1引数にあたる文字列hello
がタスク名です。そして、
定義したタスクは、Daikufile
が設置されたディレクトリでdaiku
コマンドにタスク名をパラメータとして与えることで実行できます。
$ daiku hello
[LOG] Building Task: hello
Hello, world!
namespaceによるタスクの階層化
たとえばapp
というオペレーション対象に、build
と、deploy
というタスクをDaikufile
に設定したい場合を考えます。タスク名としてそれぞれapp_
、app_
のように、namespace
を使ってタスクを階層化したほうが、Daikufile
を記述できるでしょう。
namespace
を利用すれば、app
というオペレーション対象に対するbuild
とdeploy
という名前のタスクは、
namespace app => sub {
task build => sub {
...
};
task deploy => sub {
...
};
};
namespace
を利用して定義したタスクは、daiku app:build
のように、namespace
で指定した名前空間とtask
で指定したタスク名を:で連結した文字列で呼び出せます。
また、namespace
はネストすることもできます。たとえばapp
が利用するデータベースのマイグレーションを実行するタスクであれば、
namespace app => sub {
namespace db => sub {
task migrate => sub {
...
};
};
};
この場合、daiku app:db:migrate
で呼び出せます。
複数のタスクをまとめて実行
Daikufile
ではtask
の第2引数に対して、
task app => ['app:build', 'app:deploy'];
namespace app => sub {
task build => sub {
...
};
task deploy => sub {
...
};
};
この場合はapp
のタスクを実行するだけで、app:build
とapp:deploy
の両方のタスクをまとめて実行できます。
引数付きのタスク
Daikufileで
設定するタスクは、
task hello => sub {
my ($task, $name) = @_;
print "Hello, ${name}!\n";
};
引数付きのタスクは、
$ daiku 'hello[daiku]'
[LOG] Building Task: hello
Hello, daiku!
タスクの説明の記載と確認
Daikufile
では次のように、task
の直前にdesc
を使うことでタスクの説明を記載できます。
namespace app => sub {
desc "appに対する環境構築";
task build => sub {
...
};
desc "appに対するデプロイ";
task deploy => sub {
...
};
};
desc
を利用して説明を記載したタスクは、daiku -T
コマンドで確認できます。
$ daiku -T
daiku app:build # appに対する環境構築
daiku app:deploy # appに対するデプロイ
処理の切り出しによるDaikufileの整理
Daikuを利用することで、Daikufile
という1つのファイルに集約できます。しかし、Daikufile
に記載すると、Daikufile
に大量のコードが記載され、MyApp::Task::Build
などに切り出し、Daikufile
はこれを呼び出すだけにとどめるとよいでしょう。
task build => sub {
require MyApp::Task::Build;
MyApp::Task::Build->run();
};
<続きの