我需要编写一个脚本,从全新安装的 Ubuntu 服务器构建我的服务器。除了 Apache 和 PHP 之外,还需要安装 MySQL。这里唯一的问题是,当我使用 apt-get 安装 MySQL 时,安装过程中会弹出一个对话框,让我输入 root 密码。也就是说,需要人工交互。
如何在安装过程中绕过此屏幕并避免人机交互,同时仍然使用 apt-get 安装 MySQL?
答案1
您需要预先植入 debconf 数据库。在尝试此操作之前,需要先安装 debconf。
mysql 和 ubuntu 的版本可以改变这一行:
echo mysql-server mysql-server/root_password select PASSWORD | debconf-set-selections
echo mysql-server mysql-server/root_password_again select PASSWORD | debconf-set-selections
例如,你需要这个:
echo mysql-server-5.0 mysql-server/root_password password PASSWORD | debconf-set-selections
echo mysql-server-5.0 mysql-server/root_password_again password PASSWORD | debconf-set-selections
答案2
虽然 FAI 和类似的系统在企业环境中很有用(他应该了解它们),但不幸的是它们并不是万能的。
例如,如果他在远程机器上工作,可能是托管的、租用的服务器、没有受信任或专用网络的共置服务器,或者像 EC2 这样的云环境,该怎么办?任何 PXE 网络启动都无法在那里工作。不过,Puppet 和 Chef 似乎是可以帮助他的更通用的工具。
cat << EOF | DEBIAN_FRONTEND=noninteractive DEBCONF_DB_FALLBACK=Pipe /usr/bin/apt-get install somepackage
Name: ...
Template: ...
Value: ...
Owners: ...
Variables:
....
....
EOF
您可以从已设置的系统上的 debconf DB 获取正确的值。此技术可让您将整个内容粘贴到单个 shell 脚本中。例如,从 /var/cache/debconf/passwords.dat(请注意,它既适用于 Debian 上的 5.0,也适用于 Ubuntu 上的 5.1,额外的条目不会造成任何影响):
cat << EOF | DEBIAN_FRONTEND=noninteractive DEBCONF_DB_FALLBACK=Pipe /usr/bin/apt-get -qq -y install mysql-server
Name: mysql-server/root_password
Template: mysql-server/root_password
Value: YOURPASSWORD
Owners: mysql-server-5.1
Flags: seen
Name: mysql-server/root_password_again
Template: mysql-server/root_password_again
Value: YOURPASSWORD
Owners: mysql-server-5.1
Flags: seen
Name: mysql-server/root_password
Template: mysql-server/root_password
Value: YOURPASSWORD
Owners: mysql-server-5.0
Flags: seen
Name: mysql-server/root_password_again
Template: mysql-server/root_password_again
Value: YOURPASSWORD
Owners: mysql-server-5.0
Flags: seen
EOF
另一种方法,也许更简单:(从 debconf-utils 包中的 debconf-get-selections 或 debconf-show 收集答案):
echo "Installing MySQL 5.0.."
sudo apt-get install -qqy debconf-utils
cat << EOF | debconf-set-selections
mysql-server-5.0 mysql-server/root_password password YOURPASSWORD
mysql-server-5.0 mysql-server/root_password_again password YOURPASSWORD
mysql-server-5.0 mysql-server/root_password seen true
mysql-server-5.0 mysql-server/root_password_again seen true
EOF
/usr/bin/apt-get -y install mysql-server-5.0 mysql-server
运行 debconf-set-selections 后,检查你的答案:cat /var/cache/debconf/passwords.dat
并且,在测试时,请务必删除并清除所有数据库(特别是存储数据的 mysql 数据库),并修复配置数据库,以防它们损坏:
apt-get --purge remove mysql-server*; /usr/share/debconf/fix_db.pl
这里有几点提示:1) 您必须有 seen 标志和 _again 密码。2) 您不能在密码两边加引号。密码将不带引号进入 MySQL 查询,因此如果需要,您必须自己加引号。这也意味着不能有空格(我认为)3) 如果您遇到问题,请手动进行预置,然后直接自己运行 MySQL 安装(在普通终端/tty 中),看看 debconf 告诉您什么。它会在那里告诉您警告和错误。
答案3
如果你需要重建多个服务器,我强烈建议你查看类似木偶而不是编写 shell 脚本。Puppet 具有描述性语言,因此您可以定义系统的外观,而不是如何实现它。包类型有一个 responsefile 选项,允许您定义 Steven 的答案中的 debconf 答案。