2017-03-18 8 views
0

현재 Windows 서버 서비스의 시작 모드를 자동화하려고합니다. puppetlabs 레지스트리를 사용하려고했지만 예상대로 모듈이 작동하지 않는다는 것을 깨달았습니다.인형 기능 exec 창 명령 줄

기본적으로 각 서버에서 업데이트해야하는 Windows 서비스 목록이 있지만 일부 서버에서는 서비스가 존재하지 않을 수 있지만 puppetlabs 레지스트리는 예상 된 동작이 아닌 경우 새 키를 만듭니다.

  1. 확인 서비스가 서버에 있거나 만약 그렇다면 매니페스트/hiera
  2. 그렇지 않을 경우 내부에 언급 한 바와 같이하지
  3. 는 다음 시작 모드를 업데이트할지 여부 : 아래에 언급 한 바와 같이 우측으로 그것을 작동합니다 아무것도하지 않고 바로 다음 서비스로 건너 뜁니다.

내가 아는 바에 따르면, 서비스 키의 존재 여부를 확인하는 유일한 방법은 사용자 지정 기능을 사용하는 것입니다. 그래서 나는 이미 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 

명령 줄에서 단순화 된 루비 스크립트를 실행하면 예상 한 값이 작동하고 반환됩니다. 하지만 꼭두각시 커스텀 함수로 위의 스크립트를 사용하면 항상 빈 상태로 돌아갑니다.

이것은 처음으로 꼭두각시 사용자 지정 함수를 작성한 것이므로 여기에서 내가 잘못했는지 확신 할 수 없습니다. 문제를 해결하는 데 사용할 수있는 또 다른 대안이 있는지 조언하거나 기능 스크립트에서 내가 잘못한 것을 조언하십시오.

+0

를 서비스 이름은 배열에 있는지 여부를 확인 여부를 추가하여 바로 작동한다 : 그들은 마스터에서 실행됩니다. 대신 사용자 정의 사실을 수행해야합니다. –

+0

의견에 감사드립니다. 사용자 정의 사실을 사용하는 것보다 다른 방법이 있습니까? 보안 강화 목적을 확인하기 위해 수백 가지 이상의 서비스가 있으므로 맞춤 매개 변수에 해당 서비스 목록을 작성하는 것은 약간 번거로운 일입니다. – AlamHo

+0

배열의 모든 서비스를 모으는 팩트를 만들면됩니다. 그렇게 쉬울 것입니다. –

답변

0

매트가 제안한 맞춤형 요인을 사용하여이 문제를 해결할 수있었습니다. 내가 사용한 커스텀 팩터 스크립트 만 공유하면됩니다. 내가 아직 루비 사용에 능숙하지 않아 완벽하지 않을 수도 있습니다.

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