创建虚拟目录 exec 应用每个代理 运行

create virtual directory exec applies every agent run

我正在尝试使用以下方法创建虚拟目录,因为我在使用 IIS 模块时遇到问题。每次代理运行时它都会创建虚拟目录,因此我的 unless 语句似乎有问题。有人可以给我指出正确的方向吗?

class directories {
  $directories = {
    'test_dir' => 'virt_dir_path'
  }

  $directories.each |$k, $v| {
    exec { $k:
      unless   => '$test = Get-WebVirtualDirectory -Site website -Name "${k}";
        if ($test -eq $false) {exit 1} else {exit 0}',
      command  => 'New-WebVirtualDirectory -Site website -Name ${k} -PhysicalPath ${v}',
      provider => powershell,
    }
  }
}

AFAICS 你有 2 个问题:

  • 您的条件在单引号字符串中,所以我希望 Puppet 不会扩展变量 ${k}
  • $test -eq $false 的计算结果应始终为 $false,因为 PowerShell 在执行比较操作时会进行一些 black mag^W^Wimplicit 类型转换。因此,您需要注意要比较的内容和顺序。

    示例:

    PS C:\> 'false' -eq $false
    True
    PS C:\> $false -eq 'false'
    False
    

    上面的例子根据操作数的顺序给出了不同的结果,因为第二个操作数被隐式转换为匹配第一个操作数的类型。在导致 'false' -eq 'false' 的第一种情况下,计算结果为 true,但在第二种情况下,您得到 $false -eq $true(显然计算结果为 false),因为 PowerShell 在布尔上下文中解释 non-empty strings as $true .

将您的代码更改为如下内容:

$directories.each |$k, $v| {
  exec { $k:
    command  => "New-WebVirtualDirectory -Site website -Name '${k}' -PhysicalPath '${v}'",
    unless   => "if (Get-WebVirtualDirectory -Site website -Name '${k}') {exit 0} else {exit 1}",
    provider => powershell,
  }
}

你也可以提出条件

exit (1 - [int][bool](Get-WebVirtualDirectory -Site website -Name '${k}'))

如果您更喜欢一些黑客价值更高的东西。