Sunday, March 11, 2012

How to Deploy an OVF Located On ESXi Datastore Using ovftool

I have written several articles in the past about the awesome ovftool which is a versatile remote command-line utility for importing/exporting virtual machines in the OVF format across various VMware products. I mainly run ovftool in either the vMA or on my OSX desktop. When performing an import, the OVF files are local on the same system that has the ovftool installed.

I recently came across an interesting question about using the ovftool to deploy OVF files that are located on an ESXi datastore. My initial thought was that you would not be able to deploy the OVF files since the ovftool would not have access to the files locally. After finishing a recent article about ESXi datastore management using the vCLI's vifs utility, I then realized there might actually be a way to deploy OVF files that are stored on an ESXi datastore.

If you take a look on page 17 of the ovftool user guide, there is a table describing the various source locators that are supported. You can see that the source of an OVF file can be accessed by ovftool in 4 different methods including HTTP/HTTPs which is a key for this specific request.

Source TypeDefault FileExtension Protocol
OVF.ovfFile, HTTP, HTTPS, FTP
OVA.ovaFile, HTTP, HTTPS, FTP
VMX.vmxFile
vvApprunN/AFile
vCloud DirectorN/AHTTPS
vSphereN/AvSphere

Files and folders management for a datastore is exposed through the fileManager in the vSphere API and datastores are referenced as a URL or remote path.

A URL has the form
scheme://authority/folder/path?dcPath=dcPath&dsName=dsName
where
  • scheme is http or https.
  • authority specifies the hostname or IP address of the Center or ESX(i) server and optionally the port.
  • dcPath is the inventory path to the Datacenter containing the Datastore.
  • dsName is the name of the Datastore.
  • path is a slash-delimited path from the root of the datastore.
Putting all this together, you can use the ovftool remotely to deploy an OVF file that is stored on an ESX(i) datastore. Below is an example walk through of this process.

Here is an OVF that is stored on a datastore located on an ESXi host:
To identify the URL path to your OVF, you can use a web browser to assist. Point your browser to the following address: https://[ESXI_HOST]/folder
When you first login, you will be brought to the root datacenter, in the case of directly connecting to an ESX(i) host, you will only see "ha-datacenter". Go ahead and select it and then you will be brought to a list of datastores the host has access to.
Select the datastore which contains the OVF file you wish to deploy from and then browse to the specific file.
Make a note of the URL path used to get to the OVF file and the OVF filename itself. Taking the example above, we end up with the following URL path:
https://vesxi50-4.primp-industries.com/folder/MyVM/MyVM.ovf?dcPath=ha-datacenter&dsName=iSCSI-1
To confirm the URL path, we can use ovftool to perform a simple "probe" on our OVF, this will provide you with a quick summary of the OVF.
Next we are ready to import the OVF file to our ESXi host. In this example, we will deploy the OVF to another datastore the ESXi host has access to and configure a specific portgroup to connect to the VM to after deployment. There are various options that can be passed to ovftool, please refer to the ovftool user guide for more details.
One the import has completed, you should now see the VM automatically registered in your ESXi host inventory.
You can see that this method allows you to import an OVF file stored on a datastore locally to the ESXi host as well as an OVF file stored on a remote datastore of another ESXi host. To help manage and deploy your OVF files, you should consider storing them on a centralized "media" datastore or even a WEB/FTP server that can be accessed by the ovftool.

    11 comments:

    1. This is great. I don't know if you tried, but I took the VIC client directly to the ESXi host and attempted to deploy ovf/ova and inserted the https url indicated above. I got an error message but assumed it was my ova, because I also got an error message with ovftool 2.1 (win32) and the same ova/ovf.
      oh well thanks!
      v pham

      ReplyDelete
    2. Actually, just found that if you paste the URL into the 'deploy ovf/ova' window of the vSphere client, it works as well, so no need for installing additional tools. :)

      ReplyDelete
      Replies
      1. Yes, you can use the vSphere Client but the article was specific to using ovftool via the CLI :)

        Delete
      2. I am using this method, but speed is too low. I am connected to ESX via remote vsphere-client. I guess, using this way, first .ova file is coming to my client and then getting deployed back into esx. Speed is equivalent to the method when I deploy the ova from my local system.

        Could it be not possible to deploy the ova file there itself.

        Delete
    3. I was not able to do this...I was prompted for a username and password after entering the URL. The root user and password that I use for my ESX host was not accepted though.

      ReplyDelete
      Replies
      1. Disable lockdown mode on your ESXi host.

        Delete
    4. I am getting the error "Error: Curl error: URL using bad/illegal format or missing URL"

      vi-admin@vMA:~> ovftool "https://192.168.1.205/folder/MyVM.ovf?dcPath=ha-datacenter&dsName=local-datastore" "vi://root@192.168.1.205:443/"
      Please enter login information for source https://192.168.1.205/folder/
      Username: root
      Password: **********
      Opening OVF source: https://192.168.1.205/folder/MyVM.ovf
      The manifest validates
      Please enter login information for target vi://192.168.1.205/
      Username: root
      Password: **********
      Error: Curl error: URL using bad/illegal format or missing URL
      Completed with errors

      Any ideas? Thanks!

      ReplyDelete
      Replies
      1. Figured it out, it was because my ESXi password had special characters. Changed the ESXi password and it works fine. What a crappy error message :)

        Delete
      2. Laura,

        You can convert any special characters in the username and password to "URL-Safe" characters,
        for example:

        ' ' should be written as '%20' (blank)
        '!' should be written as '%21'
        '\' should be written as '%5C'

        You can actually convert ALL characters in the username and/or password to "URL-Safe" characters,
        just to make sure you have a valid identifier for the ovftool.

        Delete
    5. When I try to use an OVA in this method, I get "Error: Failed to open OVF descriptor". If I use the OVA in the viclient it works fine. If I use the https address in the vSphere Web Client, I get the descriptor error. If I use a local browse file path in the web client, it works fine.

      Am I missing something? I'd like to use the ovftool since it allows me to specify the new seSparse disk format.

      ReplyDelete
    6. I had troubles with --net: syntax, it just kept complaining about

      --net:Centos-6.3-amd64%20%28aa22b2ce-1e1e-4888-8b26-27a9396a1519%29=VM%20Network
      Error: Invalid OVF name (Centos-6.3-amd64%20%28aa22b2ce-1e1e-4888-8b26-27a9396a1
      519%29) specified in net mapping. OVF networks: . Target networks: 10.4.2.x Ne
      twork 10.4.3.x Network 10.4.7.x Network VM Network
      Completed with errors

      I tried "." for OVF name, tried the full text, tried "VM%20Network" as the target, as well as " " in there - none of them worked.

      I tried without the --net, which also completed with errors, yet did not create the target object VM.

      ReplyDelete