情况:在Windows主机上,我想用Ubuntu 16 +一些开发工具安装虚拟机。为此,我在vm上使用Vagrant和VirtualBox(都在Windows主机上)和本地 Ansible。
问题:安装vm后,它应该在Virtual Box中显示统一登录,以便用户可以登录并开始工作。但是,统一(和升级任务)的安装似乎需要重新启动。此外,当我第二次运行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
playbook.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
P.S。如果已经看到了多个ansible解决方案,但他们认为ansible在主机上运行。由于Windows主机,在这种情况下不可能。
答案 0 :(得分:4)
现有的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
您需要拆分您的剧本以在重新启动之前运行要运行的任务,然后再运行另一个剧本以运行任务。
此命令已添加到配置程序序列中,因此这解决了在配置运行期间需要重新引导VM的事实。完全配置VM后,将不会再次调用VM,因此vagrant up
第二次不会重新启动VM。
但是,由于它是配置运行的一部分,因此专门调用配置程序运行(vagrant up --provisioner
或vagrant provision
)将调用此配置程序运行。有open issue可以在此配置程序上设置条件,但尚未解决此问题,因此调用vagrant provisioner运行将始终将此重新启动称为运行。