我在这里寻求澄清。似乎用户定义类型的managehome属性仅在用户不存在时才有效。看看这个 DSL
user { 'artifactory':
ensure => 'present',
home => '/home/artifactory',
managehome => true,
}
file { '/home/artifactory/data':
ensure => link,
target => '/var/lib',
require => User['artifactory'],
}
我第一次运行它时它工作正常,但是,如果我删除工件用户的主目录,然后再次运行它,puppet barfs。
错误:无法在确保上设置“链接”:没有这样的文件或目录
我的第一个念头是真的吗?看看文档
管理用户时是否管理主目录。当确保 => 存在时,这将创建主目录
如果我删除用户并重试,它会起作用。那么这是设计使然还是错误?这对我来说似乎很微妙。
从运行时的角度来看,puppet 检查系统上用户的状态并将其与清单进行比较。如果用户在系统上不存在,则 puppet 运行适当的
useradd
命令来创建它。如果用户不应该存在并且确实存在,那么它会运行相应的userdel
命令。如果用户的某些属性(例如组成员身份、uid、名称等)发生了更改,则它会发出相应的gpasswd
或usermod
命令。不幸的是,关于用户类型的文档并不是最清楚的。该
managehome
参数与其说是关于该目录的声明,不如说它是useradd
、usermod
或userdel
命令的一个选项。因此,如果您设置managehome => true
和更改主目录的位置,那么它将被创建,如果您删除用户,它将被删除,如果您添加用户,它将被创建。但是,它不能确保目录始终存在。如果这是必需的,那么我建议您创建一个文件类型并设置适当的要求。像这样的东西:
这是一个已知问题。计划的解决方案是保留当前行为,但将 managehome 重命名为createhome以使其更加清晰。