Skip to content

Ansible Role linuxfabrik.lfops.exoscale_vm

This role creates and manages instances (virtual machines) on Exoscale. It also allows creating other compontents for the instance, such as networks and firewall rules.

Known Limitations

  • Resizing / scaling of instances is currently not supported

Mandatory Requirements

  • Install the exo command line tool and configure your Exoscale account using exo config on the Ansible control node.
  • Install the python3-cs library on the Ansible control node.
  • Import your public SSH-key into Exoscale (here). Ideally, set the key name to your local username, then you can use the default value for exoscale_vm__ssh_key.

Tags

exoscale_vm

  • Creates and manages the instance.
  • Triggers: none.

exoscale_vm:firewalls

  • Manage the provider firewalls of the host.
  • Triggers: none.

exoscale_vm:networks

  • Manage the provider private networks.
  • Triggers: none.

Mandatory Role Variables

exoscale_vm__account

  • The name of the Exoscale account name as configured during exo config. Can be found in ~/.config/exoscale/exoscale.toml afterwards.
  • Type: String.

exoscale_vm__api_key

  • Set the Exoscale API key. API keys can be managed here. We recommend creating a unrestricted key, because else some operations fail.
  • Type: String.

exoscale_vm__api_secret

  • Set the Exoscale secret corresponding to the API key.
  • Type: String.

exoscale_vm__service_offering

  • The Exoscale service offering. This defines the amount of CPU cores, RAM and disk space. The possible options can be obtained using exo compute instance-type list --verbose. Note that these changes will only be applied to stopped instances.
  • Type: String.

exoscale_vm__template

  • The Exoscale template for the instance. The possible options can be obtained using exo compute instance-template list. Note that you have to use the ID instead of the name when referencing custom templates.
  • Type: String.

exoscale_vm__zone

  • The Exoscale zone the instance should be in. The possible options can be obtained using exo zone list.
  • Type: String.

Example:

# mandatory
exoscale_vm__account: 'example'
exoscale_vm__api_key: 'EXOtn4Rg5ooosUALc1uNTqVTyTd'
exoscale_vm__api_secret: '4Is7jmDfzCONfJtEfxqX1VePSK9p7iZLafJy9ItC'
exoscale_vm__service_offering: 'standard.tiny'
exoscale_vm__template: 'Rocky Linux 8 (Green Obsidian) 64-bit'
exoscale_vm__zone: 'ch-dk-2'

Optional Role Variables

exoscale_vm__disk_size

  • The disk size in GBs. Must be greater than 10. Note that adjusting the disk size is not currently supported.
  • Type: Number.
  • Default: 10

exoscale_vm__name

  • The name of the instance. By default, the Ansible inventory name prefixed with e is used, as it has to start with a letter.
  • Type: String.
  • Default: 'e{{ inventory_hostname }}'

exoscale_vm__private_instance

  • Choose if the instance should be "private" without a public IP, or not.
  • Type: Bool.
  • Default: true

exoscale_vm__private_networks

  • A list of dictionaries defining which networks should be attached to this instance. It also allows the creation of new internal networks, or setting a fixed IP for the instance.
  • Type: List of dictionaries.
  • Default: []

  • Subkeys:

    • name:

      • Mandatory. The name of an existing network, or the network which should be created.
      • Type: String.
    • cidr:

      • Optional. If this is given, a new network with this cidr is created.
      • Type: String.
    • fixed_ip:

      • Optional. The fixed IP of this instance. This can be used for attach to an existing network, or when creating a new one.
      • Type: String.

exoscale_vm__security_group_rules

  • A list of dictionaries containing rules for the security group (basically Exoscale firewall rules).
  • Type: List of dictionaries.
  • Default: unset

  • Subkeys:

    • cidr:

      • Optional. CIDR to be used for security group rule.
      • Type: String.
    • protocol:

      • Mandatory. To which IP protocol the rule is applied. Possible options: tcp, udp, icmp.
      • Type: String.
    • start_port:

      • Mandatory. The starting port.
      • Type: Number.
    • end_port:

      • Mandatory. The ending port.
      • Type: Number.
    • state:

      • Optional. State of the rule. Either absent or present.
      • Type: String.
      • Default: 'present'
    • type:

      • Mandatory. For which direction the rule should apply. Possible options: ingress, egress.
      • Type: String.

exoscale_vm__ssh_key

  • The name of the SSH-key deposited in Exoscale here. Defaults to using the local username of the Ansible control node.
  • Type: String.
  • Default: '{{ lookup("env", "USER") }}'

exoscale_vm__state

  • The state of the instance. Possible options: deployed, started, stopped, restarted, restored, destroyed, expunged, present, absent.
  • Type: String.
  • Default: 'started'

exoscale_vm__template_visibility

  • Visibility of the Exoscale template for the instance. Usually 'private' for custom templates.
  • Type: String.
  • Default: 'public'

Example:

# optional
exoscale_vm__disk_size: 10
exoscale_vm__name: '{{ inventory_hostname }}'
exoscale_vm__private_instance: false
exoscale_vm__private_networks:
  - name: 'net-prod01'
    cidr: '192.0.2.0/24'
    fixed_ip: '192.0.2.1'
exoscale_vm__security_group_rules:
  - type: 'ingress'
    protocol: 'tcp'
    start_port: 22
    end_port: 22
exoscale_vm__ssh_key: '{{ lookup("env", "USER") }}'
exoscale_vm__state: 'started'
exoscale_vm__template_visibility: 'private'

License

The Unlicense

Author Information

Linuxfabrik GmbH, Zurich