265

Where does the name 'default' come from when launching a vagrant box?

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...

Is there a way to set this?

1
  • Do not forget to check if virtualization is active, enable VT-x in your BIOS. That was my problem Commented Oct 29, 2015 at 0:31

7 Answers 7

395

I found the multiple options confusing, so I decided to test all of them to see exactly what they do.

I'm using VirtualBox 4.2.16-r86992 and Vagrant 1.3.3.

I created a directory called nametest and ran

vagrant init precise64 http://files.vagrantup.com/precise64.box

to generate a default Vagrantfile. Then I opened the VirtualBox GUI so I could see what names the boxes I create would show up as.

  1. Default Vagrantfile

    Vagrant.configure('2') do |config|
        config.vm.box = "precise64"
        config.vm.box_url = "http://files.vagrantup.com/precise64.box"
    end
    

    VirtualBox GUI Name: "nametest_default_1386347922"

    Comments: The name defaults to the format DIRECTORY_default_TIMESTAMP.

  2. Define VM

    Vagrant.configure('2') do |config|
        config.vm.box = "precise64"
        config.vm.box_url = "http://files.vagrantup.com/precise64.box"
        config.vm.define "foohost"
    end
    

    VirtualBox GUI Name: "nametest_foohost_1386347922"

    Comments: If you explicitly define a VM, the name used replaces the token 'default'. This is the name vagrant outputs on the console. Simplifying based on zook's (commenter) input

  3. Set Provider Name

    Vagrant.configure('2') do |config|
        config.vm.box = "precise64"
        config.vm.box_url = "http://files.vagrantup.com/precise64.box"
        config.vm.provider :virtualbox do |vb|
            vb.name = "foohost"
        end
    end
    

    VirtualBox GUI Name: "foohost"

    Comments: If you set the name attribute in a provider configuration block, that name will become the entire name displayed in the VirtualBox GUI.

    Combined Example: Define VM -and- Set Provider Name

    Vagrant.configure('2') do |config|
        config.vm.box = "precise64"
        config.vm.box_url = "http://files.vagrantup.com/precise64.box"
        config.vm.define "foohost"
        config.vm.provider :virtualbox do |vb|
            vb.name = "barhost"
        end
    end
    

    VirtualBox GUI Name: "barhost"

    Comments: If you use both methods at the same time, the value assigned to name in the provider configuration block wins. Simplifying based on zook's (commenter) input

  4. Set hostname (BONUS)

    Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
      config.vm.hostname = "buzbar"
    end
    

    Comments: This sets the hostname inside the VM. This would be the output of hostname command in the VM and also this is what's visible in the prompt like vagrant@<hostname>, here it will look like vagrant@buzbar

Final Code

    Vagrant.configure('2') do |config|
        config.vm.box = "precise64"
        config.vm.box_url = "http://files.vagrantup.com/precise64.box"
        config.vm.hostname = "buzbar"
        config.vm.define "foohost"
        config.vm.provider :virtualbox do |vb|
            vb.name = "barhost"
        end
    end

So there it is. You now know 3 different options you can set and the effects they have. I guess it's a matter of preference at this point? (I'm new to Vagrant, so I can't speak to best practices yet.)

9
  • 3
    Hey, I did a little more research on related matters. (1) The directory in the name is generated the first time and doesn't change when you rename the directory. (2) The timestamp in the name is generated the first time and doesn't change when you restart. (3) The project is mapped to a VirtualBox VM via UUID, which is stored in PROJECT_ROOT/.vagrant/machines/default/virtualbox/id. This UUID is not visible in the VirtualBox GUI (virtualbox.org/ticket/6989), but you can use VBoxManage list vms on the command line.
    – odigity
    Commented Feb 18, 2014 at 17:00
  • One of the useful references I used for the previous comment: stackoverflow.com/questions/9434313/…
    – odigity
    Commented Feb 18, 2014 at 17:00
  • 8
    It's worth to note that the define VM method name is used in Vagrant stdout and logs, while set provider name name is used for managing the box with the provider. So both are relevant.
    – Redsandro
    Commented Apr 7, 2014 at 19:19
  • 31
    You don't actually need the do... end block if it's empty. config.vm.define "foohost" works just fine.
    – Zook
    Commented Dec 29, 2014 at 22:01
  • 8
    I love this answer's detail, but it doesn't really address the original question. Yes, those configurations will result in a "name" showing up in the Virtualbox GUI properly, and if you list them with vboxmanage, the same. However, this still keeps Bringing machine 'default' up with 'virtualbox' provider... around when you execute vagrant up
    – TomSchober
    Commented Jun 3, 2016 at 15:21
67

This is the way I've assigned names to individual VMs. Change YOURNAMEHERE to your desired name.

Contents of Vagrantfile:

Vagrant.configure("2") do |config|

  # Every Vagrant virtual environment requires a box to build off of.
  config.vm.box = "precise32"

  # The url from where the 'config.vm.box' box will be fetched if it
  # doesn't already exist on the user's system.
  config.vm.box_url = "http://files.vagrantup.com/precise32.box"

  config.vm.define :YOURNAMEHERE do |t|
  end

end

Terminal output:

$ vagrant status
Current machine states:

YOURNAMEHERE             not created (virtualbox)
2
  • 9
    You can omit the block at the end of your define, so simply config.vm.define :app_name works too.
    – Vidur
    Commented Jul 30, 2015 at 11:11
  • 1
    if YOURNAMEHERE is a variable then the colon ":" should be removed: config.vm.define YOURNAMEHERE do |t| end
    – Radu
    Commented Oct 12, 2015 at 6:24
24

I specify the name by defining inside the VagrantFile and also specify the hostname so i enjoy seeing the name of my project while executing Linux commands independently from my device's OS. ✌️

config.vm.define "abc"
config.vm.hostname = "abc"
1
  • 1
    Simple and to the point.
    – Marinos An
    Commented Jun 30, 2022 at 16:31
17

If you want to change anything else instead of 'default', then just add these additional lines to your Vagrantfile:

Change the basebox name, when using "vagrant status"

 config.vm.define "tendo" do |tendo|
  end

Where "tendo" will be the name that will appear instead of default

2
  • 1
    I think your answer is more refined and it is obvious that what you are setting is a string contrary to other answers that use ` :OBJECT_VALUE` Commented Jun 4, 2019 at 3:57
  • @AndresLeonRangel except for the fact that the do ... end part doesn't seem to be required at all 😉 Commented Nov 30, 2020 at 12:02
10

You can change vagrant default machine name by changing value of config.vm.define.

Here is the simple Vagrantfile which uses getopts and allows you to change the name dynamically:

# -*- mode: ruby -*-
require 'getoptlong'

opts = GetoptLong.new(
  [ '--vm-name',        GetoptLong::OPTIONAL_ARGUMENT ],
)
vm_name        = ENV['VM_NAME'] || 'default'

begin
  opts.each do |opt, arg|
    case opt
      when '--vm-name'
        vm_name = arg
    end
  end
  rescue
end

Vagrant.configure(2) do |config|
  config.vm.define vm_name
  config.vm.provider "virtualbox" do |vbox, override|
    override.vm.box = "ubuntu/wily64"
    # ...
  end
  # ...
end

So to use different name, you can run for example:

vagrant --vm-name=my_name up --no-provision

Note: The --vm-name parameter needs to be specified before up command.

or:

VM_NAME=my_name vagrant up --no-provision
6

Yes, for Virtualbox provider do something like this:

Vagrant.configure("2") do |config|
    # ...other options...
    config.vm.provider "virtualbox" do |p|
        p.name = "something-else"
    end
end
4
  • 2
    After changing my Vagrantfile and fully tearing the machine down via vagrant destroy then bringing it back up it's still calling it default. Commented Jul 25, 2013 at 14:34
  • 3
    I believe this changes the name in the VirtualBox GUI. "You can customize the name that appears in the VirtualBox GUI" Reference: link
    – nikhil
    Commented Jul 25, 2013 at 17:08
  • 2
    Ah, jepp my fault - I thought the author want's to change the VirtualBox name, the internal Vagrant name is of course only changeable in a multi-VM environment.
    – cmur2
    Commented Jul 25, 2013 at 18:33
  • 4
    Not meaning to be too picky cmur2, but it's possible to setup an internal Vagrant name in a single machine environment by simply providing only a single config.vm.define block.
    – Dave Birch
    Commented May 9, 2014 at 13:47
4

In case there are many people using your vagrant file - you might want to set name dynamically. Below is the example how to do it using username from your HOST machine as the name of the box and hostname:

require 'etc'
vagrant_name = "yourProjectName-" + Etc.getlogin
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/xenial64"
  config.vm.hostname = vagrant_name
  config.vm.provider "virtualbox" do |v|
    v.name = vagrant_name
  end
end

Not the answer you're looking for? Browse other questions tagged or ask your own question.