Linux
“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 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, }
我嘗試過使用和不使用
provider
anduser
參數。
事實證明,我必須使用
environment
exec 中的參數顯式設置一些環境變數,特別是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', ], }
有兩個原因:
- 沒有 LOGNAME env 變數的 net ads -k join 失敗
- LOGNAME、USER 和 HOME在 exec 執行期間由 puppet 專門取消設置。這是我連結到的票中詳細說明的設計選擇。
為了理智起見,我還設置了 USER 和 HOME,儘管我不確定
net ads
.