情况:在一台Windows主机上,我想安装一个带有Ubuntu 16 +一些开发工具的虚拟机。为此,我使用Vagrant和VirtualBox(都在Windows主机上)和虚拟机上的本地 Ansible。
问题:vm安装后,应该在Virtual Box中显示unity登录,以便用户可以登录并开始工作。然而,unity的安装(和升级任务)似乎需要重新启动。此外,当我第二次运行vagrant up
或vagrant provision
时,unity已经安装了,所以它不应该再次重新启动。
我的脚本到目前为止:
Vagrantfile (Windows主机)
Vagrant.configure("2") do |config|
# create a Ubuntu 16 LTS box
config.vm.box = "ubuntu/xenial64"
config.vm.provider "virtualbox" do |vb|
# Display the VirtualBox GUI when booting the machine
vb.gui = true
# Customize the amount of memory on the VM:
vb.memory = "4096"
end
config.vm.provision "ansible_local" do |ansible|
ansible.playbook = "playbook.yml"
end
end
剧本。yml(在Windows主机上并转移到Ubuntu客户端)
---
- hosts: all
tasks:
- name: Update apt cache
apt: update_cache=yes cache_valid_time=36000
- name: Upgrade to latest version
apt: upgrade=dist autoremove=yes
become: yes
- name: Add local user with pwd
user: name=<someuser> password=<someencryptedpwd>
become: true
- name: Install Ubuntu Desktop
apt: name=ubuntu-desktop
become: true
注:我们已经看到了多个可行的解决方案,但他们假设ansible在主机上运行。
现有的vagrant插件https://github.com/aidanns/vagrant-reload可以帮助您在配置序列的中间运行重新启动
确保安装插件
$ vagrant plugin install vagrant-reload
在Vagrantfile中的,您的配置看起来像
config.vm.provision "ansible_local" do |ansible|
ansible.playbook = "playbook_pre_reboot.yml"
end
config.vm.provision :reload
config.vm.provision "ansible_local" do |ansible|
ansible.playbook = "playbook_post_reboot.yml"
end
你需要拆分你的剧本来运行重启前要运行的任务和另一个剧本来运行重启后的任务。
该命令被添加到供应程序序列中,因此它解决了在供应运行期间需要重新启动虚拟机的问题。一旦虚拟机被完全配置,它将不会再次被调用,因此vagrant up
第二次将不会重新启动虚拟机。
但是,由于它是配置运行的一部分,因此具体地调用要运行的提供程序(vagrant up --provisioner
或vagrant provision
)将调用要运行的提供程序。在此提供程序上设置条件的可能性存在一个开放的问题,但这个问题尚未解决,因此调用vagrant提供程序运行将始终调用此重新启动运行。