“net ads join” 在 puppet exec 中失败,但直接从命令行运行正常

“net ads join” 在 puppet exec 中失败,但直接从命令行运行正常

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

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

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

这是执行

exec { 'adjoin':
    command  => "kinit [email protected] -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,
}

我尝试过使用和不使用provideruser参数。

答案1

事实证明我必须使用environmentexec 中的参数明确设置一些环境变量,具体来说LOGNAME

exec { 'adjoin':
    command  => "kinit [email protected] -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',
    ],
}

原因有二:

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

  2. LOGNAME、USER 和 HOME 被 puppet 明确取消设置在执行期间。这是一个设计选择,详细说明在我链接的票证中。

我还为了理智起见设置了 USER 和 HOME,尽管我不确定它们是否是必需的net ads

相关内容