我在chef中使用powershell_script
资源在sqlserver 2012中创建数据库。
我在脚本中使用了硬编码的test1
数据库名称。现在我想从属性文件中提供数据库名称。
如何将属性文件中引用的值提供给脚本。
powershell_script "create database" do
code <<-EOH
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null
$serverName = "localhost"
$server = new-object ('Microsoft.SqlServer.Management.Smo.Server') $serverName
#Create a new database
$db = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Database -argumentlist $server, "test1"
$db.Create()
#Reference the database and display the date when it was created.
$db = $server.Databases["Test_SMO_Database"]
$db.CreateDate
EOH
end
答案 0 :(得分:2)
现在修改过的脚本看起来像这样
powershell_script "create database" do
code <<-EOH
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null
$serverName = "localhost"
$server = new-object ('Microsoft.SqlServer.Management.Smo.Server') $serverName
#Create a new database
$db = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Database -argumentlist $server, "#{node['sqlserver']['dbname']}"
$db.Create()
EOH
end
<强>属性/ default.rb 强>
default['sqlserver']['dbname'] = 'testing database'
现在我可以使用属性文件中的值创建数据库。
感谢您帮助 IsabelHM
答案 1 :(得分:1)
花了一点时间来确定将 数组 定义为节点属性的语法,然后将其成功传递给powershell_script。显然将其定义为字符串是有效的。
属性:
default['cookbook-name']['attribute-name'] = "'value1', 'value2', 'value3'"
和食谱:
powershell_script 'my script' do
code <<-EOH
$array = #{node['cookbook-name']['attribute-name']}
...
EOH
action :run
guard_interpreter :powershell_script
not_if "..."
end
答案 2 :(得分:0)
尝试使用属性环境传递变量(在此示例中为dbname
),然后在脚本中将其称为$dbname
设置属性有两种方法。
方法1
在attributes / default.rb中,添加此行
default['yourCookbookNameHere']['dbname'] = 'test1'
在recipes / default.rb
中powershell_script "create database" do
environment ({'dbname' => "#{node['yourCookbookNameHere']['dbname']}"})
code <<-EOH
$db = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Database -argumentlist $server, $dbname
EOH
end
方法2
在你的食谱中,将它设置为像这样的局部变量
localDbName = 'test1'
powershell_script "create database" do
environment ({'dbname' => localDbName})
code <<-EOH
$db = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Database -argumentlist $server, $dbname
EOH
end
答案 3 :(得分:0)
此处使用environment
powershell_script
属性的当前答案在如何引用代码块中的变量方面不正确。 environment
属性中指定的变量可用作环境变量,而不是脚本变量,必须作为环境变量引用,如下所示:
powershell_script 'Passed-In Variable Example' do
environment({ myVar: 'myvalue' })
code <<-EOH
Write-Output $env:myVar
EOH
end
基本上,使用environment
属性将值传递到代码块的任何其他答案都几乎正确,只需确保使用{{1}添加变量名称在Powershell代码中。