访问类中的节点变量并在条件中使用它

访问类中的节点变量并在条件中使用它

我正在尝试使用 Puppet 配置 Apache 虚拟主机,并且尝试了不同的方法,但收效甚微。

我已经定义一个节点如下:

node 'test1.cob' inherits serveurClient {
        $smcvhost = 'all'
}

serveurClient 类包含 apache 类。当 Apache 安装完毕,除虚拟主机外,所有配置均正确应用时,此方法可正常工作。

与虚拟主机相关的配置如下:

class apache::config {
    File{
        require => Class["apache::install"],
        notify  => Class["apache::service"],
        ensure  => present,
        owner   => "www-data",
        group   => "www-data",
        mode    => 755
    }
    ...
    if ( $smcvhost == 'belleville' ) or ( $smcvhost == 'all' ) {
        apache::smcvhost{'belleville':
            client => 'belleville',
        }
    }
    ...
}

Apache :: smcvhost定义可以正常工作,因为如果我直接在节点中指定它而不指定条件,虚拟主机就会正确创建,不会出现任何错误。如果我删除 if 语句,它也会被正确创建。我尝试过只指定第二个条件,但没有成功。

当执行失败时,我没有收到任何错误。puppet 报告只是忽略了此配置部分。

我认为这是一种变量范围问题,但从我所读的内容来看,这种做法似乎是正确的,我想如果我试图评估一个不存在的变量,puppet 会给我一些错误。

答案1

Puppet 不会对未设置的变量发出警告(奇怪的是,模板除外),并且,当你设置一个变量时,只有指定的内容受影响。因此:

node 'test1.cob' inherits serveurClient {
        # Nothing above this line knows $smcvhost
        $smcvhost = 'all'
        # Stuff from this line until "}" knows $smcvhost
}
        # Stuff from this point on don't know $smcvhost

如果你看一下 Puppet 最新版本的发行说明,你会发现动态作用域即将被淘汰。我的建议是尽可能避免使用变量传递信息——使用参数,例如在定义或带有参数的类中。

答案2

代替:

节点 'test1.cob' 继承 serveurClient { $smcvhost = 'all' }

如果你这样做:

节点'test1.cob' { $smcvhost ='all' 包括serveurClient }

那么你的变量将存在于 serveurClient 范围内,我假设你的 apache 类被引用在这里。

相关内容