NSX Manager as an Azure VM

Much like running a vCenter Server in an Azure VM I decided to try NSX Manager. Pretty much had the same experience except that NSX reads it’s configuration from a file: /config/guestinfo. This file is a dump from vmtoolsd --cmd "info-get guestinfo". The file looks something like:

<?xml version="1.0" encoding="UTF-8"?>
<Environment
xmlns="http://schemas.dmtf.org/ovf/environment/1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:oe="http://schemas.dmtf.org/ovf/environment/1"
xmlns:ve="http://www.vmware.com/schema/ovfenv"
oe:id=""
ve:vCenterId="">
<PropertySection>
<Property oe:key="extraPara" oe:value=""/>
<Property oe:key="mpClusterId" oe:value=""/>
<Property oe:key="mpIp" oe:value=""/>
<Property oe:key="mpNodeId" oe:value=""/>
<Property oe:key="mpThumbprint" oe:value=""/>
<Property oe:key="mpToken" oe:value=""/>
<Property oe:key="nsx_allowSSHRootLogin" oe:value="False"/>
<Property oe:key="nsx_cli_audit_passwd_0" oe:value=""/>
<Property oe:key="nsx_cli_audit_username" oe:value=""/>
<Property oe:key="nsx_cli_passwd_0" oe:value=""/>
<Property oe:key="nsx_cli_username" oe:value=""/>
<Property oe:key="nsx_dns1_0" oe:value=""/>
<Property oe:key="nsx_domain_0" oe:value=""/>
<Property oe:key="nsx_gateway_0" oe:value=""/>
<Property oe:key="nsx_hostname" oe:value=""/>
<Property oe:key="nsx_ip_0" oe:value=""/>
<Property oe:key="nsx_isSSHEnabled" oe:value="True"/>
<Property oe:key="nsx_netmask_0" oe:value=""/>
<Property oe:key="nsx_ntp_0" oe:value=""/>
<Property oe:key="nsx_passwd_0" oe:value=""/>
<Property oe:key="nsx_role" oe:value="NSX Manager"/>
</PropertySection>
</Environment>

Same type of script to build the disks as with vCenter:


modprobe nbd
cd /mnt
tar -xf nsx-unified-appliance-4.1.2.1.0.22667794.ova
qemu-img convert -f vmdk -O raw nsx-unified-appliance.vmdk nsx-unified-appliance.raw
qemu-img convert -f vmdk -O raw nsx-unified-appliance-secondary.vmdk nsx-unified-appliance-secondary.raw
qemu-nbd -f raw -c /dev/nbd0 nsx-unified-appliance.raw
pvscan
lvscan
mkdir config
mkdir os
mount /dev/nsx/config ./config
mount /dev/nbd0p2 ./os


cat << EOF > ./config/guestinfo
<?xml version="1.0" encoding="UTF-8"?>
<Environment
xmlns="http://schemas.dmtf.org/ovf/environment/1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:oe="http://schemas.dmtf.org/ovf/environment/1"
xmlns:ve="http://www.vmware.com/schema/ovfenv"
oe:id=""
ve:vCenterId="">
<PropertySection>
<Property oe:key="extraPara" oe:value=""/>
<Property oe:key="mpClusterId" oe:value=""/>
<Property oe:key="mpIp" oe:value=""/>
<Property oe:key="mpNodeId" oe:value=""/>
<Property oe:key="mpThumbprint" oe:value=""/>
<Property oe:key="mpToken" oe:value=""/>
<Property oe:key="nsx_allowSSHRootLogin" oe:value="False"/>
<Property oe:key="nsx_cli_audit_passwd_0" oe:value=""/>
<Property oe:key="nsx_cli_audit_username" oe:value=""/>
<Property oe:key="nsx_cli_passwd_0" oe:value="******"/>
<Property oe:key="nsx_cli_username" oe:value="admin"/>
<Property oe:key="nsx_dns1_0" oe:value=""/>
<Property oe:key="nsx_domain_0" oe:value=""/>
<Property oe:key="nsx_gateway_0" oe:value=""/>
<Property oe:key="nsx_hostname" oe:value="<HOSTNAME>"/>
<Property oe:key="nsx_ip_0" oe:value=""/>
<Property oe:key="nsx_isSSHEnabled" oe:value="True"/>
<Property oe:key="nsx_netmask_0" oe:value=""/>
<Property oe:key="nsx_ntp_0" oe:value=""/>
<Property oe:key="nsx_passwd_0" oe:value="****"/>
<Property oe:key="nsx_role" oe:value="NSX Manager"/>
</PropertySection>
</Environment>
EOF

cd ./os/tmp
git clone https://github.com/Azure/WALinuxAgent
cd ../..
chroot ./os /bin/bash <<"EOT"
echo "root:*****" | chpasswd
echo "admin:*****" | chpasswd
systemctl enable ssh
cd /tmp/WALinuxAgent
python setup.py install
systemctl enable walinuxagent
sed -i 's/Provisioning.Agent=auto/Provisioning.Agent=disabled/g' /etc/waagent.conf
EOT


umount ./config
umount ./os
qemu-nbd -d /dev/nbd0


MB=$((1024*1024))
size=$(qemu-img info -f raw --output json nsx-unified-appliance.raw | gawk 'match($0, /"virtual-size": ([0-9]+),/, val) {print val[1]}')
rounded_size=$(((($size+$MB-1)/$MB)*$MB))
qemu-img resize -f raw nsx-unified-appliance.raw $rounded_size
qemu-img convert -f raw -O vpc -o subformat=fixed,force_size nsx-unified-appliance.raw nsx-unified-appliance.vhd
rm nsx-unified-appliance.raw

MB=$((1024*1024))
size=$(qemu-img info -f raw --output json nsx-unified-appliance-secondary.raw | gawk 'match($0, /"virtual-size": ([0-9]+),/, val) {print val[1]}')
rounded_size=$(((($size+$MB-1)/$MB)*$MB))
qemu-img resize -f raw nsx-unified-appliance-secondary.raw $rounded_size
qemu-img convert -f raw -O vpc -o subformat=fixed,force_size nsx-unified-appliance-secondary.raw nsx-unified-appliance-secondary.vhd
rm nsx-unified-appliance-secondary.raw

Same deal as with vCenter. Upload the vhds to a storage account and build a vm:

subscription_id=<subscription_id>
virtualMachineName=<new_vm_name>
resourceGroupName=<resource_group_name>
vnetName=<vnet_name>
subnetName=<subnet_name>
osType=linux
osDisk=<url for disk 1>
seconDisk=<url for disk 1>
az account set --subscription $subscription_id

az disk create --resource-group $resourceGroupName --name nsx_0_blob --location $location --size-gb 201 --source $osDisk
az disk create --resource-group $resourceGroupName --name nsx_1_blob --location $location --size-gb 101 --source $secondDisk
managedDiskId0=/subscriptions/$subscription_id/resourceGroups/$resourceGroupName/providers/Microsoft.Compute/disks/nsx_0_blob
managedDiskId1=/subscriptions/$subscription_id/resourceGroups/$resourceGroupName/providers/Microsoft.Compute/disks/nsx_1_blob

vm create --name $virtualMachineName --resource-group $resourceGroupName --attach-os-disk $managedDiskId0 --os-type $osType --attach-data-disks $managedDiskId1 --size Standard_D16ls_v5 --vnet-name $vnetName --subnet $subnetName --public-ip-address ""

Wait for the VM to finish booting and NSX will be up and running. I haven’t tried putting three nodes behind a load balancer but I assume it would work. Of course YMMV and Broadcom doesn’t support this.

Leave a comment