pssh -I tee /tmp/settings.yaml < $SETTINGS pssh " sudo apt-get update && sudo apt-get install -y python-setuptools && sudo easy_install pyyaml" pssh -I tee /tmp/postprep.py < {}...".format(STEP, cmd))) retcode = os.system(cmd) t2 = time.time() td = str(t2-t1)[:5] f.write(bold("[{}] in {}s\n".format(retcode, td))) STEP += 1 with open("/home/ubuntu/.bash_history", "a") as f: f.write("{}\n".format(cmd)) if retcode != 0: msg = "The following command failed with exit code {}:\n".format(retcode) msg+= cmd raise(Exception(msg)) # On EC2, the ephemeral disk might be mounted on /mnt. # If /mnt is a mountpoint, place Docker workspace on it. system("if mountpoint -q /mnt; then sudo mkdir /mnt/docker && sudo ln -s /mnt/docker /var/lib/docker; fi") # Put our public IP in /tmp/ipv4 # ipv4_retrieval_endpoint = "http://169.254.169.254/latest/meta-data/public-ipv4" ipv4_retrieval_endpoint = "http://myip.enix.org/REMOTE_ADDR" system("curl --silent {} > /tmp/ipv4".format(ipv4_retrieval_endpoint)) ipv4 = open("/tmp/ipv4").read() # Add a "docker" user with password "training" system("id docker || sudo useradd -d /home/docker -m -s /bin/bash docker") system("echo docker:training | sudo chpasswd") # Helper for Docker prompt. system("""sudo tee /usr/local/bin/docker-prompt <>/tmp/pp.out 2>>/tmp/pp.err" < $IPS_FILE # If /home/docker/.ssh/id_rsa doesn't exist, copy it from node1 pssh " sudo -u docker [ -f /home/docker/.ssh/id_rsa ] || ssh -o StrictHostKeyChecking=no node1 sudo -u docker tar -C /home/docker -cvf- .ssh | sudo -u docker tar -C /home/docker -xf-" # if 'docker@' doesn't appear in /home/docker/.ssh/authorized_keys, copy it there pssh " grep docker@ /home/docker/.ssh/authorized_keys || cat /home/docker/.ssh/id_rsa.pub | sudo -u docker tee -a /home/docker/.ssh/authorized_keys" # On node1, create and deploy TLS certs using Docker Machine true || pssh " if grep -q node1 /tmp/node; then grep ' node' /etc/hosts | xargs -n2 sudo -H -u docker \ docker-machine create -d generic --generic-ssh-user docker --generic-ip-address fi" ### Kubernetes cluster setup below ### _setup_kubernetes_ () { # Install packages pssh " curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - && echo deb http://apt.kubernetes.io/ kubernetes-xenial main | sudo tee /etc/apt/sources.list.d/kubernetes.list" pssh " sudo apt-get update -q && sudo apt-get install -qy kubelet kubeadm kubectl" # Work around https://github.com/kubernetes/kubernetes/issues/53356 pssh " if [ ! -f /etc/kubernetes/kubelet.conf ]; then sudo systemctl stop kubelet sudo rm -rf /var/lib/kubelet/pki fi" # Initialize kube master pssh " if grep -q node1 /tmp/node && [ ! -f /etc/kubernetes/admin.conf ]; then sudo kubeadm init fi" # Put kubeconfig in ubuntu's and docker's accounts pssh " if grep -q node1 /tmp/node; then sudo mkdir -p \$HOME/.kube /home/docker/.kube && sudo cp /etc/kubernetes/admin.conf \$HOME/.kube/config && sudo cp /etc/kubernetes/admin.conf /home/docker/.kube/config && sudo chown -R \$(id -u) \$HOME/.kube && sudo chown -R docker /home/docker/.kube fi" # Get bootstrap token pssh " if grep -q node1 /tmp/node; then TOKEN_NAME=\$(kubectl -n kube-system get secret -o name | grep bootstrap-token) TOKEN_ID=\$(kubectl -n kube-system get \$TOKEN_NAME -o go-template --template '{{ index .data \"token-id\" }}' | base64 -d) TOKEN_SECRET=\$(kubectl -n kube-system get \$TOKEN_NAME -o go-template --template '{{ index .data \"token-secret\" }}' | base64 -d) echo \$TOKEN_ID.\$TOKEN_SECRET >/tmp/token fi" # Install weave as the pod network pssh " if grep -q node1 /tmp/node; then kubever=\$(kubectl version | base64 | tr -d '\n') kubectl apply -f https://cloud.weave.works/k8s/net?k8s-version=\$kubever fi" # Join the other nodes to the cluster pssh " if ! grep -q node1 /tmp/node && [ ! -f /etc/kubernetes/kubelet.conf ]; then TOKEN=\$(ssh -o StrictHostKeyChecking=no node1 cat /tmp/token) sudo kubeadm join --token \$TOKEN node1:6443 fi" } # Just uncomment that line to enable kubernetes provisioning! #_setup_kubernetes_