我正在尝试配置一个日志配置,该配置基于检查日志文件是否存在的日志路径。但是,即使我知道 /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 清单中其他代码可以引用的值。这里有一些概念需要您了解:
- Puppet 是“声明式”的,而不是“脚本”。你声明所需状态,然后 Puppet 负责让目标机器进入该状态。
- 清单(所需状态的声明)在应用之前进行编译;变量仅在执行 exec 之前进行评估
如果你需要从节点获取信息来决定你想要的状态(即在 .conf 文件中放入什么值),你需要编写一个自定义事实(参见https://docs.puppet.com/facter/3.7/custom_facts.html)