Terraform部署AWS EC2 Ubuntu实例时,远程执行命令因内核升级弹窗卡住的解决方法
Terraform部署AWS EC2 Ubuntu实例时,远程执行命令因内核升级弹窗卡住的解决方法
我太懂这个痛点了!Ubuntu在执行apt upgrade时偶尔弹出的「pending kernel upgrade」交互式弹窗,简直是非自动化脚本的噩梦——Terraform的remote-exec会一直卡在那儿等用户输入,完全没法自动完成部署。
其实咱们只需要给apt命令加上几个环境变量,强制它进入非交互式模式,就能彻底跳过所有需要人工确认的提示。具体做法如下:
核心解决思路
在所有apt相关的命令前,添加Debian/Ubuntu专属的环境变量,告诉系统不要弹出任何交互窗口:
DEBIAN_FRONTEND=noninteractive:全局禁用apt的交互式提示APT_LISTCHANGES_FRONTEND=none:跳过包变更信息的展示提示- 额外可以加上
--option Dpkg::Options::="--force-confold",确保升级时保持现有配置文件不变,避免配置冲突的提示
修改后的Terraform Provisioner代码
把你原来的remote-exec部分替换成下面的内容,重点看标注的修改处:
provisioner "remote-exec" { inline = [ # 先设置非交互式环境变量,避免所有弹窗 "export DEBIAN_FRONTEND=noninteractive", "export APT_LISTCHANGES_FRONTEND=none", # 更新包列表并升级,添加非交互式参数 "sudo DEBIAN_FRONTEND=noninteractive apt update -y", "sudo DEBIAN_FRONTEND=noninteractive apt upgrade -y --option Dpkg::Options::=\"--force-confold\"", # 添加并安装Adoptium OpenJDK仓库(无交互) "wget -qO - https://packages.adoptium.net/artifactory/api/gpg/key/public | sudo tee /etc/apt/keyrings/adoptium.asc > /dev/null", "echo \"deb [signed-by=/etc/apt/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main\" | sudo tee /etc/apt/sources.list.d/adoptium.list > /dev/null", "sudo DEBIAN_FRONTEND=noninteractive apt update -y", # 安装Java JDK 17(无交互)并查看版本 "sudo DEBIAN_FRONTEND=noninteractive apt install temurin-17-jdk -y --option Dpkg::Options::=\"--force-confold\"", "java --version", # 添加并安装Jenkins仓库(无交互) "curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null", "echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null", "sudo DEBIAN_FRONTEND=noninteractive apt-get update -y", # 安装Jenkins(无交互) "sudo DEBIAN_FRONTEND=noninteractive apt-get install jenkins -y --option Dpkg::Options::=\"--force-confold\"", # 启动Jenkins并查看状态 "sudo systemctl start jenkins", "sudo systemctl status jenkins", # 打印Jenkins初始密码 "sudo cat /var/lib/jenkins/secrets/initialAdminPassword", ] }
补充说明
- 为什么要把
DEBIAN_FRONTEND=noninteractive加到sudo后面?因为sudo默认会重置环境变量,直接export的变量可能不会被sudo继承,所以直接在sudo命令里指定更稳妥。 --force-confold参数会让dpkg在遇到配置文件冲突时,保留原来的配置文件而不是弹出选择提示,非常适合自动化场景。
这样修改后,你的Terraform部署就能全程自动完成,再也不会被内核升级的弹窗卡住啦!
备注:内容来源于stack exchange,提问作者busuu
相关产品推荐
相关产品推荐

