目前我正在尝试自动化Windows服务器服务中的启动模式。我试图使用puppetlabs注册表,但意识到该模块没有像我预期的那样工作。
基本上我有需要在每台服务器上更新的Windows服务列表,但在某些服务器上,服务可能不存在,但puppetlabs注册表只会创建新密钥,如果它不存在,这不是预期的行为。如果正确,它应该如下所述:
根据我所知,似乎检查服务密钥是否存在的唯一方法是使用自定义功能。所以我已经尝试使用win32 / registry编写一些自定义函数,但是由于不支持Win32API等错误而未成功。我能想到的另一种方法是使用reg命令行来检查密钥是否存在。这是木偶代码函数:
module Puppet::Parser::Functions
newfunction(:check_winservice_exist, :type => :rvalue) do |args|
service_name = args[0]
unless args.length > 0 then
raise Puppet::ParseError, ("check_winservice_exist(): wrong number of arguments (#{args.length}; must be > 0)")
end
command = "reg query HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\#{service_name} /f DisplayName"
result = system command
return result
#if result == true
# return result
#else
# return result
#end
end
end
当我在命令行中运行简化的ruby脚本时,它会工作并返回预期的值。但是当我使用上面的脚本作为木偶自定义函数时,它总是返回空白。
这是我第一次写木偶自定义功能,所以我不确定我在这里做错了什么。请告知是否有其他替代方案我可以用来解决问题或者可能会告诉我在功能脚本上做错了什么
答案 0 :(得分:0)
我设法通过使用Matt建议的自定义因子解决了这个问题。只是共享我使用的自定义facter脚本。它可能不完美,因为我仍然不太熟练使用红宝石。
require 'win32/registry'
Facter.add(:winservices) do
confine :kernel => "windows"
setcode do
keyname= 'SYSTEM\CurrentControlSet\Services'
access = Win32::Registry::KEY_ALL_ACCESS
arr = []
winservices_list = []
Win32::Registry::HKEY_LOCAL_MACHINE.open(keyname, access) do |reg|
service_lists = (reg.each_key { |key, wtime| arr.push key })
arr.each do |service|
service_key = "SYSTEM\\CurrentControlSet\\Services\\#{service}"
begin
Win32::Registry::HKEY_LOCAL_MACHINE.open(service_key, access) do |reg|
value = reg['Start']
winservices_list.push service
end
rescue
end
end
winservices_list
end
end
end
它只是简单地通过添加简单检查服务名称是否在数组中
if $service_name in $facts['winservices'] {
service { "${service_name}":
provider => 'windows',
enable => $start_real,
}
}