【问题标题】:how to use attributes values in powershell script如何在powershell脚本中使用属性值
【发布时间】:2018-05-31 04:52:48
【问题描述】:

我在这里使用 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

【问题讨论】:

    标签: powershell chef-infra chef-recipe powershell-4.0


    【解决方案1】:

    现在修改后的脚本是这样的

    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

    【讨论】:

      【解决方案2】:

      花了一点时间弄清楚将 array 定义为节点属性的语法,然后将其成功传递给 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
      

      【讨论】:

        【解决方案3】:

        尝试使用属性 environment 来传递变量(在本例中为:dbname),然后在脚本中将其调用为 $dbname

        有两种设置属性的方法。

        方法一

        在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
        

        方法二

        在您的配方中,将其设置为像这样的局部变量

        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
        

        【讨论】:

        • 如前所述修改了脚本,它能够获取属性文件中传递的值,但仍然失败并出现以下错误。编译资源: ------------------ # 声明在 c:/chef/cache/cookbooks/sqlserver/recipes/default.rb:1:in `from_file' powershell_script(" create database") 执行操作 "run" 重试 0 retry_delay 2 default_guard_interpreter :powershell_script 命令 "create database" backup 5 environment {"dbname"=>"testing database"} 返回 0
        • 错误是什么?你能在你的 default.rb 中发布属性吗?
        • default.rb 具有以下值,如果 node['platform_family'] == 'windows' default['cookbook']['dbname'] = 'testing database' end,请纠正我
        • @bbsys 你想从属性 default.rb 文件中获取参数还是从配方 default.rb 中的局部变量中获取参数?
        • 我希望它来自属性 default,rb
        【解决方案4】:

        这里使用powershell_scriptenvironment 属性的当前答案在它们如何引用代码块中的变量方面是不正确的。 environment 属性中指定的变量可用作环境变量,而不是脚本变量,并且必须作为环境变量引用,如下所示:

        powershell_script 'Passed-In Variable Example' do
          environment({ myVar: 'myvalue' })
          code <<-EOH
            Write-Output $env:myVar
          EOH
        end
        

        基本上,使用environment 属性将值传递到代码块的任何其他答案几乎是正确的,只需确保在 Powershell 中使用$env: 在变量名前添加代码。

        【讨论】:

          猜你喜欢
          • 2011-08-02
          • 2021-11-12
          • 2015-04-15
          • 1970-01-01
          • 1970-01-01
          • 2020-09-26
          • 1970-01-01
          • 2021-01-07
          • 1970-01-01
          相关资源
          最近更新 更多