Create short lived ssh key for enable-ssh-admin.sh
[apex-tripleo-heat-templates.git] / deployed-server / scripts / enable-ssh-admin.sh
1 #!/bin/bash
2
3 set -eu
4
5 # whitespace (space or newline) separated list
6 OVERCLOUD_HOSTS=${OVERCLOUD_HOSTS:-""}
7 OVERCLOUD_SSH_USER=${OVERCLOUD_SSH_USER:-"$USER"}
8 # this is just for compatibility with CI
9 SUBNODES_SSH_KEY=${SUBNODES_SSH_KEY:-"$HOME/.ssh/id_rsa"}
10 # this is the intended variable for overriding
11 OVERCLOUD_SSH_KEY=${OVERCLOUD_SSH_KEY:-"$SUBNODES_SSH_KEY"}
12
13 SHORT_TERM_KEY_COMMENT="TripleO split stack short term key"
14 SLEEP_TIME=5
15
16 function overcloud_ssh_hosts_json {
17     echo "$OVERCLOUD_HOSTS" | python -c '
18 from __future__ import print_function
19 import json, re, sys
20 print(json.dumps(re.split("\s+", sys.stdin.read().strip())))'
21 }
22
23 function overcloud_ssh_key_json {
24     # we pass the contents to Mistral instead of just path, otherwise
25     # the key file would have to be readable for the mistral user
26     cat "$1" | python -c 'import json,sys; print(json.dumps(sys.stdin.read()))'
27 }
28
29 function workflow_finished {
30     local execution_id="$1"
31     openstack workflow execution show -f shell $execution_id | grep 'state="SUCCESS"' > /dev/null
32 }
33
34 function generate_short_term_keys {
35     local tmpdir=$(mktemp -d)
36     ssh-keygen -N '' -t rsa -b 4096 -f "$tmpdir/id_rsa" -C "$SHORT_TERM_KEY_COMMENT" > /dev/null
37     echo "$tmpdir"
38 }
39
40 if [ -z "$OVERCLOUD_HOSTS" ]; then
41     echo 'Please set $OVERCLOUD_HOSTS'
42     exit 1
43 fi
44
45 echo "Starting workflow to create ssh admin on deployed servers."
46 echo "SSH user: $OVERCLOUD_SSH_USER"
47 echo "SSH key file: $OVERCLOUD_SSH_KEY"
48 echo "Hosts: $OVERCLOUD_HOSTS"
49 echo
50
51 SHORT_TERM_KEY_DIR=$(generate_short_term_keys)
52 SHORT_TERM_KEY_PRIVATE="$SHORT_TERM_KEY_DIR/id_rsa"
53 SHORT_TERM_KEY_PUBLIC="$SHORT_TERM_KEY_DIR/id_rsa.pub"
54 SHORT_TERM_KEY_PUBLIC_CONTENT=$(cat $SHORT_TERM_KEY_PUBLIC)
55
56 for HOST in $OVERCLOUD_HOSTS; do
57     echo "Inserting TripleO short term key for $HOST"
58     # prepending an extra newline so that if authorized_keys didn't
59     # end with a newline previously, we don't end up garbling it up
60     ssh -i "$OVERCLOUD_SSH_KEY" -l "$OVERCLOUD_SSH_USER" "$HOST" "echo -e '\n$SHORT_TERM_KEY_PUBLIC_CONTENT' >> \$HOME/.ssh/authorized_keys"
61 done
62
63 echo "Starting ssh admin enablement workflow"
64 EXECUTION_PARAMS="{\"ssh_user\": \"$OVERCLOUD_SSH_USER\", \"ssh_servers\": $(overcloud_ssh_hosts_json), \"ssh_private_key\": $(overcloud_ssh_key_json "$SHORT_TERM_KEY_PRIVATE")}"
65 EXECUTION_CREATE_OUTPUT=$(openstack workflow execution create -f shell -d 'deployed server ssh admin creation' tripleo.access.v1.enable_ssh_admin "$EXECUTION_PARAMS")
66 echo "$EXECUTION_CREATE_OUTPUT"
67 EXECUTION_ID=$(echo "$EXECUTION_CREATE_OUTPUT" | grep '^id=' | awk '-F"' '{ print $2 }')
68
69 if [ -z "$EXECUTION_ID" ]; then
70     echo "Failed to get workflow execution ID for ssh admin creation workflow"
71     exit 1
72 fi
73
74 echo -n "Waiting for the workflow execution to finish (id $EXECUTION_ID)."
75 while ! workflow_finished $EXECUTION_ID; do
76     sleep $SLEEP_TIME
77     echo -n .
78 done
79 echo  # newline after the previous dots
80
81 for HOST in $OVERCLOUD_HOSTS; do
82     echo "Removing TripleO short term key from $HOST"
83     ssh -l "$OVERCLOUD_SSH_USER" "$HOST" "sed -i -e '/$SHORT_TERM_KEY_COMMENT/d' \$HOME/.ssh/authorized_keys"
84 done
85
86 echo "Removing short term keys locally"
87 rm -r "$SHORT_TERM_KEY_DIR"
88
89 echo "Success."