重启后继续Ansible Playbook



情况:在一台Windows主机上,我想安装一个带有Ubuntu 16 +一些开发工具的虚拟机。为此,我使用Vagrant和VirtualBox(都在Windows主机上)和虚拟机上的本地 Ansible。

问题:vm安装后,应该在Virtual Box中显示unity登录,以便用户可以登录并开始工作。然而,unity的安装(和升级任务)似乎需要重新启动。此外,当我第二次运行vagrant upvagrant provision时,unity已经安装了,所以它不应该再次重新启动。

总结问题:如果需要的话,我如何重新启动我的VM ,然后在流浪+本地可访问设置中继续配置?

我的脚本到目前为止:


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 --provisionervagrant provision)将调用要运行的提供程序。在此提供程序上设置条件的可能性存在一个开放的问题,但这个问题尚未解决,因此调用vagrant提供程序运行将始终调用此重新启动运行。

最新更新