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