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

In Puppet, how to use defined node variables in an if clause

在木偶中 class 我应该如何测试是否已在节点中设置变量? 我使用 VM 名称(如 server1)和用户可以访问该页面的域名(如 example.org)。 "example.org" 不会通过事实传达,所以我需要通过 class 参数传递它。我想出了这种方法来定义节点块中的变量,并在我的测试中使用它 class 进行设置。

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";
    }

但是现在我每次都会得到这样的错误:

Error: Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: Syntax error at 'domainname'

我应该怎么做?

错误消息是在向您解释 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 数据类型来声明 class 参数并检查它们。特别是,如果允许在不提供 $domainname 参数的情况下声明 class 测试,那么您可以像这样声明 class:

# 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" == "" {
    # ...
  }

  # ...
}