class Hetzner::Server

Attributes

cluster_name[R]
hetzner_client[R]

Public Class Methods

new(hetzner_client:, cluster_name:) click to toggle source
# File lib/hetzner/infra/server.rb, line 3
def initialize(hetzner_client:, cluster_name:)
  @hetzner_client = hetzner_client
  @cluster_name = cluster_name
end

Public Instance Methods

create(location:, instance_type:, instance_id:, firewall_id:, network_id:, ssh_key_id:) click to toggle source
# File lib/hetzner/infra/server.rb, line 8
def create(location:, instance_type:, instance_id:, firewall_id:, network_id:, ssh_key_id:)
  puts

  server_name = "#{cluster_name}-#{instance_type}-#{instance_id}"

  if server = find_server(server_name)
    puts "Server #{server_name} already exists, skipping."
    puts
    return server
  end

  puts "Creating server #{server_name}..."

  server_config = {
    name: server_name,
    location: location,
    image: "ubuntu-20.04",
    firewalls: [
      { firewall: firewall_id }
    ],
    networks: [
      network_id
    ],
    server_type: instance_type,
    ssh_keys: [
      ssh_key_id
    ],
    user_data: user_data,
    labels: {
      cluster: cluster_name,
      role: (server_name =~ /master/ ? "master" : "worker")
    }
  }

  response = hetzner_client.post("/servers", server_config).body

  puts "...server #{server_name} created."
  puts

  JSON.parse(response)["server"]
end
delete(server_name:) click to toggle source
# File lib/hetzner/infra/server.rb, line 50
def delete(server_name:)
  if server = find_server(server_name)
    puts "Deleting server #{server_name}..."
    hetzner_client.delete "/servers", server["id"]
    puts "...server #{server_name} deleted."
  else
    puts "Server #{server_name} no longer exists, skipping."
  end
end

Private Instance Methods

find_server(server_name) click to toggle source
# File lib/hetzner/infra/server.rb, line 64
def find_server(server_name)
  hetzner_client.get("/servers")["servers"].detect{ |network| network["name"] == server_name }
end
user_data() click to toggle source
# File lib/hetzner/infra/server.rb, line 68
      def user_data
        <<~EOS
          #cloud-config
          packages:
            - fail2ban
          runcmd:
            - sed -i 's/[#]*PermitRootLogin yes/PermitRootLogin prohibit-password/g' /etc/ssh/sshd_config
            - sed -i 's/[#]*PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config
            - systemctl restart sshd
            - systemctl stop systemd-resolved
            - systemctl disable systemd-resolved
            - rm /etc/resolv.conf
            - echo "nameserver 1.1.1.1" > /etc/resolv.conf
            - echo "nameserver 1.0.0.1" >> /etc/resolv.conf
            EOS
      end