本連載では第一線の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();
};<続きの