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

qui*_*tin 2 puppet

我在这里寻求澄清。似乎用户定义类型的managehome属性仅在用户不存在时才有效。看看这个 DSL

user { 'artifactory':
        ensure     => 'present',
        home       => '/home/artifactory',
        managehome => true,
}

file { '/home/artifactory/data':
        ensure  => link,
        target  => '/var/lib',
        require => User['artifactory'],
}
Run Code Online (Sandbox Code Playgroud)

我第一次运行它时它工作正常,但是,如果我删除了artifactory用户的主目录,然后再次运行它,puppet barfs。

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

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

管理用户时是否管理家目录。这将在确保 => 存在时创建主目录

如果我删除用户并重试,它会起作用。那么这是设计使然还是错误?对我来说似乎很微妙。

Sco*_*ack 5

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

不幸的是,关于用户类型的文档并不是最清楚的。该managehome参数没有这么多拍一部关于该目录的语句,因为它是一个选项useraddusermoduserdel命令。因此,如果您设置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'];
}
Run Code Online (Sandbox Code Playgroud)