Library and Tool to run a Cloud-Init NoCloud compatible metadata server for VMWare VCenter
The application uses serial ports on virtual machines configured to use the network,
with the direction configured to client, the port uri configured to any string and the vSPC
URI configured to telnet://$ADDRESS:13370
vmw-cloudinit-metadata run --uri my-metadata --driver vmw_cloudinit_metadata.drivers.file:FileDriver --driver-opts '{"directory": "/some/directory/here"}'
The application can use various different drivers to load cloud-init metadata.
Custom drivers can be made by implementing the vmw_cloudinit_metadata.drivers.driver:Driver
interface.
The file dirver looks in the given path for yaml files with the name of the VM.
directory - path to yaml definition files
my-vm.yaml --- metadata: ami-id: my-image instance-id: my-instance region: us-east1 availability-zone: us-east1-a tags: - a - b - c public-keys: - ssh.... hostname: myhostnamehere network: address: 192.168.1.1 netmask: 255.255.255.0 gateway: 192.168.1.254 search: 'example.com' nameservers: - 8.8.8.8 - 8.8.4.4 userdata: | #cloud-config growpart: mode: auto devices: ['/'] ignore_growroot_disabled: false
All serial communication is done using "packets". All packets start with the string !!
followed the by packet code, then the symbol #
followed by base64 encoded data.
The data returned is compatible with Cloud-Init NoCloud
Client Sends
!!REQUEST_METADATA#
Server Response
!!RESPONSE_METADATA#ew0KICAgICJhbWktaWQiOiAibXktaW1hZ2UiLA0KICAgICJpbnN0YW5jZS1pZCI6ICJteS1pbnN0YW5jZSIsDQogICAgInJlZ2lvbiI6ICJteS1yZWdpb24iLA0KICAgICJhdmFpbGFiaWxpdHktem9uZSI6ICJteS16b25lIiwNCiAgICAidGFncyI6IFsiYSIsICJiIiwgImMiXSwNCiAgICAicHVibGljLWtleXMiOiBbDQogICAgICAgICJwdWJsaWMtc3NoLWtleS1oZXJlIg0KICAgIF0sDQogICAgImhvc3RuYW1lIjogIm15LWhvc3RuYW1lIiwNCiAgICAibG9jYWwtaG9zdG5hbWUiOiAibXktaG9zdG5hbWUiDQp9
After decoding the base64 data the response contains the following:
{ "ami-id": "my-image", "instance-id": "my-instance", "region": "my-region", "availability-zone": "my-zone", "tags": ["a", "b", "c"], "public-keys": [ "public-ssh-key-here" ], "hostname": "my-hostname", "local-hostname": "my-hostname" }
Client requests instance metadata
Client requests instance network data
Client requests instance user data
Server responds with instance metadata
Example:
{ "ami-id": "my-image", "instance-id": "my-instance", "region": "my-region", "availability-zone": "my-zone", "tags": ["a", "b", "c"], "public-keys": [ "public-ssh-key-here" ], "hostname": "my-hostname", "local-hostname": "my-hostname" }
Server responds with instance networkdata
Example:
version: 1 config: - type: physical name: eth0 subnets: - type: static address: 192.168.1.1 netmask: 255.255.255.0 gateway: 192.168.1.254 dns_search: - example.com dns_nameservers: - 8.8.8.8 - 8.8.4.4
Server responds with instance userdata
Example:
#cloud-config growpart: mode: auto devices: ['/'] ignore_growroot_disabled: false