create virtual directory exec应用每个代理运行

时间:2017-09-18 19:12:38

标签: powershell puppet

我尝试使用下面的方法创建虚拟目录,因为我遇到了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,
    }
  }
}

1 个答案:

答案 0 :(得分:3)

AFAICS你有2个问题:

  • 您的情况属于单引号字符串,因此我希望Puppet不会展开变量${k}
  • $test -eq $false应始终评估为$false,因为PowerShell在执行比较操作时会执行一些黑色的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}'))

如果您喜欢具有更多黑客价值的东西。