Puppet
PuppetDay 3

Puppet 4でハマらない!型の比較が厳密になった equality を知る

More than 3 years have passed since last update.

この記事は Puppet Advent Calendar 2015 の三日目の記事です。

昨日は @buty4649 さんの「puppetでカスタム関数を作る」でした。


Puppet 4 から型の比較が厳密化

Puppet 4 からは equality の型の比較が厳密になります。

Puppet 3 までは、 String と Integer の比較 '1' == 1 が true でしたが、4からは false となります。

# Puppet 3 と 4 で結果が逆になる

if 1 == '1' {
notice('equal')
} else {
notice('not equal')
}

さて、この変更がリスクとなりうる状況についてですが、Facter 3 で得られる値があげられます (Puppet 4 からは Facter 3 を使うようになりました)。

どういうことか、以下のサンプルマニフェストを用いて説明します:

if $::operatingsystem == 'CentOS' and $::operatingsystemmajrelease == 7 {

...
}

上記は一件、CentOS 7系 で true となる条件のように見えますが、 Facter 3 で得られる operatingsystemmajrelease は String 型です (ref)。

つまり '7' == 7 という比較になっていますので、Puppet 3 なら true、Puppet 4 なら false という結果になってしまいます。

Facter から得られる値の型については、 Core Facts からご確認ください。

Puppet 4 へのバージョンアップの際には、このような細かな違いが多々ありますのでご注意ください。


関連

equality に関するPuppet 3.8 と 4.1 のドキュメント。

4.1のドキュメントを見ると、こっそり一文が追加されています。


Values are only considered equal if they have the same data type. Notably, this means that 1 == "1" is false, and "true" == true is false.