Linux

“net ads join”在 puppet exec 中失敗,但直接從命令行執行正常

  • May 21, 2014

我有以下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,
}

我嘗試過使用和不使用provideranduser參數。

事實證明,我必須使用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',
   ],
}

有兩個原因:

  1. 沒有 LOGNAME env 變數的 net ads -k join 失敗
  2. LOGNAME、USER 和 HOME在 exec 執行期間由 puppet 專門取消設置。這是我連結到的票中詳細說明的設計選擇。

為了理智起見,我還設置了 USER 和 HOME,儘管我不確定net ads.

引用自:https://serverfault.com/questions/597219