You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:53:38