Quick-start tutorial with LXD - cloud-init 25.1.2 documentation (original) (raw)
Toggle table of contents sidebar
In this tutorial, we will create our first cloud-init user-data script and deploy it into a LXD container.
Why LXD?¶
We’ll be using LXD for this tutorial because it provides first class support for cloud-init user-data, as well as systemd
support. Because it is container based, it allows us to quickly test and iterate upon our user-data definition.
Install and initialize LXD¶
If you already have LXD set up, you can skip this section. Otherwise, let’s install LXD:
If you don’t have snap, you can install LXD using one of theother installation options.
Now we need to initialize LXD. The minimal configuration will be enough for the purposes of this tutorial. If you need to, you can always change the configuration at a later time.
Define our user-data¶
Now that LXD is set up, we can define our user-data. Create a file on your local filesystem at /tmp/my-user-data
and populate it with this content:
#cloud-config runcmd:
- echo 'Hello, World!' > /var/tmp/hello-world.txt
Here, we are defining our cloud-init user-data in the#cloud-config format, using theruncmd module to define a command to run. When applied, it will write Hello, World!
to /var/tmp/hello-world.txt
(as we shall see later!).
Launch a LXD container with our user-data¶
Now that we have LXD set up and our user-data defined, we can launch an instance with our user-data:
$ lxc launch ubuntu:focal my-test --config=user.user-data="$(cat /tmp/my-user-data)"
Verify that cloud-init ran successfully¶
After launching the container, we should be able to connect to our instance using:
You should now be in a shell inside the LXD instance.
Before validating the user-data, let’s wait for cloud-init to complete successfully:
$ cloud-init status --wait
Which provides the following output:
Verify our user-data¶
Now we know that cloud-init ran successfully, we can verify that it received the expected user-data we provided earlier:
$ cloud-init query userdata
Which should print the following to the terminal window:
#cloud-config runcmd:
- echo 'Hello, World!' > /var/tmp/hello-world.txt
We can also assert the user-data we provided is a valid cloud-config:
$ cloud-init schema --system --annotate
Which should print the following:
Finally, let us verify that our user-data was applied successfully:
$ cat /var/tmp/hello-world.txt
Which should then print:
We can see that cloud-init has received and consumed our user-data successfully!
Completion and next steps¶
Exit the container shell (by typing exit or pressing Ctrl-D). Once we have exited the container, we can stop the container using:
We can then remove the container completely using:
In this tutorial, we used the runcmd module to execute a shell command. The full list of modules available can be found in ourmodules documentation. Each module contains examples of how to use it.
You can also head over to the examples page for examples of more common use cases.