安全地将参数传递给使用 Puppet 执行的 Powershell 脚本?
Securely passing parameters to Powershell scripts executed with 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 进行更少的更改。
现在将您的清单更改为:
class OurCompany::server($username, $password) {
exec { 'Change Service Credentials':
command => template('OurCompany/OurTemplatedPowerShell.ps1.erb'),
provider => powershell,
logoutput => true,
returns => [0, 1]
}
这些值会自动传递给 ERB 的绑定。它使传递值变得更加简单。
如果您需要查看此示例,请查看
看起来这些值很神奇,但它们会根据 Puppet 变量传递给 ruby 模板 (ERB),所以 $username
(Puppet 清单)== @username
(在 ERB 文件中)。
加密
你现在最好的选择是:https://github.com/TomPoulton/hiera-eyaml
Puppet 即将推出类似的 Puppet 数据提供程序,但可能要到 Puppet 5 才能投入生产。
将您的密码存储在 hieradata 中,例如:
username: username
password: password
并使用hiera-eyaml
对其进行加密。在您的清单中查找它,例如:
class OurCompany::server($username = hiera('username'), $password = hiera('password')) {
如果您只打算使用此清单中的用户名和密码,您还可以使用自动参数 lookup/automatic 数据绑定:
# hieradata
---
OurCompany::server::username: username
OurCompany::server::password: password
那么您不必在清单中使用 hiera 函数。
下面是传递参数的例子;
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.....
我们有一个 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 进行更少的更改。
现在将您的清单更改为:
class OurCompany::server($username, $password) {
exec { 'Change Service Credentials':
command => template('OurCompany/OurTemplatedPowerShell.ps1.erb'),
provider => powershell,
logoutput => true,
returns => [0, 1]
}
这些值会自动传递给 ERB 的绑定。它使传递值变得更加简单。
如果您需要查看此示例,请查看
看起来这些值很神奇,但它们会根据 Puppet 变量传递给 ruby 模板 (ERB),所以 $username
(Puppet 清单)== @username
(在 ERB 文件中)。
加密
你现在最好的选择是:https://github.com/TomPoulton/hiera-eyaml
Puppet 即将推出类似的 Puppet 数据提供程序,但可能要到 Puppet 5 才能投入生产。
将您的密码存储在 hieradata 中,例如:
username: username
password: password
并使用hiera-eyaml
对其进行加密。在您的清单中查找它,例如:
class OurCompany::server($username = hiera('username'), $password = hiera('password')) {
如果您只打算使用此清单中的用户名和密码,您还可以使用自动参数 lookup/automatic 数据绑定:
# hieradata
---
OurCompany::server::username: username
OurCompany::server::password: password
那么您不必在清单中使用 hiera 函数。
下面是传递参数的例子;
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.....