Skip to content
Go to file


Dynamic inventory and modules for managing servers via UpCloud's API

The inventory script and modules contain documentation and examples as per Ansible's developer guidelines. There is an open PR for the inventory script to be included within Ansible and the plan is to open a PR for the modules to ansible-modules-extra

Dependencies and supported versions

  • upcloud-api>=0.3.4 must be installed, pip install upcloud-api or get the sources from Github
  • python 2.6 and 2.7 are supported by upcloud-api
  • tested with ansible 1.9, 2.0 and all the way to 2.8.4.
  • It should work with whatever is the newest version of ansible, if not, please create an issue about it.

Note for OS X users:

  • install ansible with homebrew can make it hard to know what Python ansible is using, using pip install ansible is recommended

Inventory script


  • move to any location you wish, point to the script with ansible -i /path/to/script/
  • note that upcloud.ini and must be in the same folder; see .ini for settings
  • you may wish to use return_ip_addresses = True in .ini to ensure that SSH works (hostnames may not be in DNS)
  • information on configuring the inventory without specifying -i every time:
  • Define upcloud api user and password in the .ini file or in env variables.
  • Default timeout is defined either in the .ini file or as env variable. (default is 300s)


# match all servers
ansible all -m ping -i /path/to/

# match all servers from upcloud inventory script
ansible uc-all -m ping -i /path/to/

# inventory group servers by upcloud Tags
ansible <any-upcloud-tag> -m <module> -i <path-to-upcloud-inventory>

UpCloud modules


  • move the modules to a location of your choice
  • make sure to add the location of your choice into library path:
  • ...or provide module path when invoking ansible:
    • ansible-playbook -M /path/to/modules/dir playbook.yml


# you can specify inventory and Modules pathes via cli
ansible-playbook create-servers.yml -i /path/to/ -M /path/to/upcloud/modules

See the source files for documentation and examples. You may also want to refer to UpCloud's API documentation

The following example shows off some of the features of upcloud, upcloud_tag and upcloud_firewall modules:

- hosts: localhost
  connection: local
  serial: 1
  gather_facts: no

    - name: Create upcloud server
        state: present
        zone: uk-lon1
        plan: 1xCPU-1GB
            - { size: 30, os: Ubuntu 14.04 }
            - { size: 100 }
        user: upclouduser
            - ssh-rsa AAAAB3NzaC1yc2EAA[...]ptshi44x
            - ssh-dss AAAAB3NzaC1kc3MAA[...]VHRzAA==
      register: upcloud_server # upcloud_server.server will contain the API response body

    # upcloud_server.public_ip shortcut will contain a public IPv4 (preferred) or IPv6 address
    # this task is not needed if host_key_checking=False in ansible
    - name: remove new server from known_hosts in case of IP collision
        state: absent
        host: "{{ upcloud_server.public_ip }}"

    - name: Wait for SSH to come up
      wait_for: host={{ upcloud_server.public_ip }} port=22 delay=5 timeout=320 state=started

    - name: tag the created server
        state: present
        uuid: "{{ upcloud_server.server.uuid }}"
        tags: [ webservers, london ]

    - name: configure firewall
        state: present
        uuid: "{{ upcloud_server.server.uuid }}"
        - direction: in
          family: IPv4
          protocol: udp
          destination_port_start: 53
          destination_port_end: 53
          action: accept

        - direction: in
          family: IPv4
          protocol: tcp
          destination_port_start: 22
          destination_port_end: 22
          action: accept

        - direction: in
          family: IPv4
          protocol: tcp
          destination_port_start: 80
          destination_port_end: 80
          action: accept

        - direction: in
          family: IPv4
          protocol: tcp
          destination_port_start: 443
          destination_port_end: 443
          action: accept

        # default rule last:
        - direction: in
          action: reject


Dynamic inventory and modules for managing servers via UpCloud's API




No releases published


No packages published


You can’t perform that action at this time.