我是 Puppet 的新手,为了开始使用它,我想学习如何管理系统用户。
我有几个用户,他们具有共同的属性,所以我认为我应该把一些事情考虑出来。
经过一番努力,我得到了以下结果:
define staff::ssh_key($user) {
ssh_authorized_key { $name[name]:
ensure => present,
key => $name[key],
type => "ssh-rsa",
user => $user,
require => File["/home/${user}/.ssh"],
}
}
define staff($fullname, $ssh_keys, $shell = "/bin/bash") {
user { $name:
ensure => present,
comment => "${fullname},,,",
home => "/home/${name}",
managehome => true,
groups => ["users", "adm", "sudo"],
shell => $shell,
}
file { "/home/${name}/.ssh":
ensure => directory,
mode => 0700,
owner => $name,
require => User[$name],
}
staff::ssh_key { $ssh_keys:
user => $name,
}
}
然后我像这样声明用户:
staff { "drdaeman":
fullname => "Aleksey Zhukov",
shell => "/bin/zsh",
ssh_keys => [
{
name => "desktop",
key => "AAAA....6s=",
}
{
name => "notebook",
key => "AAAA....Q==",
}
],
}
暂时,我仅将这两个部分保存到一个名为的文件中staff.pp
。对于远程配置,我将其保存site.pp
为以下内容:
node "foobar.example.org" {
import "staff.pp"
}
虽然在本地一切似乎都运行良好,但通过调用puppet apply staff.pp
,远程使用时会失败。运行时puppet agent --test
出现错误:
err: Could not retrieve catalog from remote server: Could not intern from pson: Could not convert from pson: Could not find relationship source "Staff::Ssh_key[namenotebookkeyAAAA...Q==]"
err: Could not retrieve catalog; skipping run
(如果这很重要的话,我在 Ubuntu 上使用来自 apt.puppetlabs.com 的 Puppet 2.7.14。)
因此,看起来 Puppet 不喜欢使用哈希作为资源名称,至少在数据通过网络传输时不喜欢。有什么方法可以解决这个问题,而不是手动复制粘贴所有必需的ssh_authorized_key
资源?(这对我来说太冗长了)
file "/home/${name}/.ssh/authorized_keys": ... }
请注意,在这种情况下,我可以通过使用简单的而不是ssh_authorized_key
或来解决使用concat::fragment
,但这不适用于其他类似情况,即某些资源具有多个依赖资源,这些资源不容易缩减为单个文件。相反,我正在寻找一些比较通用解决这个问题的可能方法和类似情况(如果有的话)。
答案1
您将需要使用 create_resource 而不是声明:
staff::ssh_key { $ssh_keys:
user => $name,
}
为了保留用户 => $name 的便利性:
Staff::Ssh_key {
user => $name,
}
create_resources('staff::ssh_key', $ssh_keys)
同时将 ssh_keys 更改为哈希而不是 staff { 中的数组... ssh_keys => { } }