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



users:

- default

- name: shaner

ssh_import_id: shaner

lock_passwd: false

sudo: \"ALL=(ALL) NOPASSWD:ALL\"

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

