我想在第一次加载时自动在 EC2 实例上安装 apache2。我使用的是基本 Ubuntu 16.04 LTS 映像:
ubuntu/images/hvm-ssd/ubuntu-xenial-16.04-amd64-server-20180522 (ami-a4dc46db)
我的用户数据脚本如下:
#!/bin/bash
apt-get update && apt-get upgrade -y
apt-get install apache2 -y
登录后,耐心等待,我发现 apache2 没有安装。由于此脚本以 root 身份运行,因此我无法看到输出,就像我手动运行它一样,因此我将所有输出重定向到日志文件。
#!/bin/bash
apt-get update && apt-get upgrade -y &>/var/log/erich
这是挂起的部分,等待用户输入:
Setting up console-setup (1.108ubuntu15.4) ...
debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
Configuring console-setup
-------------------------
1. ARMSCII-8 8. ISIRI-3342 15. ISO-8859-16 22. ISO-8859-8
2. CP1251 9. ISO-8859-1 16. ISO-8859-2 23. ISO-8859-9
3. CP1255 10. ISO-8859-10 17. ISO-8859-3 24. KOI8-R
4. CP1256 11. ISO-8859-11 18. ISO-8859-4 25. KOI8-U
5. GEORGIAN-ACADEMY 12. ISO-8859-13 19. ISO-8859-5 26. TIS-620
6. GEORGIAN-PS 13. ISO-8859-14 20. ISO-8859-6 27. UTF-8
7. IBM1133 14. ISO-8859-15 21. ISO-8859-7 28. VISCII
Encoding to use on the console:
我可以apt-mark hold
将此包作为权宜之计,但这不是解决方案。我该如何设置默认编码类型?
答案1
在 Google 上搜索我的脚本遇到的一些 debconf 错误,其他 问题 已回答所有这些似乎都有一个共同点——通过 SSH 进行远程执行。这似乎也是 Amazon 在配置实例时执行用户数据脚本的方法。
这些 SSH 连接似乎无法访问某些环境变量或默认配置数据,因此明确设置这些有助于减少错误。将DEBCONF_FRONTEND=noninteractive
环境变量设置为建议在这里而在其他问题上,在这个特定情况下却不起作用。
debconf-set-selections
在第一次调用之前,我能够使用来更新配置数据库,从而为控制台设置包设置默认编码(这导致我的脚本挂起)apt-get
。它以文件作为参数,因此可以将配置行写入临时文件,然后删除:
echo "console-setup console-setup/charmap47 select UTF-8" > encoding.conf
debconf-set-selections encoding.conf
rm encoding.conf
apt-get update && apt-get upgrade -y
此外,我可以通过添加到export TERM=xterm
脚本顶部来抑制许多 debconf 警告。
答案2
您应该在脚本顶部设置以下环境变量:export DEBCONF_FRONTEND=noninteractive
;有关进一步的解释,请参阅手册(请参阅http://manpages.ubuntu.com/manpages/artful/man7/debconf.7.html)。另外,为了确保万无一失,请将-qq
开关添加到apt-get
。
请注意,我使用 ,export
因为它会将环境变量传播到当前环境和子环境(与符号相反VAR=VALUE
)。这是必要的,因为apt-get
将产生其他进程来配置软件包。
这是 Bash 手册页的摘录:
export [-fn] [name[=word]] ... export -p 提供的名称被标记为自动导出到后续执行的命令的环境。如果给出了 -f 选项,则名称引用函数...
希望这可以帮助!