Page cover

Cloud-init

Cloud-init scripts let you optionally automate the initialization of virtual machines.

Setting a cloud-init script

To set a cloud-init script, click on the "Click for more advanced options" green link when deploying your virtual machine.

Click on the "Click for more advanced options" green link to show this textarea

This is the default cloudinit configuration we pass to the hypervisor:

The script that you provide simply gets appended to the end of this file.

Examples

Example 1: Preventing the automatic update of NVIDIA drivers

NVIDIA drivers autoupdate on the first boot. Once this happens, they become unusable. By including this cloud-init script, you'll lock the NVIDIA driver versions so that they do not autoupdate

Objectives

  • Write a file using cloud-init write_files in base64 encoding that uses apt-mark to hold NVIDIA packages from being automatically updated

    • The file will have the following contents: dpkg-query -W --showformat='${Package} ${Status}\n' | grep -v deinstall | awk '{ print $1 }' | grep -E 'nvidia.*-[0-9]+$' | xargs -r -L 1 apt-mark hold

  • Run a file

This is the source of the script included

Process

We'll set this as our cloud-init script:

Debrief

Explanation:

  • First, our server will write the new file, prevent_update.sh, in the user's new tensordock_scripts directory

  • Then, our server run this file, locking in our NVIDIA driver versions to prevent autoupdates

Example 2: Hosting a website with Apache2

Objectives

  • Install a package through cloud-init packages

  • Write a file using cloud-init write_files in plaintext

Process

By default, the Apache2 webserver listens on port 80. As such, we'll first forward an external port into that internal port.

Because Apache listens on port 80, you'll want to forward an external port into that internal port

Then, we'll set this as our cloud-init script:

Debrief

Explanation:

  • First, our server will install the apache2 package

  • Then, our server will overwrite the we create an index.html file with the custom HTML we've defined

Now, let's try accessing our web server!

Woohoo! It works!

Example 3: Hosting a simple Docker container

Objectives

  • Host a simple Docker container through the Docker CLI

Process

For networking, we forward an external port into an internal port in the virtual machine. Then, a Docker container forwards a virtual machine's port into its own internal network.

By default, the NGINX webserver listens on port 80 within the Docker container, but we can have the Docker container listen on any port. As such, we'll first forward an external port (e.g. 20018) into itself.

We'll forward an external port into an internal port on the virtual machine

Then, we'll set this as our cloud-init script:

Debrief

Explanation:

  • First, our server will write a file to a new directory containing our custom HTML

  • Then, our server will run a Docker container that passes through the directory of our HTML page into the NGINX contiainer

  • When users access the external port 20018, our hypervisor forwards that to the virtual machine's port 20018, and then Docker forwards that to the NGINX container on port 80

Now, let's try accessing our web server!

Woohoo! It works!

Last updated

Was this helpful?