SmartOS provides the ability to inject cloud-init data into a zone/VM. This is extremely useful for automating some of the menial tasks one would normally have to perform manually like setting up users, installing packages, or pulling down a git repo. Basically, anything you can stuff into cloud-init user-data is at your disposal.
However, since SmartOS zone definitions are in JSON and cloud-init data is in yaml, it’s not immediately obvious how to supply this information. What it boils down to is, escape all double-quotes (“) and line-feeds.
Here’s our cloud-init config which creates a new user and import their ssh key from launchpad.net.
#cloud-config
users:
- default
- name: shaner
ssh_import_id: shaner
lock_passwd: false
sudo: "ALL=(ALL) NOPASSWD:ALL"
shell: /bin/bash
So following the above escape rules above, here’s our full SmartOS zone spec, including the cloud-init data. Note the cloud-init:user-data key.
{
"brand": "kvm",
"alias": "ubuntu-xenial",
"ram": "2048",
"vcpus": "2",
"resolvers": [
"192.168.1.1",
"1.1.1.1"
],
"nics": [
{
"nic_tag": "admin",
"ip": "192.168.1.50",
"netmask": "255.255.255.0",
"gateway": "192.168.1.1",
"model": "virtio",
"primary": true
}
],
"disks": [
{
"image_uuid": "429bf9f2-bb55-4c6f-97eb-046fa905dd03",
"boot": true,
"model": "virtio"
}
],
"customer_metadata": {
"cloud-init:user-data": "#cloud-config\n\nusers:\n - default\n - name: shaner\n ssh_import_id: shaner\n lock_passwd: false\n sudo: \"ALL=(ALL) NOPASSWD:ALL\"\n shell: /bin/bash"
}
}
Let’s go ahead and create the zone on our SmartOS box.
[root@vmm01 /opt/templates]# vmadm create < ubuntu-xenial.json
Successfully created VM 0e908925-600a-4365-f161-b3a51467dc08
[root@vmm01 /opt/templates]# vmadm list
UUID TYPE RAM STATE ALIAS
0e908925-600a-4365-f161-b3a51467dc08 KVM 2048 running ubuntu-xenial
After a bit of time, we can try logging in as our new user we requested. Recall, we asked cloud-init to pull in our public ssh key from launchpad so, if you get prompted for a password, something is wrong.
shaner@tp25:~$ ssh 192.168.1.50
The authenticity of host '192.168.1.50 (192.168.1.50)' can't be established.
ECDSA key fingerprint is SHA256:hFPjwUJjd7N/Gb9EE37fTVt2Lk6NVzoLKvhFN7wYw2M.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.50' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-116-generic x86_64)
Certified Ubuntu Cloud Image
__ . .
_| |_ | .-. . . .-. :--. |-
|_ _| ;| || |(.-' | | |
|__| `--' `-' `;-| `-' ' ' `-'
/ ; Instance (Ubuntu 16.04.3 LTS 20180222)
`-' https://docs.joyent.com/images/linux/ubuntu-certified
http://www.ubuntu.com/cloud#joyent
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
Get cloud support with Ubuntu Advantage Cloud Guest:
http://www.ubuntu.com/business/services/cloud
0 packages can be updated.
0 updates are security updates.
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
shaner@0b8d7a26-ffe4-e859-eb56-d96d02bf213e:~$ sudo ls
shaner@0b8d7a26-ffe4-e859-eb56-d96d02bf213e:~$ sudo apt-update && sudo apt-upgrade -y
There’s a LOT you can do with cloud-init data. See the below links for more info.
Cloud-init examples: https://cloudinit.readthedocs.io/en/latest/topics/examples.html
Joyent Datasource: https://github.com/number5/cloud-init/blob/master/cloudinit/sources/DataSourceSmartOS.py
Joyent Ubuntu Image documentation: https://docs.joyent.com/public-cloud/instances/virtual-machines/images/linux/ubuntu-certified
Leave a Reply
You must be logged in to post a comment.