2017-03-18 4 views
0

現在、私はWindowsサーバーサービスの起動モードを自動化しようとしています。私はpuppetlabsのレジストリを使用しようとしましたが、私は期待どおりにモジュールが動作していないことに気づいた。puppet functions exec windowsコマンドライン

基本的には、各サーバーで更新する必要のあるWindowsサービスの一覧がありますが、一部のサーバーではサービスが存在しない可能性がありますが、puppetlabsレジストリは期待された動作ではない場合にのみ新しいキーを作成します。右によって下に述べたように、それが動作するはずです:

    マニフェスト/ hiera
  1. の内側に言及していない場合はとしてそれは、その後、スタートモードを更新しない場合は、サービスがサーバーやない
  2. であるかどうかを
  3. チェック存在し、ただ何もしないし、すぐに次のサービスに、私は知っていたから基づい

をスキップし、サービスキーが存在するかどうかをチェックしたりしないようにする唯一の方法は、カスタム関数を使用しているようです。だから私はすでにいくつかのWin32APIがサポートされていないなどのエラーを取得することによって成功しなかったwin32/registryを使用してカスタム関数を書こうとしました。私が考えることができる別の方法は、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

Mattが提案したカスタムファクタを使用してこの問題を解決できました。私が使用したカスタムファクタスクリプトを共有するだけです。私はまだルビーの使用に堪能ではないので、完璧ではないかもしれません。

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, 
    } 
    } 
関連する問題