#!/bin/bash # # Generates a inventory file based on the terraform output. # After provisioning a cluster, simply run this command and supply the terraform state file # Default state file is terraform.tfstate # set -e usage () { echo "Usage: $0 " >&2 exit 1 } if [[ $# -ne 1 ]]; then usage fi TF_STATE_FILE=${1} if [[ ! -f "${TF_STATE_FILE}" ]]; then echo "ERROR: state file ${TF_STATE_FILE} doesn't exist" >&2 usage fi TF_OUT=$(terraform output -state "${TF_STATE_FILE}" -json) MASTERS=$(jq -r '.master_ips.value | to_entries[]' <(echo "${TF_OUT}")) WORKERS=$(jq -r '.worker_ips.value | to_entries[]' <(echo "${TF_OUT}")) mapfile -t MASTER_NAMES < <(jq -r '.key' <(echo "${MASTERS}")) mapfile -t WORKER_NAMES < <(jq -r '.key' <(echo "${WORKERS}")) API_LB=$(jq -r '.control_plane_lb_ip_address.value' <(echo "${TF_OUT}")) # Generate master hosts i=1 for name in "${MASTER_NAMES[@]}"; do private_ip=$(jq -r '. | select( .key=='"\"${name}\""' ) | .value.private_ip' <(echo "${MASTERS}")) public_ip=$(jq -r '. | select( .key=='"\"${name}\""' ) | .value.public_ip' <(echo "${MASTERS}")) echo "${name} ansible_user=ubuntu ansible_host=${public_ip} ip=${private_ip} etcd_member_name=etcd${i}" i=$(( i + 1 )) done # Generate worker hosts for name in "${WORKER_NAMES[@]}"; do private_ip=$(jq -r '. | select( .key=='"\"${name}\""' ) | .value.private_ip' <(echo "${WORKERS}")) public_ip=$(jq -r '. | select( .key=='"\"${name}\""' ) | .value.public_ip' <(echo "${WORKERS}")) echo "${name} ansible_user=ubuntu ansible_host=${public_ip} ip=${private_ip}" done echo "" echo "[kube_control_plane]" for name in "${MASTER_NAMES[@]}"; do echo "${name}" done echo "" echo "[kube_control_plane:vars]" echo "supplementary_addresses_in_ssl_keys = [ '${API_LB}' ]" # Add LB address to API server certificate echo "" echo "[etcd]" for name in "${MASTER_NAMES[@]}"; do echo "${name}" done echo "" echo "[kube-node]" for name in "${WORKER_NAMES[@]}"; do echo "${name}" done echo "" echo "[k8s-cluster:children]" echo "kube_control_plane" echo "kube-node"