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

标签 powershell puppet

我们有一个 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]
  }

最佳答案

传递参数

你这样做的方式不起作用,因为模板只接受文件的路径(与 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 进行较少更改。

现在将您的 list 更改为:
class OurCompany::server($username, $password) {
  exec { 'Change Service Credentials':
    command   => template('OurCompany/OurTemplatedPowerShell.ps1.erb'),
    provider  => powershell,
    logoutput => true,
    returns   => [0, 1]
  }

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

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

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 list )== @username (在 ERB 文件中)。

加密

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

Puppet 即将为 Puppet Data Provider 提供类似的东西,但可能要等到 Puppet 5 之后才能投入生产。

将您的密码存储在 hieradata 中,例如:
username: username
password: password

并使用 hiera-eyaml对其进行加密。在 list 中查找它,例如:
class OurCompany::server($username = hiera('username'), $password = hiera('password')) {

如果您只打算在此 list 中使用用户名和密码,您还可以使用自动参数查找/自动数据绑定(bind):
# hieradata
---
OurCompany::server::username: username
OurCompany::server::password: password

然后,您不必在 list 中使用 hiera 函数。

关于powershell - 将参数安全地传递给使用 Puppet 执行的 Powershell 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40738969/

相关文章:

java - 无法使用 puppetlabs-java 安装 java

puppet - runintervel in puppet - 当 list 没有变化时,旧目录是否会再次应用?

powershell - 如何在powershell中测量窗口高度(行数)?

windows-7 - 用于显示通知气球并采取行动的 PowerShell 脚本仅适用于 ISE gui,而不适用于命令行

powershell - 如何确保使用Powershell启用或禁用Wi-Fi?

windows - 是命令提示符和 PowerShell 终端仿真器吗?

powershell - Start-Job 中的变量不会被评估

docker - docker 企业解决方案?

ssl - Puppet:无法从远程服务器检索目录

puppet - 文件路径必须完全限定 - Puppet