Puppet:仅当用户不存在时,用户类型的 managehome 才有效

Puppet:仅当用户不存在时,用户类型的 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。

错误:无法设置“链接”以确保:没有这样的文件或目录

我的第一个想法是真的? 看看文档

管理用户时是否管理主目录。当ensure => present时,这将创建主目录

如果我删除用户并重试,它就会正常工作。那么这是设计使然还是一个错误?我觉得这很微妙。

答案1

从运行时角度来看,puppet 检查系统上用户的状态并将其与清单进行比较。如果用户在系统中不存在,则 puppet 运行适当的useradd命令来创建它。如果用户不应该存在,但确实存在,则它会运行适当的命令userdel。如果用户的某些属性(例如组成员身份、uid、名称等)已更改,则它会发出适当的gpasswdusermod命令。

不幸的是,关于用户类型的文档不是最清晰的。该managehome参数并不是对该目录做出声明,而是 、 或 命令的一个选项useraddusermod因此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

它是已知问题。计划的解决方案是保留当前行为,但重命名管理主页创建主页使其更加清晰。

相关内容