当我的 Puppet 代理尝试从 Puppet 服务器 (v8) 检索配置时,我看到以下错误,所有服务器均在 Redhat OS 上运行:
Error: Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: Evaluation Error: Unknown variable: 'ssh_user'
该错误指的是“用户”模块中定义的自定义资源类型。
class users::virtual {
define ssh_user( $user=$name, $uid, $password, $key, $home_dir = 'home' ) {
user { $user:
ensure => present,
managehome => true,
uid => $uid,
password => $password,
home => "/${home_dir}/${user}"
}
ssh_authorized_key { "${user}_key":
key => $key,
type => "ssh-rsa",
user => $user,
}
}
define ssh_home ($home_dir = 'home') {
file { "/${home_base_dir}/${name}/.ssh":
ensure => directory,
owner => $name,
group => $name,
mode => 0700,
} ->
file { "/${home_dir}/${name}/.ssh/id_rsa":
source => "puppet:///modules/users/${name}/ssh/id_rsa",
owner => $name,
group => $name,
mode => 0600,
} ->
file { "/${home_dir}/${name}/.ssh/id_rsa.pub":
source => "puppet:///modules/users/${name}/ssh/id_rsa.pub",
owner => $name,
group => $name,
mode => 0644,
}
}
ssh_user { "myuser":
uid => 1010,
password => 'hidden',
key => "hidden",
}
}
知道为什么会发生这种情况吗?我删除了@ssh_user并尝试了$ssh_user,但看到同样的错误。
当您在另一个类或资源类型的定义中定义一个类或资源类型时,它将进入容器定义的命名空间。所以,使用...
... 定义类型的(完全限定)名称是
users::virtual::ssh_user
。在 Puppet 3 及更早版本中,Puppet 会首先尝试解析类和已定义类型名称(例如相
ssh_user
对于最内层本地命名空间),然后向外解析,直到找到已定义名称的命名空间,或者甚至找不到顶级范围名称。该行为在 Puppet 4 中被删除。从那时起,您始终需要通过其完全限定名称来引用类和已定义类型。这是您不应嵌套类和已定义类型定义的众多原因中较小的一个。那么,最好的解决方案就是将 ssh_user 类型提升到其自己的文件,大概是
modules/users/manifests/ssh_user.pp
。在这种情况下,您引用它的名称将是users::ssh_user
:另一方面,如果您坚持使用嵌套定义,那么您仍然需要通过其全名来引用该类型,但该名称将是
users::virtual::ssh_user
,正如已经描述的那样:如果您希望在将类型提升到其自己的文件时保留相同的完全限定名称,那么您可以将其放入
modules/users/manifests/virtual/ssh_user.pp
。无论你把类型放在哪里,如果你把它放到一个单独的文件中,那么你应该用它的完全限定名称来定义它。例如,
modules/users/manifests/ssh_user.pp