在 Puppet 中,如何在 if 子句中使用定义的节点变量



在木偶类中,我应该如何测试节点中是否设置了变量? 我使用虚拟机名称(如 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" == "" {
# ...
}
# ...
}

相关内容

  • 没有找到相关文章

最新更新