27

社内アプリケーションを構成するために PowerShell Desired State Configuration スクリプトを機能させるのに苦労しています。問題の根本は、構成データを ScriptResource に渡すことができないように見えることです (少なくとも、私がやろうとしている方法では)。

私のスクリプトは、社内アプリケーションの構成フォルダーを作成し、いくつかの設定をファイルに書き込むことになっています。

configuration MyApp {
    param (
        [string[]] $ComputerName = $env:ComputerName
    )
    node $ComputerName {

        File ConfigurationFolder {
            Type = "Directory"
            DestinationPath = $Node.ConfigFolder
            Ensure = "Present"
        }

        Script ConfigurationFile {
            SetScript = {
                write-verbose "running ConfigurationFile.SetScript";
                write-verbose "folder = $($Node.ConfigFolder)";
                write-verbose "filename = $($Node.ConfigFile)";
                [System.IO.File]::WriteAllText($Node.ConfigFile, "enabled=" + $Node.Enabled);
            }
            TestScript = {
                write-verbose "running ConfigurationFile.TestScript";
                write-verbose "folder = $($Node.ConfigFolder)";
                write-verbose "filename = $($Node.ConfigFile)";
                return (Test-Path $Node.ConfigFile);
            }
            GetScript = { @{Configured = (Test-Path $Node.ConfigFile)} }         
            DependsOn = "[File]ConfigurationFolder"
        }

    }
}

参考までに、私の構成データは次のようになります。

$config = @{
    AllNodes = @(
        @{
            NodeName = "*"
            ConfigFolder = "C:\myapp\config"
            ConfigFile = "C:\myapp\config\config.txt"
        }
        @{
            NodeName = "ServerA"
            Enabled = "true"
        }
        @{
            NodeName = "ServerB"
            Enabled = "false"
        }
    )
}

そして、次のようにDSCを適用しています:

$mof = MyApp -ConfigurationData $config;
Start-DscConfiguration MyApp –Wait –Verbose;

この構成を適用すると、フォルダーは問題なく作成されますが、構成ファイルで何もできません。以下の出力を見ると、ConfigurationFile / TestScript のスコープ内で $Node 変数が null であるためであることは明らかですが、そのブロック内から参照する方法がわかりません。

LCM:  [ Start  Resource ]  [[Script]ConfigurationFile]
LCM:  [ Start  Test     ]  [[Script]ConfigurationFile]
                           [[Script]ConfigurationFile] running ConfigurationFile.TestScript
                           [[Script]ConfigurationFile] node is null = True
                           [[Script]ConfigurationFile] folder =
                           [[Script]ConfigurationFile] filename =
LCM:  [ End    Test     ]  [[Script]ConfigurationFile]  in 0.4850 seconds.

この特定の問題をオンラインで検索するのに 1 日を費やしましたが、変数、パラメーター、および構成データのすべての例はすべて、「ConfigurationFolder」で既に作業しているファイルおよびレジストリ リソースまたはその他の非スクリプト リソースを使用しています" 私のスクリプトでブロックします。私が立ち往生しているのは、「ConfigurationFile」のようなスクリプト リソース内から構成データを参照する方法です。

私は完全な空白を描いたので、どんな助けでも大歓迎です。他のすべてが失敗した場合、サーバーごとに個別の「構成」スクリプトを作成し、値をハードコーディングする必要があるかもしれませんが、これは可能な限りやりたくありません。

乾杯、

マイク

4

4 に答える 4

36

これを変更:$Node.ConfigFolder$using:Node.ConfigFolder.

呼び出された変数があり、$Fooそれをスクリプト DSC リソースに渡す場合は、次を使用します。$using:Foo

于 2015-01-08T19:27:14.783 に答える
8

この問題を解決する非常に洗練された方法は、通常の{0}プレースホルダーを使用することです。演算子を適用することで-f、プレースホルダーを実際の値に置き換えることができます。

この方法の唯一の欠点は、中かっこ { } をプレースホルダー以外 (ハッシュテーブルや for ループなど) に使用できないことです。これは、-f演算子が中かっこに整数を含める必要があるためです。

コードは次のようになります。

        SetScript = ({ 
            Set-ItemProperty "IIS:\AppPools\{0}" "managedRuntimeVersion" "v4.0"
            Set-ItemProperty "IIS:\AppPools\{0}" "managedPipelineMode" 1 # 0 = Integrated, 1 = Classic
        } -f @($ApplicationPoolName))

また、正しく行っているかどうかを確認する良い方法は、生成された .mof ファイルをテキスト エディターで表示することです。生成された TestScript / GetScript / SetScript メンバーを見ると、コード フラグメントが実際には文字列であることがわかります。$placeholder の値は既に置き換えられているはずです。

于 2014-11-26T18:34:01.557 に答える
7

ConfigurationData は、DSC エンジンがスクリプトを適用する実行時ではなく、MOF ファイルのコンパイル時にのみ存在します。スクリプト リソースの SetScript、GetScript、および TestScript 属性は、実際には文字列であり、スクリプト ブロックではありません。

これらのスクリプト文字列を生成することは可能ですが (ConfigurationData から必要なすべてのデータが既に展開されている状態で)、エスケープ、部分式、および引用符を正しく使用するように注意する必要があります。

この簡単な例を元の TechNet スレッド ( http://social.technet.microsoft.com/Forums/en-US/2eb97d67-f1fb-4857-8840-de9c4cb9cae0/dsc-configuration-data-for- ) に投稿しました。 script-resources?forum=winserverpowershell

于 2014-05-05T03:52:29.250 に答える