#cloud-config

write_files:
  - path: /etc/systemd/system/docker.service.d/increase-ulimit.conf
    owner: core:core
    permissions: 0644
    content: |
      [Service]
      LimitMEMLOCK=infinity
  - path: /etc/ntp.conf
    content: |
      # Common pool
      server 0.pool.ntp.org
      server 1.pool.ntp.org

      # - Allow only time queries, at a limited rate.
      # - Allow all local queries (IPv4, IPv6)
      restrict default nomodify nopeer noquery limited kod
      restrict 127.0.0.1
      restrict [::1]
coreos:
  etcd:
    # generate a new token for each unique cluster from https://discovery.etcd.io/new
    discovery: https://discovery.etcd.io/xxxxxxxx
    # multi-region and multi-cloud deployments need to use $public_ipv4
    addr: $private_ipv4:4001
    peer-addr: $private_ipv4:7001
  units:
    - name: format-ephemeral.service
      command: start
      content: |
        [Unit]
        Description=Formats the ephemeral drive
        [Service]
        Type=oneshot
        RemainAfterExit=yes
        ExecStart=/usr/sbin/wipefs -f /dev/xvdf
        ExecStart=/usr/sbin/mkfs.btrfs -f /dev/xvdf
    - name: var-lib-docker.mount
      command: start
      content: |
        [Unit]
        Description=Mount ephemeral to /var/lib/docker
        Requires=format-ephemeral.service
        After=format-ephemeral.service
        Before=docker.service
        [Mount]
        What=/dev/xvdf
        Where=/var/lib/docker
        Type=btrfs
    - name: settimezone.service
      command: start
      content: |
        [Unit]
        Description=Set the timezone

        [Service]
        ExecStart=/usr/bin/timedatectl set-timezone Europe/Brussels
        RemainAfterExit=yes
        Type=oneshot
    - name: etcd.service
      command: start
    - name: fleet.service
      command: start
    - name: docker-tcp.socket
      command: start
      enable: yes
      content: |
        [Unit]
        Description=Docker Socket for the API

        [Socket]
        ListenStream=127.0.0.1:2375
        BindIPv6Only=both
        Service=docker.service

        [Install]
        WantedBy=sockets.target
    - name: enable-docker-tcp.service
      command: start
      content: |
        [Unit]
        Description=Enable the Docker Socket for the API

        [Service]
        Type=oneshot
        ExecStart=/usr/bin/systemctl enable docker-tcp.socket
    - name: consul.service
      content: |
        [Unit]
        Description=Consul
        After=fleet.service docker.service
        Requires=docker.service

        [Service]
        TimeoutStartSec=0
        EnvironmentFile=/etc/environment
        ExecStartPre=-/usr/bin/docker kill consul
        ExecStartPre=-/usr/bin/docker rm consul
        ExecStartPre=/usr/bin/docker pull progrium/consul
        ExecStartPre=-/usr/bin/etcdctl mk /consul $COREOS_PRIVATE_IPV4
        ExecStart=/bin/bash -c " \
         /usr/bin/docker run \
         --rm --name consul \
         -h %H \
         -p ${COREOS_PRIVATE_IPV4}:8300:8300 \
         -p ${COREOS_PRIVATE_IPV4}:8301:8301 \
         -p ${COREOS_PRIVATE_IPV4}:8301:8301/udp \
         -p ${COREOS_PRIVATE_IPV4}:8302:8302 \
         -p ${COREOS_PRIVATE_IPV4}:8302:8302/udp \
         -p ${COREOS_PRIVATE_IPV4}:8400:8400 \
         -p ${COREOS_PRIVATE_IPV4}:8500:8500 \
         -p $(/usr/bin/ip -f inet addr show docker0 | grep inet | /usr/bin/cut -d ' ' -f 6 | /usr/bin/cut -d '/' -f 1):53:53/udp \
         progrium/consul \
         -server \
         -bootstrap-expect 2 \
         -advertise ${COREOS_PRIVATE_IPV4}"
        ExecStop=/usr/bin/docker kill consul
 
        [Install]
        WantedBy=multi-user.target
    - name: consul-discovery.service
      command: start
      enable: true
      content: |
        [Unit]
        Description=Consul Discovery
        BindsTo=consul.service
        After=consul.service

        [Service]
        EnvironmentFile=/etc/environment
        ExecStart=/bin/bash -c " \
          while true; \
          do etcdctl mk /services/consul $COREOS_PRIVATE_IPV4 --ttl 60; \
          /usr/bin/docker exec consul consul join $(etcdctl get /services/consul); \
          sleep 45 \
          ;done"
        ExecStop=/usr/bin/etcdctl rm /services/consul --with-value %H

    - name: registrator.service
      command: start
      enable: true
      content: |
        [Unit]
        Description=Registrator
        After=consul.service
        Requires=consul.service
 
        [Service]
        TimeoutStartSec=0
        Restart=always
        EnvironmentFile=/etc/environment
        ExecStartPre=-/usr/bin/docker kill registrator
        ExecStartPre=-/usr/bin/docker rm registrator
        ExecStartPre=/usr/bin/docker gliderlabs/registrator
        ExecStart=/usr/bin/docker run \
          --name registrator \
          -h %H \
          -v /var/run/docker.sock:/tmp/docker.sock \
          --link consul:consul \
          gliderlabs/registrator \
          consul://consul:8500
        ExecStop=/usr/bin/docker kill registrator
 
        [Install]
        WantedBy=multi-user.target
    - name: ambassadord.service
      command: start
      enable: true
      content: |
        [Unit]
        Description=Ambassadord in Omni Mode
        After=consul.service
        Requires=consul.service
 
        [Service]
        TimeoutStartSec=0
        Restart=always
        EnvironmentFile=/etc/environment
        ExecStartPre=-/usr/bin/docker kill backends
        ExecStartPre=-/usr/bin/docker rm backends
        ExecStartPre=/usr/bin/docker pull progrium/ambassadord
        ExecStart=/usr/bin/docker run \
          --name backends \
          -h %H \
          -v /var/run/docker.sock:/var/run/docker.sock \
          progrium/ambassadord \
          --omnimode
        ExecStartPost=/usr/bin/docker run \
          --rm \
          --privileged \
          --net container:backends \
          progrium/ambassadord \
          --setup-iptables
        ExecStop=/usr/bin/docker kill backends
 
        [Install]
        WantedBy=multi-user.target