Windows配方中的厨师NOT_IF和ONLY_IF验证问题

时间:2014-08-20 13:43:31

标签: ruby powershell chef chef-recipe

我正在运行这个简单的食谱块来在IIS中创建一个Web应用程序

powershell_script "create_site_my_site" do
    code "New-webapppool -name 'My_Web_App'; New-Website -Name 'My_Web_App' -applicationpool 'My_Web_App' -Port '80' -IPAddress * -PhysicalPath 'c:\webs\My_Web_App'  "
    action :run
    not_if "get-website | where-object { $_.name -eq  'My_Web_App' }"
end

这里的问题是NOT_IF部分一直是True

PS C:\Users\carlos>
PS C:\Users\carlos> get-website | where-object { $_.name -eq 'asdfasdfasdf' }
PS C:\Users\carlos> echo $lastexitcode
1
PS C:\Users\carlos> get-website | where-object { $_.name -eq 'My_Web_App' }

Name        ID    State    Physical Path       Bindings
----        --    -----    -------------       --------
My_Web_App  6     Stopped  c:\webs\My_Web_App  http *:80:    
                                               https *:443:

PS C:\Users\carlos.camacho> echo $lastexitcode
1

现在,我的问题是如何在NOT_IF中返回True或False 取决于我的代码返回值??

3 个答案:

答案 0 :(得分:5)

powershell_script "create_site_my_site" do
    guard_interpreter :powershell_script
    code "New-webapppool -name 'My_Web_App'; New-Website -Name 'My_Web_App' -applicationpool 'My_Web_App' -Port '80' -IPAddress * -PhysicalPath 'c:\webs\My_Web_App'  "
    action :run
    not_if "get-website | where-object { $_.name -eq  'My_Web_App' }"
end

您需要指定guard_interpreter :powershell_script。注意CHEF-1943并确保guard_interpreter在警卫之前,并且不要将警卫放在一个区块内。

powershell_script documentation

关于Chef powershell提供商的一个很好的参考是this video

仅使用IIS cookbook是另一种选择。

答案 1 :(得分:2)

你应该利用windows cookbook中的powershell_out资源。

如果输出为空,您可以检查命令的错误。

在你的情况下,这应该做:

only_if powershell_out("get-website | where-object { $_.name -eq  'My_Web_App' }").stdout.empty?

答案 2 :(得分:1)

我认为这是因为您没有告诉not_if guard使用powershell_script插播工具。

这有用吗?

powershell_script "create_site_my_site" do
    code "New-webapppool -name 'My_Web_App'; New-Website -Name 'My_Web_App' -applicationpool 'My_Web_App' -Port '80' -IPAddress * -PhysicalPath 'c:\webs\My_Web_App'  "
    action :run
    not_if "$(get-website | where-object { $_.name -eq  'My_Web_App' }).count -gt 0"
    guard_interpreter :powershell_script
end