---
title: "Bootstrap your instances with CloudInit and User Data"
date: 2013-07-02
tags: ["user-data","cloud-init","automation"]
url: https://www.exoscale.com/blog/userdata-support/
---
# Bootstrap your instances with CloudInit and User Data

User-data is now a commonly used format to make an instance do stuff while it boots. It consist of a file that is served to a booting instance and includes actions and blobs of data. It can be passed to the instance in either raw text or separate, optionally compressed part files.

We have made it pretty easy to manage and edit your user-data on Exoscale with a new tab in our instance creation box:

![user-data form](https://www.exoscale.com/blog/userdata-support/userdata.png)

User-data is tightly linked to cloud-init, a package which handles the post boot process of an instance. Exoscale already uses cloud-init in order to set up your SSH keys and to apply a matching hostname toe the instance.


### make sure your instance is up to date on boot up

Would it not be nice to make sure that the new instance you create is up to date with the very latest packages and fixes for the official repositories? This is possible with cloud-init and a simple YAML configuration statement. Cloud-init understands several pragmas: upstart job, script, part handler, include file, and config. With the later option, you can access all cloud-init syntax by using a simple #cloud-config in your user-data file attached to the instance.
On an Ubuntu machine this will look like:

    #cloud-config
    apt_upgrade: true

When the machine boots, it will call cloud-init, which in turn will query Exoscale CloudStack user-data and start reading the configuration. Because the "apt_upgrade" is defined the cloud-config handler, it will call the code attached and eventually make an "apt-get upgrade" call.

### run a script to create a user and group

As explain in the first usage example, a script handler also exist in cloud-init. Therefore, anything after the standard " #!" will be interpreted as a user  script.

    #!/bin/sh
    groupadd mygroup
    useradd –D user1 –G mygroup



__Note:__  _a cloud-config class exists for user and group management directly. Just use the groups and users definitions:_

    #cloud-config
    groups:
        - mygroup: [user1, user2]
    users:
        - name: user1
        - primary-group: user1
        - groups: mygroup

### bootstrap your Puppet configuration management system

If you dive in the cloud-config handler, you will also find necessary method for inserting your instance right into your configuration management system. One of the most popular ones being [Puppet](https://puppet.com/community/), a simple definition like below will configure your instance as a puppet agent and puppet will run against the master specified. Therefore, you can achieve packages installation, user creation and more in a reusable fashion.

    #cloud-config
    puppet:
    conf:
        agent:
        server: puppetmaster.mydomain.org
        certname:Nodename.mydomain.org

### Conclusion

To get further, you should also leverage TAGS, but this will be another article.

There are almost endless possibilities and integration ideas with cloud init, and the [official documentation](https://cloudinit.readthedocs.io/en/latest/) is a good place to start. There are lots of [examples](https://cloudinit.readthedocs.io/en/latest/topics/examples.html) ranging from mount points to integration with [Chef](https://docs.chef.io/index.html).

