在人偶类中,应该如何测试是否在节点中设置了变量? 我使用一个VM名称(例如server1)和一个域名(例如example.org),使用户可以访问该页面。 “ example.org”不会通过事实来传达,因此我需要通过一个类参数来传递它。我想出了一种在节点块中定义变量并将其用于测试类的设置的方法。
node "VM1" {
class { 'test':
domainname => "example.org",
}
[...]
class test ($domainname) {
ini_setting {
'set_property':
ensure => present,
path => '/tmp/test.ini',
section => 'main',
setting => 'url',
value => "https://$domainname";
}
[...]
但是现在我要添加一个条件,如果未设置$domainname
,则应使用$hostname
事实。
ini_setting {
'set_property':
ensure => present,
path => '/tmp/test.ini',
section => 'main',
setting => 'url',
if $domainname !~ $hostname {
value => "https://$domainname";
} else {
value => "https://$hostname";
}
但是现在我每次都会收到这样的错误:
错误:无法从远程服务器检索目录:服务器上的错误500:服务器错误:“域名”处的语法错误
我该怎么办?
答案 0 :(得分:1)
该错误消息向您说明if
语句不能出现在资源声明内。但是,有a different conditional form, called a "selector" that can appear inside resource declarations。这是Puppet的?:
三元运算符的类似物,以多种语言显示。
从样式上讲,通常最好是使资源声明尽可能简单。为此,您可能应该在资源声明之外有条件地设置一个变量,然后在其内部使用它的值。使用您自己的条件,可能看起来像这样:
if $domainname !~ $hostname {
$url_value = "https://$domainname";
} else {
$url_value = "https://$hostname";
}
ini_setting {
'set_property':
ensure => present,
path => '/tmp/test.ini',
section => 'main',
setting => 'url',
value => $url_value;
}
不过,此外,我注意到,您在上面重复的特殊情况令人高度怀疑。在最近的Puppet(版本4及更高版本)中,您应该使用Puppet数据类型声明类参数并进行检查。特别是,如果允许在不提供$domainname
参数的情况下声明类测试,则可以这样声明该类:
# Using the Puppet v4+ type system
class test(
Optional[String] $domainname = undef
) {
# ...
,并会像这样测试是否为$domainname
提供了一个值:
if $domainname =~ Undef {
# ...
}
您不能在较早的Puppet中使用类型系统,但是在插值时,您可以依靠未定义变量将其扩展为空:
# Using the Puppet v3- behavior
class test(
$domainname = undef
) {
# ...
if "$domainname" == "" {
# ...
}
# ...
}