Virtual appliances built from VMware Studio provides a very easy mechanism of updating or upgrading the software on the appliance by using the VAMI (Virtual Appliance Management Interface) web interface. The VAMI web interface provides three methods of updating or upgrading an appliance: online update repository hosted by the author of the appliance, CD-ROM or alternate update repository can be specified.

UPDATE 02/23/16 - It looks like there were two tiny changes with the latest VAMI Update Repos starting with vCenter Server Appliance (VCSA) 6.0 Update 1. The first being a new signature file called manifest-latest.xml.sign and the .sha256 and .sig files are no longer used or available for download. The second is an additional patch-metadata-scripts.zip file that is under the pool-package directory which maybe required depending on the virtual appliance in question. I have updated my script to take care of these files in case they are needed for newer versions of the VAMI interface.

UPDATE 07/10/15 - VMware has just released a new Fling called VAMI Update Repository Appliance (VURA) which provides an easy way for customers to create offline VAMI repositories for their Virtual Appliances.

For VMware virtual appliances, a VMware hosted update repository is configured by default and internet connectivity to the configured URL will be required (proxy configurations are supported). However, there are environments where network connectivity to VMware's online repository is just not possible or the update repository must be hosted internally due to security requirements and this is where the third option can be used.

The process to setup your own update repository is not really documented and I have been noticing more requests from customers looking for a way to update or upgrade their VMware virtual appliances without requiring access to VMware's online repository. There are also other virtual appliances such as VCSA (vCenter Server Appliance) which ships both the update contents for an ISO and zip file which can then be used with the two other update/upgrade methods.

Though these files can be generated from VMware Studio as part of the appliance build process, the majority of the VMware virtual appliances do not provide these files for download.

I decided to research this topic a bit and look into building my own offline update repository based on the online update repository from VMware. I figured it should be fairly easy to replicate what is being hosted to a local web server that runs within your own datacenter. After some investigation, I found the  process to be pretty straight forward and only requirement is a web server that can be used to host the contents for update repository. In this example, I will show you how to build an update repository to upgrade VIN (vSphere Infrastructure) 1.2 to 2.0.

Step 1 - Login to the VAMI interface of VIN (https://[VIN-IP]:5480) and under the Update tab and make a note of the the default repository URL.

Step 2 - Download buildVARepo.sh shell script and upload that to a Linux based web server which will automatically build out our update repository.

Step 3 - The script accepts two arguments: default repository URL for a particular virtual appliance (from the previous step) and the name of the directory in which the repository will be created. In this example, I will be using the VIN repository URL and I will name the repository vin:

./buildVARepo.sh http://vapp-updates.vmware.com/vai-catalog/valm/vmw/302ce45f-64cc-4b34-b470-e9408dbbc60d/1.2.0.290.latest vin

The system that the script runs will need to have access to the URL above as it needs to download the required manifest files. Using the manifest files, parses out the package name and downloads the RPM packages to the web server using wget.

Step 4 - The result is a directory structure that will look like the following:

vin/manifest = List of XML manifest and signature files that describes the update and the path to the appliance packages
vin/package-pool = The RPM packages for the appliances for a given update

Depending on the location of where the script was executed, you may need to move it to the proper path in which your web server is configured to serve up content. You should be able to open a browser and point that to the /vin directory and view the contents.

Step 5 - We now log back into the VAMI interface and specify our update repository URL which will be http://[IP-OR-HOSTNMAE]/[REPO-NAME] and save the settings.

Step 6 - Now we head over to the Status sub-tab under Update and click on the "Check Updates" and we should see a new update for our virtual appliance. To update the appliance, we then select "Install Updates" and shortly after we should see our VIN appliance upgrade to 2.0

Note: Not all virtual appliances provide upgrades to the latest versions of the appliance, be sure to check the documentation of each individual appliances to see what is supported.

6 thoughts on “How To Create Offline Update Repository For VMware Virtual Appliances

  1. It seems that in vcsa 6 the sha256 file does not exist and the name for .sig is changed to .sign

  2. We have a requirement to use two factor authentication and Windows to access the internet so I converted to Powershell. The only issue I’m having is how to get the $Repo_Url from the current VCSA? I poked around a bit but couldn’t find this attribute. Here’s the script to create a repo…maybe useful to someone else.

    $REPO_URL=”https://vapp-updates.vmware.com/vai-catalog/valm/vmw/647ee3fc-e6c6-4b06-9dc2-f295d12d135c/6.0.0.10200.latest/”
    $REPO_NAME=”VCSA”
    $MANIFEST_FILES=(“manifest-latest.xml”,”manifest-latest.xml.sign”,”manifest-repo.xml”)
    if(!(Test-Path -Path “.\VCSA”))
    {
    New-Item -Path “.\” -ItemType Directory -Confirm:$false -Force:$true -Name VCSA
    }
    if(!(Test-Path -Path “.\VCSA\manifest”))
    {
    New-Item -Path “.\VCSA\” -ItemType Directory -Confirm:$false -Force:$true -Name manifest
    }
    if(!(Test-Path -Path “.\VCSA\package-pool”))
    {
    New-Item -Path “.\VCSA\” -ItemType Directory -Confirm:$false -Force:$true -Name package-pool
    }

    foreach($MANIFEST_FILE in $MANIFEST_FILES)
    {
    Write-Host “Downloading $MANIFEST_FILE”
    Invoke-WebRequest $REPO_URL/manifest/$MANIFEST_FILE -OutFile “.\VCSA\manifest\$MANIFEST_FILE”
    }

    $locations = ([xml](Get-Content “.\VCSA\manifest\manifest-latest.xml”)).DocumentElement.packageGroups.group.package.location

    foreach($file in (([xml](Get-Content “.\VCSA\manifest\manifest-latest.xml”)).DocumentElement.packageGroups.group.package.location))
    {
    $filename = $file.Substring(14)
    Write-Host “Downloading $REPO_URL$filename”
    Invoke-WebRequest -Uri $REPO_URL/package-pool/$filename -OutFile (“.\VCSA\package-pool\$filename”).Trim().ToString()

    }

Thanks for the comment!