• Vagrant 常用命令


    Vagrant 常用命令

    首先需要创建一个目录用于存放Vagrantfile文件以及Vagrant在工作中的数据:

    mkdir my-vagrant-project
    cd my-vagrant-project

    然后初始化Vagrant工程:

    vagrant init ubuntu/trusty64

    该命令会在当前目录下创建Vagrantfile,并且指定所使用的box为ubuntu/trusty64,该box由Hashicorp官网提供。此时,Vagrant发现box的名字的格式为“用户名/box名”,则会使用“https://atlas.hashicorp.com/用户名/box名”来下载该box。对于非官网提供的box,可以通过以下命令创建:

    vagrant init my-box https://boxes.company.com/my.box

    其中,my-box为该box的名字,后面的URL为该box的下载地址。接下来就可以启动虚拟机了:

    vagrant up

    此时Vagrant会先从Hashicorp下载ubuntu/trusty64这个box(如果先前下载过了则跳过),然后启动虚拟机。在默认情况下,Virtualbox将作为provider,当然你也可以使用其他provider,比如以下命令将启动一个hyperv虚拟机:

    vagrant up --provider hyperv

    登录到虚拟机:

    vagrant ssh

    此时vagrant将使用默认的用户vagrant以及预设的SSH公钥密钥键值对直接登录虚拟机。

    关闭虚拟机:

    vagrant halt

    删除虚拟机:

    vagrant destroy

    请注意,vagrant destroy只会删除虚拟机本身,也即你在Virtualbox将看不到该虚拟机,但是不会删除该虚拟机所使用的box。

    Vagrant还会在Vagrantfile所在同级目录下创建一个.vagrant隐藏文件夹,该文件夹包含了在本地运行虚拟机的一些信息。如果使用了代码库管理(比如Git),这个.vagrant文件夹应该被ignore掉。

    (二)添加和查看所下载的box

     Vagrant会将所下载的box保存到~/.vagrant.d/boxes目录下,除了在执行“vagrant up”时Vagrant会下载box外,你也可以单独下载box到本地:

    vagrant box add ubuntu/trusty64

    这将从Hashicorp官网上下载ubuntu/trusty64这个box,你也可以指定一个另外的URL:

    vagrant box add --name mybox http://someurl.com/ubuntu.box

    这里的mybox是一个逻辑名字,你可以用该名字来设置Vangrantfile的“config.vm.box”。

    你可以在任何时候向Vagrant中添加新的box以备后用,在执行vagrant up时,Vagrant首先检查本地是有存在所需要的box,如果有则直接使用,如果没有则下载。

    列出本地所有的box:

    vagrant box list

    删除某个box:

    vagrant box remove box-name

    (三)端口转发(Port Forwarding)

    在默认情况下,Vagrant所创建的Virtualbox虚拟机使用的是NAT网络类型,即外界是不能直接访问你的虚拟机的,就连Host机器也访问不了。此时,如果你在虚拟机中启动的一个Tomcat来部署网站的测试环境,而又想外界能够访问的话,你需要使用端口转发:

    Vagrant.configure("2") do |config|
      config.vm.network "forwarded_port", guest: 8080, host: 8888
    end

    以上代码将Host机的8888端口转发到了虚拟机的8080端口,这样你便可以通过在Host机上访问http://localhost:8888来访问虚拟机的Tomcat了。对于Virtualbox来说,只有NAT类型的网络类型支持端口转发,这也是为什么Vagrant创建的Virtualbox虚拟机默认都有一个支持NAT的虚拟网卡,原因就是要能够支持Vagrant级别的端口转发。另外,Vagrant在第一次尝试连接虚拟机时使用的也是NAT。

    (四)共享文件夹

    在默认情况下,Vagrant所创建的虚拟机已经为我们创建了一个共享文件夹,在虚拟机上是/home/vagrant目录,在Host机上则为Vagrantfile所在目录,当然你也可以额外添加另外的共享文件夹:

    Vagrant.configure("2") do |config|
      config.vm.synced_folder "src/", "/srv/website"
    end

    第一个参数为Host机器上的目录,第二个参数为虚拟机上的目录。

     (五)Provision

    简单地说,Provision即通过使用某些工具自动地、批量地为机器安装软件以及配置系统,它省去了人工安装和配置系统时的重复性和易错性,当然还享受了计算机与生俱来的速度。Vagrant提供多种方式对虚拟机进行Provision,包括Shell、Chef、Puppet和Ansible等。以Shell为例,既可以通过直接在Vagrantfile中编写Shell脚本的方式,也可以通过引用外部Shell文件的方式。

    直接在Vagrantfile中编写Shell脚本,可以通过“inline”指定脚本内容:

    Vagrant.configure("2") do |config|
      # ... other configuration
    
      config.vm.provision "shell", inline: "echo hello"
    end

     通过引用外部脚本文件的方式:

    Vagrant.configure("2") do |config|
      config.vm.provision "shell", path: "script.sh"
    end

    在使用Ansible时,有两种方式:(1)在Host机器上安装Ansible,(2)采用Ansible Local的方式,即在虚拟机自身上安装Ansible。对于第(1)种方法,我们需要保证Host机器上已经安装了Ansible,然后进行配置:

    复制代码
    Vagrant.configure("2") do |config|
    
      #
      # Run Ansible from the Vagrant Host
      #
      config.vm.provision "ansible" do |ansible|
        ansible.playbook = "playbook.yml"
      end
    
    end
    复制代码

    在使用第(2)种方法时,Vagrant会首先检查box中是否已经安装了Ansible,如果没有,则会自动安装到虚拟机上,然后再运行provision:

    复制代码
    Vagrant.configure("2") do |config|
      # Run Ansible from the Vagrant VM
      config.vm.provision "ansible_local" do |ansible|
        ansible.playbook = "playbook.yml"
      end
    end
    复制代码

    当我们多次执行“vagrant up”启动虚拟机时,provison并不会每次都执行,只有在这三种情况下provision才会运行:

    1. 首次执行vagrant up
    2. 执行vagrant provision
    3. 执行vagrant reload --provision

    当然,你也可以在Vagrantfile中配置成每次执行vagrant up时都运行provision:

    Vagrant.configure("2") do |config|
      config.vm.provision "shell", inline: "echo hello",
        run: "always"
    end

    (六)网络配置

    在默认情况下,对于Virtualbox而言,Vagrant将使用Virtualbox的NAT网络方式,这种方式允许虚拟机访问外部网络,但是不允许外界访问虚拟机,就连Host机器也访问不了。另外,我们可以为虚拟机配置private network和public network。在配置private network时,相当于虚拟机和Host机共同组成了一个单独的局域网,外界无法访问该局域网,但是虚拟机可以访问外界,Host机和虚拟机之间也可以互访。请注意,这里说的外界是指原本和Host处于同一局域网的其他机器。

    使用private network时,我们可以给虚拟机指定固定的私有IP:

    Vagrant.configure("2") do |config|
      config.vm.network "private_network", ip: "192.168.50.4"
    end

    当然也可以使用DHCP的方式动态分配IP:

    Vagrant.configure("2") do |config|
      config.vm.network "private_network", type: "dhcp"
    end

    对于Virtualbox而言,此时虚拟机其实有两张网卡在工作,一种是Vagrant默认创建的NAT网卡,另一种是Host only类型的网卡提供private network。

    在使用public network时,虚拟机和Host在网络中具有同等的地位(共同使用Host机的物理网卡与外界通信),就相当于在Host所在网络中又多了一台计算机一样,此时虚拟机可以使用网络中的DHCP服务器获得与Host处于同一个网段的IP地址,以下配置默认采用DHCP方式配置public network:

    Vagrant.configure("2") do |config|
      config.vm.network "public_network"
    end

    如果Host机器有多张网卡,此时运行vagrant up, Vagrant会询问需要使用那张网卡连接到网络,如果不想要这种交互,则可以在Vagrantfile中进行配置:

    config.vm.network "public_network", bridge: [
      "en1: Wi-Fi (AirPort)",
    ]

    这里的 Wi-Fi(AirPort)表示使用了Mac笔记本的Airport连接到Wi-Fi。

    除了DHCP,也可以使用静态IP:

    Vagrant.configure("2") do |config|
      config.vm.network "public_network", ip: "192.168.0.5"
    end

    (七)Provider特定配置

    不同的Provider有不同的特性,也存在不同的配置方式。以Virtualbox为例,Vagrant默认会给虚拟机指定一个不具备可读性的名字,比如my-vagrant-project_default_1471685053487_94837,我们可以对此进行配置予以更改:

    config.vm.provider "virtualbox" do |v|
      v.name = "my_vm"
    end

    Provider的特定配置也可以覆盖Vagrant原来的配置:

    复制代码
    Vagrant.configure("2") do |config|
      config.vm.box = "precise64"
    
      config.vm.provider "vmware_fusion" do |v, override|
        override.vm.box = "precise64_fusion"
      end
    end

          

  • 相关阅读:
    使用 libevent 和 libev 提高网络应用性能
    An existing connection was forcibly closed by the remote host
    各种浏览器的兼容css
    vs输出窗口,显示build的时间
    sass
    网站设置404错误页
    List of content management systems
    css footer not displaying at the bottom of the page
    强制刷新css
    sp_executesql invalid object name
  • 原文地址:https://www.cnblogs.com/handongyu/p/7488240.html
Copyright © 2020-2023  润新知