在 exec 环境中设置的 puppet 变量无法在类的其他地方访问

在 exec 环境中设置的 puppet 变量无法在类的其他地方访问

我正在尝试配置一个日志配置,该配置基于检查日志文件是否存在的日志路径。但是,即使我知道 /var/log/hermes/hermes.log 不存在,if 语句也总是返回 true。我已经测试了 exec {"service_log_check" onlyif 是否正常工作,所以这与 if 语句有关。我曾考虑在每个 exec 中添加类似 environment => ["FOO=true" 的内容,然后将 if 语句更改为 if $FOO == true,但似乎 exec 环境中设置的变量只能在 exec 中访问,而不是整个类中。这让我抓狂了!!!我们使用的是 puppet v3.7

类hermes::fluentd($service_name ='hermes',$logs ='/var/log/test/test.log'){

exec {"service_log_check":
  command => '/bin/true',
  onlyif => '/usr/bin/test -e /var/log/hermes/hermes.log',
}

exec {"service_log_json_check":
  command => '/bin/true',
  onlyif => '/usr/bin/test -e /var/log/hermes/hermes-json.log',
}

exec {"request_log_check":
  command => '/bin/true',
  onlyif => '/usr/bin/test -e /var/log/hermes/request.log',
}

if service_log_check {
    $service_logs = "/var/log/${service_name}/${service_name}.log"
}
else { $service_logs = []
}

if service_log_json_check {
    $service_json_logs = "/var/log/${service_name}/${service_name}-json.log"
}
else { $service_json_logs = []
}

if request_log_check {
    $service_request_logs = "/var/log/${service_name}/request.log"
}
else
{ $service_request_logs = []
}

$logs_to_tail = [$logs, $service_logs, $service_json_logs, $service_request_logs]


file { "/etc/td-agent/config.d/${service_name}_service_logs.conf":
    ensure => present,
    content => template('service_logs.conf.erb'),
    owner  => td-agent,
    group  => td-agent,
    mode   => '0775'
}

}

答案1

不幸的是,Puppet 的工作方式并非如此。Exec 资源无法设置 Puppet 清单中其他代码可以引用的值。这里有一些概念需要您了解:

  1. Puppet 是“声明式”的,而不是“脚本”。你声明所需状态,然后 Puppet 负责让目标机器进入该状态。
  2. 清单(所需状态的声明)在应用之前进行编译;变量仅在执行 exec 之前进行评估

如果你需要从节点获取信息来决定你想要的状态(即在 .conf 文件中放入什么值),你需要编写一个自定义事实(参见https://docs.puppet.com/facter/3.7/custom_facts.html

相关内容