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

时间:2018-09-12 10:52:15

标签: variables if-statement puppet facter

在人偶类中,应该如何测试是否在节点中设置了变量? 我使用一个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:服务器错误:“域名”处的语法错误

我该怎么办?

1 个答案:

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

  # ...
}