Puppetの予約語 $name と $title

  • 2
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

この記事は Puppet Advent Calendar 2015 の十三日目の記事です。
すでに十四日になってしまいましたが、空きがあると悲しいので滑り込みます。とはいえ、ネタがないので、初心者向けの簡単な内容をお送りさせていただきます。

$name$title

Puppet の $name$title という予約語には、宣言された class や defined type の名前が入ります。 foo class を宣言すると、そのスコープでは $name = 'foo'$title = 'foo' になります。

Reserved Variable Names

  • $title is reserved for the title of a class or defined type.
  • $name is a synonym for $title.

つまり、以下のような Puppet manifests を実行すると、foo という文字列が notice に出力されます。

class foo {
  notice $name
}
include foo
$ puppet apply -e 'class foo { notice $name } include foo'
Notice: Scope(Class[Foo]): foo
Notice: Compiled catalog for local in environment production in 0.35 seconds
Notice: Applied catalog in 0.01 seconds

main とスコープ

ところで、クラスを宣言しない場合、 $name$title には何が入るのでしょうか。 notice $name とだけ実行して、中身を確認してみましょう。

$ puppet apply -e 'notice $name'
Notice: Scope(Class[main]): main
Notice: Compiled catalog for local in environment production in 0.43 seconds
Notice: Applied catalog in 0.01 seconds

結果を見ると、 $name = 'main' となっていることが分かります。実は、Puppetはクラスやリソースに含まれない領域を main クラスとして扱います。

Reserved Class Names

  • main — Puppet automatically creates a main class, which contains any resources not contained by any other class.

この "a main class, which contains any resources not contained by any other class" という表現なんですが、調べた限りでは「Top scope だが Node scope ではない領域」と考えるべきでしょうか。

puppet scope
Summary Diagram を元に作成

たとえば、以下の node スコープの中で $name の中身を見てみましょう。

node /local/ {
  notice $name
}
$ puppet apply -e 'node /local/ { notice $name }'
Notice: Scope(Node[__node_regexp__local]): __node_regexp__local
Notice: Compiled catalog for local in environment production in 0.33 seconds
Notice: Applied catalog in 0.01 seconds

$name には /local/ の正規表現の名前が入っていることが分かります。実装を追ったわけではありませんが、Node scope より内部においては、 $name$title には main 以外の名前が入っていると考えるべきでしょう。

予約語には値を代入できない

$name のようなの予約語をうっかりクラス変数として利用してしまうと、エラーになってしまいます。ただし、 include 等で呼び出さない限りはエラーとして現れないので注意しましょう。

class foo {
  $name = 'laurenipsum'
}
include foo
# => Error: Evaluation Error: Cannot reassign built in (or already assigned) variable '$name' at /tmp/foo.pp:2:9 on node local

Puppet を始めたばかりだと、つい $title$name という変数を使いたく成るかもしれませんが、エラーになってしまいますのでご注意ください。