Your submission was sent successfully! Close

Jump to main content
  1. Blog
  2. Article

Scott Moser
on 11 December 2014

Snappy Ubuntu Core was announced this week.  In yesterday’s blog post (Snappy Ubuntu Core and uvtool) I showed how you can use uvtool to create and manage snappy instances.

Now that we’ve got that covered, let’s look deeper into a very cool feature – the ability to customize the instance and automate its startup and configuration.  For example, at instance creation time you can specify a snappy application to be installed.  cloud-init is what allows you to do this, and it is installed inside the Snappy image. cloud-init receives this information from the user in the form of ‘user-data’.

One of the formats that can be fed to cloud-init is called ‘cloud-config’.  cloud-config is yaml formatted data that is interpreted and acted on by cloud-init.  For Snappy, we’ve added a couple specific configuration values.  Those are included under the top level ‘snappy’.

  • ssh_enabled: determines if ‘ssh’ service is started or not.  By default ssh is not enabled.
  • packages: A list of snappy packages to install on first boot.  Items in this list are snappy package names.

When running inside snappy, cloud-init still provides many of the features it provides on traditional instances.  Some useful configuration entries:

  • runcmd: A list of commands run after boot has been completed. Commands are run as root. Each entry in the list can be a string or a list.  If the entry is a string, it is interpreted by ‘sh’.  If it is a list, it is executed as a command and arguments without shell interpretation.
  • ssh_authorized_keys: This is a list of strings.  Each key present will be put into the default user’s ssh authorized keys file.  Note that ssh authorized keys are also accepted via the cloud’s metadata service.
  • write_files: this allows you to write content to the filesystem.  The module is still expected to work, but the user will have to be aware that much of the filesystem is read-only. Specifically, writing to file system locations that are not writable is expected to fail.

Some cloud-init config modules are simply not going to work.  For example, traditional packages will not be installed by ‘apt’ as the root filesystem is read-only.

Example Cloud Config

Its always easiest to start from a working example.  Below is one that demonstrates the usage of the config options listed above.  Please note that user data intended to be consumed as cloud-config must contain the first line ‘#cloud-config‘.

      ssh_enabled: True
        – xkcd-webserver

     – content: |
        echo “==== Hello Snappy!  It is now $(date -R) ====”
       permissions: ‘0755’
       path: /writable/greet

     – /writable/greet | tee /run/hello.log

Launching with uvtool

Follow yesterday’s blog post to get a functional tool.  Then, save the example config file above to a file, and launch you’re instance with it.

$ uvt-kvm create –wait –add-user-data=my-config.yaml snappy1 release=devel

Our user-data instructed cloud-init to do a number of different things. First, it wrote a file via ‘write_files’ to a writable space on disk, and then executed that file with ‘runcmd’. Lets verify that was done:

$ uvt-kvm ssh snappy1 cat /run/hello.log
==== Hello Snappy!  It is now Thu, 11 Dec 2014 18:16:34 +0000 ====

It also instructed cloud-init to install the Snappy ‘xkcd-webserver’ application.
$ uvt-kvm ssh snappy1 snappy versions
Part            Tag   Installed  Available  Fingerprint     Active 
ubuntu-core     edge  141        –          7f068cb4fa876c  *      
xkcd-webserver  edge  0.3.1      –          3a9152b8bff494  *

There we can see that xkcd-webserver was installed, lets check that it is running:

$ uvt-kvm ip snappy1
$ wget -O – –quiet | grep <title>
<title>XKCD rocks!</title>

Launching on Azure

The same user-data listed above also works on Microsoft Azure.   Follow the instructions for setting up the azure command line tools, and then launch the instance with and provide the ‘–custom-data‘ flag.  A full command line might look like:
$ imgid=b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-core-devel-amd64-20141209-90-en-us-30GB
$ azure vm create snappy-test $imgid ubuntu \
  –location “North Europe” –no-ssh-password \
  –ssh-cert ~/.ssh/azure_pub.pem –ssh \

  –custom-data my-config.yaml

Have fun playing with cloud-init!

Related posts

Rajan Patel
13 September 2023

Deploy fully configured VMs in minutes on Google Cloud, using gcloud CLI and cloud-init

Cloud and server Article

Make reusable deployment templates for Landscape and other applications ...

6 July 2023

불변의 리눅스 데스크톱 기반으로서의 우분투 코어(Ubuntu Core)

Desktop Article

캐노니컬(Canonical)은 IoT를 위한 완전한 컨테이너 플랫폼을 만들기 위해 2014년에 우분투 코어 개발을 시작했습니다. 우분투 코어에서는 도커(Docker) 및 LXC가 구축된 것과 동일한 커널 컨테이너 기술을 사용하여 잘 정의된 업그레이드 및 롤백을 통해 시스템의 모든 구성 요소를 안전한 샌드박스에 넣습니다. 저희는 자율적으로 연결된 사물 인터넷 장치가 사람의 개입 없이 적용할 수 있는 업데이트를 수신하여 에지에서 보안 및 ...

Igor Ljubuncic
16 June 2023

Snapcraft 8.0 and the respectable end of core18

Ubuntu Article

‘E’s not pinin’! ‘E’s passed on! This base is no more! He has ceased to be! ‘E’s expired and gone to meet ‘is maker! ‘E’s a stiff! Bereft of life, ‘e rests in peace! If you hadn’t nailed ‘im to the perch ‘e’d be pushing up the daisies! ‘Is software processes are now ‘istory! ‘E’s ...