“网络广告加入”在 puppet exec 中失败,但直接从命令行运行正常

Ban*_*jer 3 linux centos kerberos samba puppet

我有以下exec将 Linux (CentOS 6) 主机加入 Active Directory 域的内容。在 bash 终端以 root 身份运行时,它运行成功并且主机正确加入 AD 域。

但是,在 puppet 中运行时,该net ads join命令失败并显示:

无法加入域:无法为机器帐户设置密码 (NT_STATUS_ACCESS_DENIED)

这是执行

exec { 'adjoin':
    command  => "kinit adjoin@AD.EXAMPLE.COM -k -t /etc/krb5.keytab && net ads join createcomputer='Machines/Servers/Linux Servers' osName='${operatingsystem}' osVer=${operatingsystemrelease} -k",
    unless   => "net ads testjoin -k | grep -q 'Join is OK'",
    provider => shell,
    user     => root,
    path     => '/usr/sbin:/usr/bin:/sbin:/bin',
    require  => [
        File['/etc/krb5.conf'],
        File['/etc/krb5.keytab'],
    ],
    logoutput => true,
}
Run Code Online (Sandbox Code Playgroud)

我试过使用和不使用provideranduser参数。

Ban*_*jer 5

事实证明,我必须使用environmentexec 中的参数显式设置一些环境变量,特别是LOGNAME

exec { 'adjoin':
    command  => "kinit adjoin@AD.EXAMPLE.COM -k -t /etc/krb5.keytab && net ads join createcomputer='Machines/Servers/Linux Servers' osName='${operatingsystem}' osVer=${operatingsystemrelease} -k",
    unless   => "net ads testjoin -k | grep -q 'Join is OK'",
    provider => shell,
    user     => root,
    path     => '/usr/sbin:/usr/bin:/sbin:/bin',
    require  => [
        File['/etc/krb5.conf'],
        File['/etc/krb5.keytab'],
    ],
    logoutput => true,
    environment => [
        'USER=root',
        'LOGNAME=root',
        'HOME=/root',
    ],
}
Run Code Online (Sandbox Code Playgroud)

这有两个原因:

  1. net ads -k join 在没有 LOGNAME 环境变量的情况下失败

  2. LOGNAME、USER 和 HOME在 exec 运行期间由 puppet 专门取消设置。这是一个设计选择,在我链接到的票证中有详细说明。

为了理智起见,我还设置了 USER 和 HOME,但我不确定net ads.