如何在Puppet的lookup()中处理含句点的Hiera变量名?
解决Puppet lookup()识别Hiera键中句点为子键的问题
有两种可靠的方法可以避免Puppet将Hiera键中的句点识别为子键分割符,无需修改带句点的用户名:
方法一:改用哈希结构存储SSH密钥
调整Hiera中的密钥存储格式,将sshkey::前缀的扁平键改为一个哈希,把带句点的用户名作为哈希的键:
# Hiera配置示例 sshkeys: bob.joe: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC...' jill.dill: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD...'
然后在Puppet代码中先取出整个哈希,再通过用户名索引对应的密钥:
$users.each |$user| { accounts::user { "$user": sshkeys => [ lookup('sshkeys')[$user] ] } }
这种方式结构更清晰,符合Hiera最佳实践,推荐优先使用。
方法二:使用数组形式的lookup键
保持现有Hiera的扁平键格式不变,将lookup的键从字符串拼接改为数组形式。数组中的每个元素对应Hiera键的一个层级,带句点的用户名会被当作完整的层级名称,不会被分割:
# 保持原Hiera配置不变 sshkey::bob.joe: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC...' sshkey::jill.dill: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD...'
修改Puppet代码中的lookup调用:
$users.each |$user| { accounts::user { "$user": sshkeys => [ lookup(['sshkey', $user]) ] } }
这里['sshkey', $user]会直接匹配Hiera中的sshkey::${user}键,不会将bob.joe拆分为bob和joe两个子层级。
内容的提问来源于stack exchange,提问作者John Sanchirico
相关产品推荐
相关产品推荐

