在 Vagrant 脚本中重新加载 VM

Reload VM in Vagrant script

简介
我正在使用 Vagrant 并想创建一个适合我需要的盒子。我目前正在构建我的供应脚本,但我遇到了一个问题,需要我重新登录。

我想要实现的目标
我想将语言环境设置为德语

我在做什么
使用 vagrant ssh 登录到我的 vagrant box 后,我 运行 以下命令

sudo apt-get update 
sudo cp /var/www/projectfantasy/www/vagrant_ressources/locale.gen /etc/
sudo locale-gen de_DE.UTF-8

这些步骤是在 Debian's wiki 的帮助下完成的。最后一步是

To use the new settings with your programs, log out and back in.

现在我需要帮助了。在 vagrant 供应脚本中我将如何重新登录?当我不重新登录时,我在安装额外的软件包时收到以下 警告

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LC_CTYPE = "de_DE.UTF-8",
    LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory

我的意思是,这些只是警告,应该不是问题,对吧?但我不想收到警告,想知道如何解决这个问题。

当我重新登录并尝试再次安装这些软件包时,它可以正常工作。

不幸的是,这并不是那么简单 - 如果您在配置脚本中发出 reboot 命令或 shutdown -r now,VM 将重新启动(确实),但配置将不会继续。

幸运的是,有些人写了插件(https://github.com/exratione/vagrant-provision-reboot and https://github.com/aidanns/vagrant-reload)我用了第二个并且它有效

确保安装插件

$ vagrant plugin install vagrant-reload

在你的 vagrantfile 中,你的配置看起来像

 config.vm.provision "shell", path: "vagrant_ressources/preparations.sh"
 config.vm.provision :reload
 config.vm.provision "shell", path: "vagrant_ressources/bootstrap.sh"

因此 preparations.sh 将执行,然后 VM 将重新加载并且 bootstrap.sh 将执行

在您的 preparations.sh 中,生成语言环境后,请确保在语言环境文件中设置了变量:

sudo locale-gen 
echo -e 'LANG=de_DE.UTF-8\nLC_ALL=de_DE.UTF-8' > /etc/default/locale
sudo timedatectl set-timezone Europe/Berlin

PS :关于您使用 shell 配置的一条注释。默认情况下,配置是 运行 具有 root 权限,因此不需要所有 sudo ;如果你想 运行 作为 vagrant 用户 运行 配置它作为 config.vm.provision :shell, privileged: false ... 你将需要 sudo

我无法重现你的警告,但我发现这将允许你设置 LC_ALL:

sudo update-locale LC_ALL=de_DE.UTF-8

(来自 https://askubuntu.com/questions/114759/warning-setlocale-lc-all-cannot-change-locale,但也适用于 debian jessie)