我有以下内容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,
}
我尝试过使用和不使用provider
和user
参数。
答案1
事实证明我必须使用environment
exec 中的参数明确设置一些环境变量,具体来说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',
],
}
原因有二:
LOGNAME、USER 和 HOME 被 puppet 明确取消设置在执行期间。这是一个设计选择,详细说明在我链接的票证中。
我还为了理智起见设置了 USER 和 HOME,尽管我不确定它们是否是必需的net ads
。