安全地将参数传递给使用Puppet执行的Powershell脚本?

时间:2016-11-22 10:07:31

标签: powershell puppet

我们有一个Puppet模块,它定义了许多参数。在这种情况下,它们包含我们不想存储在木偶模块本身的用户名和密码。

有没有办法将这些参数传递给我们在模块目录中的powershell脚本?

我们现在所拥有的是:

class OurCompany::server($username, $password) {
  exec { 'Change Service Credentials':
    command   => template('OurCompany/OurTemplatedPowerShell.ps1'),
    provider  => powershell,
    logoutput => true,
    returns   => [0, 1]
  }

但是可以将参数附加到命令中吗?我们尝试过这样的事情:

class OurCompany::server($username, $password) {      
  exec { 'Change Service Credentials':
    command   => template('OurCompany/OurTemplatedPowerShell.ps1 -Username $username -Password $password'),
    provider  => powershell,
    logoutput => true,
    returns   => [0, 1]
  }

2 个答案:

答案 0 :(得分:1)

传递参数

您执行此操作的方式无效,因为模板仅接受文件的路径(与file()相同)。

如果您希望将参数传递给PowerShell文件,这里有一个更简单的选项。

您应该将PowerShell文件重命名为OurTemplatedPowerShell.ps1.erb(不是必需的,但它有助于更​​好地识别它)。然后在文件本身中,您应该在顶部附近添加以下内容:

$UsernameERB = '<%= @username %>'
$PasswordERB = '<%= @password %>'

if ($UsernameERB -ne $null -and $UsernameERB -ne '') {
  $Username = $UsernameERB
}

if ($PasswordERB -ne $null -and $PasswordERB -ne '') {
  $Password = $PasswordERB
}

通过这种方式,您可以支持在Puppet之外运行脚本,并使用Puppet更少的更改。

现在将您的清单改为:

class OurCompany::server($username, $password) {
  exec { 'Change Service Credentials':
    command   => template('OurCompany/OurTemplatedPowerShell.ps1.erb'),
    provider  => powershell,
    logoutput => true,
    returns   => [0, 1]
  }

值会自动传递给ERB的绑定。它使得传递值变得更加简单。

如果您需要查看此示例,请查看

https://github.com/puppetlabs/puppetlabs-chocolatey/blob/2862e058de0c28be363cb7df03aa5da31caae414/templates/InstallChocolatey.ps1.erb#L24

https://github.com/puppetlabs/puppetlabs-chocolatey/blob/2862e058de0c28be363cb7df03aa5da31caae414/manifests/install.pp#L11-L18

看起来这些值很神奇,但它们会根据Puppet变量传递给ruby模板(ERB),因此$username(Puppet manifest)== @username(在ERB文件中)。

加密

现在最好的选择是:https://github.com/TomPoulton/hiera-eyaml

P p P P P P P P P P P P P P P P P P P P P P P P P P p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p

将密码存储在hieradata中:

username: username
password: password

并使用hiera-eyaml加密它。在你的清单中查找,如:

class OurCompany::server($username = hiera('username'), $password = hiera('password')) {

如果您只想在此清单中使用用户名和密码,您还可以使用自动参数查找/自动数据绑定:

# hieradata
---
OurCompany::server::username: username
OurCompany::server::password: password

然后您不必在清单中使用hiera函数。

答案 1 :(得分:0)

这是传递参数的示例;

class OurCompany::server($username, $password) {
  exec { 'Change Service Credentials':
    command   => epp('OurCompany/OurTemplatedPowerShell.ps1', { parameter1 => $username, parameter2 => $password }),  
    provider  => powershell,  
    logoutput => true,  
    returns   => [0, 1],  
}    

很明显,您的epp文件必须在顶部定义parameter1和parameter2。
该模块中的OurCompany / templates / OurTemplatedPowerShell.ps1 epp类似于;

<%- | String $parameter1, $parameter2 | -%>

$User = '<%= $parameter1 %>'
$Password = '<%= $parameter2 %>'
.....MORE POWERSHELL TO DO WHAT YOU WANT.....