我正在使用Terraform在GCP中部署安装程序,其中有一个运行活动目录的Windows VM(作为域控制器)和另一个运行应用程序的Linux VM。该应用程序需要使用用户的凭据向域控制器进行身份验证,因此我放入了一个bash脚本,该脚本要等到创建用户后才能启动该应用程序。脚本如下所示:
until ldapwhoami -H ldap://${var.domain_controller_ip} -D ${var.service_account_username}@${var.domain_name} -w ${var.service_account_password} -o nettimeout=1 > /dev/null 2>&1
do
echo 'Waiting for AD account. Retrying in 10 seconds...'
sleep 10
done
这里的目的是一直保持循环,直到在域控制器中创建了用户为止,此时循环退出并继续启动应用程序。
此脚本在Terraform SSH设置程序的上下文中运行,以便我可以监视Terraform主机上发生的情况,以便在此循环退出之前不会开始下一步。
该脚本大多数时候都起作用-这意味着在域控制器中创建用户后不久,Linux VM中的循环将退出并继续。但是,很多时候,我看到Linux VM陷入了等待数小时的循环,即使已经创建了用户,也无法成功执行“ ldapwhoami”。在这段时间里,我注意到以下几点:
如果我在同一个Linux VM中启动另一个SSH会话并执行完全相同的命令,则ldapwhoami
能够成功进行身份验证-在循环仍然失败并重试时,所有这些操作都可以进行。
如果我在同一个Linux VM中启动另一个SSH会话并启动tcpdump host [domain_controller_ip]
,则不会看到来自循环的流量-这意味着ldapwhoami
失败了,甚至没有发送任何数据包到网络。 (通常,tcpdump
会在成功案例中显示数据包)
我真的很困惑,为什么有时ldapwhoami
甚至没有向域控制器发送数据包。某处有一些本地缓存吗?如果是这样,如何冲洗?
另一个观察结果是,如果我作为启动脚本的一部分而不是在SSH供应器中运行相同的循环(如果很难以这种方式监视进度),则如果我没有看到此问题。也许这是SSH供应商的问题?
感谢您的帮助!
edit:当它陷入循环中时,也有机会在40分钟以上(正常成功的情况下需要大约15分钟等待用户)后自动恢复(意味着退出循环),但是有时它无法恢复数小时。