目的:
利用Puppet使用访问控制列表来规范哪些用户应该在服务器上拥有本地管理员帐户。如果本地管理员位于不在ACL上的服务器上,则该帐户将被删除。
设定:
使用Puppet,我使用EPP模板和PowerShell模块来执行代码,将机器上本地管理员的格式化列表与包含授权用户列表的插值$acl
变量进行比较。
我有一个包含用户名和初始密码的哈希,例如:
$credentials = { "test" => "t3st!!", "test2" => "t3st3r!" }
以及仅包含用户名的数组,用作应授权的用户的访问控制列表,例如:
$acl = $credentials.keys
init.pp
# Other code here, other functions work properly, variables import correctly
exec { "Removing unauthorized Local Administrators":
command => epp('usermgmt_test/remove-user.epp'),
provider => powershell,
}
remove-user.epp
function Get-LocalAdmin {
# Get the list of local Administrators, format it, and convert to an array
# for later iteration
$list = net localgroup 'Administrators' | Select-Object -Skip 6
$list = $list | Select-Object -First ($list.Count - 2)
$list = $list.Trim()
$list.Split(" ")
}
function Get-ACL {
# Import the $acl variable from puppet, convert to string, format for
# powershell, convert to array for later iteration
$puppet = "<%= $acl %>"
$puppet = $puppet.Trim('[',']')
$puppet.Split(',')
}
$acl = Get-ACL
$adminList = Get-LocalAdmin
foreach ($user in $adminList) {
if (($acl -notcontains $user) -and ($user -ne 'Administrator')) {
net user $user /delete
}
}
错误:
测试服务器上的清单应用没有错误,但实际上并没有删除任何用户并返回这个令人困惑的语句:
$ list.Split(“”)$ puppet.Split(',')}注意:/ Stage [main] / Usermgmt_test / Exec [删除未经授权的本地管理员] / return:已成功执行
问题:
我已经检查过$acl
变量是否正确插入到EPP模板中,我在PowerShell中的测试代码是否正常工作。我认为可能是Puppet试图插入PowerShell变量,所以我尝试转义那些(\$
),但这只是抛出了一堆PowerShell错误。我有点不知道我在这里失踪了什么。任何帮助将不胜感激!
答案 0 :(得分:0)
我能够弄清楚问题是什么。事实证明,在解释空白区域时,Puppet模板会有点变态。一旦我拿出所有的空白区域,返回值就会变得更有意义。
我还有一些问题要解决,只需将数组变量从puppet插入到模板中(因为Puppet只转换字符串)(使用puppet&#39;加入&#39;函数从stdlib模块到将数组转换为字符串然后在powershell中进行格式化以将字符串转换回可用的数组。但现在一切都好!