在木偶类中,我应该如何测试节点中是否设置了变量? 我使用虚拟机名称(如 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:服务器错误:"域名"处出现语法错误
我应该怎么做?
错误消息向您解释if
语句不能出现在资源声明中。 但是,有一种不同的条件形式,称为"选择器",可以出现在资源声明中。 它是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" == "" {
# ...
}
# ...
}