首页 > 解决方案 > Puppet:如果安装了 Choco 包或存在本地用户,如何检查 IF 条件?

问题描述

Windows 服务器环境。我们有具有安装特定 Choco 包的 Puppet 角色的服务器。决定不应将软件包安装在新服务器上。最简单的方法就是从清单中删除 package 语句。问题是,包在安装过程中会创建一个本地用户,并且应该通过 Puppet 额外授予该用户在本地操作系统中的权限。

如果从未安装过该软件包,则该用户在操作系统中不存在,并且为其分配权限的语句将失败。但是,如果我们从角色中删除该权限分配,它也会在所有已安装该软件包的服务器上被删除,并且应用程序将失败。

如果当前安装了该软件包,有没有办法检查清单?类似于“如果 PACKAGE is_present {做某事}”。或者检查该用户是否存在?“如果用户存在{做某事}”我知道它可以通过自定义事实来解决,但它是一个复杂的应用程序,具有多个与其他应用程序相同的通用组件。我既无法识别典型文件也无法识别典型服务,而且错误的代价非常高(200 台服务器、关键任务、数千名用户......)。唯一可以确定的是 Choco 包名和用户名。

标签: packagepuppetchoco

解决方案


找到了解决方案。

事实上,这是一个特殊的用户“NT Authority\BrokerService”。此类用户始终对应于操作系统中的服务。所以我们可以检查的不是用户的存在,而是服务的存在。我们已经使用了一个自定义事实来构建服务器上所有服务的列表,所以实际上很容易:

if 'BrokerAgent' in $::sr_services {
    user_right_assignment { 'sesystemtimeprivilege for BrokerAgent':
        right => 'sesystemtimeprivilege',
        sid   => ['NT SERVICE\BrokerAgent'],
    }
}

当然,它可以用变量进一步参数化。

不过,关于检测 Choco 包装是否存在的问题仍然悬而未决。


推荐阅读