puppet函数exec windows命令行

时间:2017-03-18 17:48:13

标签: windows puppet puppet-enterprise

目前我正在尝试自动化Windows服务器服务中的启动模式。我试图使用puppetlabs注册表,但意识到该模块没有像我预期的那样工作。

基本上我有需要在每台服务器上更新的Windows服务列表,但在某些服务器上,服务可能不存在,但puppetlabs注册表只会创建新密钥,如果它不存在,这不是预期的行为。如果正确,它应该如下所述:

  1. 检查服务是否在服务器中
  2. 如果是,则更新manifest / hiera
  3. 中提到的启动模式
  4. 如果不存在,请不要做任何事情,立即跳到下一个服务
  5. 根据我所知,似乎检查服务密钥是否存在的唯一方法是使用自定义功能。所以我已经尝试使用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脚本时,它会工作并返回预期的值。但是当我使用上面的脚本作为木偶自定义函数时,它总是返回空白。

    这是我第一次写木偶自定义功能,所以我不确定我在这里做错了什么。请告知是否有其他替代方案我可以用来解决问题或者可能会告诉我在功能脚本上做错了什么

1 个答案:

答案 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,
    }
  }