Puppet如何设置条件判断检测软件包是否安装并在未安装时跳过任务
问题原因
你当前代码的核心问题是find_file属于Puppet主控端的编译时函数,只会在Puppet服务器的本地文件系统查找指定路径,不会到目标Windows节点上检测文件是否存在,所以你写的$rapid7_service_exists判断逻辑完全失效,才会出现未安装Rapid7的节点也尝试配置ir_agent服务,触发报错。
解决方法
有两种常用方案可以实现你要的「未安装则跳过服务配置」的逻辑:
方案一:使用Puppet默认的services事实判断(无需额外配置)
Puppet默认的Facter会采集节点上所有已存在的服务列表,直接判断目标服务是否存在即可:
class profile::windows::rapid7 { $manage_rapid7 = lookup('manage_rapid7', Optional[Boolean], 'first', true) if $facts['kernel'] == 'Windows' and $manage_rapid7 { # 判断节点上是否存在ir_agent服务 if 'ir_agent' in keys($facts['services']) { service { 'ir_agent': ensure => 'running', enable => true, } } } }
方案二:自定义Facter检测程序文件存在
如果你需要严格绑定程序文件的存在状态判断,可以新增自定义Facter采集节点上的Rapid7安装状态:
- 在你的Puppet模块的
lib/facter/目录下新增rapid7_installed.rb文件:
Facter.add(:rapid7_installed) do confine kernel: 'Windows' setcode do File.exist?('C:\Program Files\Rapid7\Insight Agent\ir_agent.exe') end end
- 调整Puppet代码使用该自定义事实做判断:
class profile::windows::rapid7 { $manage_rapid7 = lookup('manage_rapid7', Optional[Boolean], 'first', true) if $facts['kernel'] == 'Windows' and $manage_rapid7 and $facts['rapid7_installed'] { service { 'ir_agent': ensure => 'running', enable => true, } } }
内容的提问来源于stack exchange,提问作者cz75ww
相关产品推荐
相关产品推荐

