Skip to content

Instantly share code, notes, and snippets.

@arnabdas
Forked from janeczku/vultr-coreos-bootstrap.sh
Last active June 10, 2016 21:22
Show Gist options
  • Save arnabdas/fd394d0a51518843307963cbbf40484b to your computer and use it in GitHub Desktop.
Save arnabdas/fd394d0a51518843307963cbbf40484b to your computer and use it in GitHub Desktop.
Cloud-config for CoreOS IPXE deployment on Vultr. Provisioning etcd, fleet, private network and docker compatible firewall.
#!/bin/bash
# Cloud-config for CoreOS IPXE deployment on Vultr
##################################################
# This cloud-config bootstraps CoreOS on /dev/vda and provisions:
# - private ip-address on eth1
# - etcd on private network
# - fleet on private network
# - basic firewall (docker compatible)
# - SSHd security hardening
##################################################
# Usage:
# 1. Fill in region, SSH Key and etcd token.
# Hint: generate a new token for each unique etcd cluster on https://discovery.etcd.io/new
# 2. Point the cloud-config-url parameter in your IPXE boot script to this file.
##################################################
REGION='vultr-ams'
SSH_KEY='ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDQlPPUsIbsZbZDoSX1JKCK17tkaPJIpC5ngDr/TtcFNW7dArrZGgcaeBNQLU1aB0K46/9maYxAY/UfCIwooDRzRK6ezCl81JtWuFASlRgBfFDtLoiIGa4h3+R14WXz0z+VuBr4wSwf6Endft07wFIbgukVDyFUXcKrqu6Nrp/cjNTYtb6Cr34c3m8qplgpjf66lY2pkKonHuqL2Zfrb8KRc6ypUx8rpY2EmuUPvz8LAxxVRJWR9twl7gfFEBPtKRpLpgqLiYGn+OA4KrvDkfphcDP4BMdf9ga9kNIQRa3mope63bYpbAt0QND5CybD1AA/YRuSWJSBTVcuhOBhh9PvOLDTbhCgjeeTidJ1kjG8pm/RmJ42CGJdltCD94rn0x+SLY8vxMQLC1E9sVHy1P10jlVaGupnByN5dvVbOsxxH6UGQyH156X8m2sjPnKeFpMs2Qkur8uHS2o0clXxX229FiivOEb0uu8b1vFZu5tJ7VSDC4krv2pVM/8RaVa9Kxnf8Spnmaz6NWO5H0KYSYFriwfuyZ9jj+tv8xdH7wrIDDunf6JbEcDUSyPUX1UhvILiEGvN+CNY0q3BRC7JSG6IeauyV3FwuProa/wGuAF7dDVt8xVzqLWG0pUt+4yHGXK1ACW1qEDi/I6y2Y1kPivPFMihBLEHv9K2CPTcX/7nMw== arnab@coderuse.com'
ETCD_TOKEN=1fcc848cc9ef1335ce20093ca1b7662b
# Don't edit below unless you know what you're doing
##################################################
V4_PRIVATE_IP=`curl -sS http://169.254.169.254/current/meta-data/local-ipv4`
V4_PUBLIC_IP=`curl -sS http://169.254.169.254/current/meta-data/public-ipv4`
INSTANCE_ID=`curl -sS http://169.254.169.254/current/meta-data/instance-id`
cat > "cloud-config.yaml" <<EOF
#cloud-config
hostname: $REGION-${INSTANCE_ID: -4}
ssh_authorized_keys:
- $SSH_KEY
coreos:
etcd:
discovery: https://discovery.etcd.io/$ETCD_TOKEN
# multi-region and multi-cloud deployments need to use $V4_PUBLIC_IP
addr: $V4_PRIVATE_IP:4001
peer-addr: $V4_PRIVATE_IP:7001
fleet:
public-ip: $V4_PRIVATE_IP
metadata: region=$REGION public_ip=$V4_PUBLIC_IP
update:
reboot-strategy: best-effort
units:
- name: vultr-meta.service
command: start
runtime: yes
content: |
[Unit]
Description=Initialize Vultr private network
[Service]
Type=oneshot
WorkingDirectory=/root
ExecStart=/usr/bin/bash /root/vultr-privatenet.sh
- name: iptables.service
enable: false
- name: iptables-restore.service
enable: true
- name: etcd.service
command: start
- name: fleet.service
command: start
write_files:
- path: /etc/environment
permissions: 0644
owner: "root:root"
content: |
COREOS_PRIVATE_IPV4=$V4_PRIVATE_IP
COREOS_PUBLIC_IPV4=$V4_PUBLIC_IP
ETCD_ADDR=$V4_PRIVATE_IP:4001
ETCD_PEER_ADDR=$V4_PRIVATE_IP:7001
ETCD_TOKEN=$ETCD_TOKEN
- path: /etc/systemd/network/10-static-eth1.network
permissions: 0644
owner: "root:root"
content: |
[Match]
Name=eth1
[Link]
MTUBytes=1450
[Network]
Address=$V4_PRIVATE_IP/16
- path: /root/vultr-privatenet.sh
permissions: 0755
owner: "root:root"
content: |
#!/bin/bash
ip -4 addr add dev eth1 $V4_PRIVATE_IP/16
- path: /var/lib/iptables/rules-save
permissions: 0644
owner: "root:root"
content: |
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth1 -j ACCEPT
-A INPUT -i docker0 -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m conntrack --ctstate NEW -m multiport -p tcp --dports 22,80,443,9345,9346 -j ACCEPT
-A INPUT -m conntrack --ctstate NEW -m multiport -p udp --dports 500,4500 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A FORWARD -i docker0 -o eth1 -j ACCEPT
-A FORWARD -i eth1 -o docker0 -j ACCEPT
-A FORWARD -i eth0 -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o eth0 -j ACCEPT
COMMIT
- path: /etc/ssh/sshd_config
permissions: 0600
owner: "root:root"
content: |
# Use most defaults for sshd configuration.
UsePrivilegeSeparation sandbox
Subsystem sftp internal-sftp
PermitRootLogin no
AllowUsers core
PasswordAuthentication no
ChallengeResponseAuthentication no
- path: /etc/motd.d/info.conf
content: |
____________________________
Private IP...: $V4_PRIVATE_IP
Public IP....: $V4_PUBLIC_IP
Region.......: $REGION
Etcd Token...: $ETCD_TOKEN
____________________________
EOF
sudo coreos-install -d /dev/vda -c cloud-config.yaml
sudo reboot
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment