关于Puppet中undef变量与重赋值的技术疑问
Puppet变量相关问题解答
测试代码(第一行存在拼写错误:famil应为family)
$my_var = "${facts['os']['famil']}" notice("value of my_var ${my_var}") if $my_var != undef { notice("my_var evaluates to true") } else { notice("my_var evaluates to false") } notice("Type of my_var ${type(my_var)}") $my_var = 'Linux' notice("Finishing now")
运行输出
Notice: Scope(Class[main]): value of my_var Notice: Scope(Class[main]): my_var evaluates to true Notice: Scope(Class[main]): Type of my_var String Error: Evaluation Error: Cannot reassign variable '$my_var' (file: test.pp, line: 9, column: 9) on node govlupe1.std4.edge.vrsn.com
问题解答
明明$my_var无实际值,Puppet为何判定其类型为String?
因为你使用了双引号字符串插值语法"${facts['os']['famil']}",当插值的表达式(这里是不存在的facts['os']['famil'],值为undef)被包裹在双引号中时,Puppet会自动将undef转换为空字符串("")。空字符串属于String类型,所以$my_var的类型被判定为String。表达式$my_var != undef的结果为何为true?
如上述所说,$my_var实际是一个空字符串,而非undef。在Puppet中,空字符串是一个有效的String类型值,和undef是完全不同的两个值,因此$my_var != undef的比较结果为true。若$my_var的值为undef,Puppet为何报错不能对其重赋值?
Puppet遵循变量单赋值规则:一旦变量在某个作用域中被定义(不管它的值是undef、空字符串还是其他任何值),就不允许在同一作用域中再次赋值。你的代码第一行已经定义了$my_var,后续第9行的重新赋值操作违反了这个规则,因此触发报错——这个限制和变量当前的值无关,是Puppet的核心语法规则。
内容的提问来源于stack exchange,提问作者sshekhar1980
相关产品推荐
相关产品推荐

