-
Notifications
You must be signed in to change notification settings - Fork 570
/
elastic-beanstalk-update-hostnames.sh
executable file
·149 lines (131 loc) · 4.4 KB
/
elastic-beanstalk-update-hostnames.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#!/usr/bin/env bash
# This script updates the hostname on Elastic Beanstalk servers with their environment name and IP address
# It also will restart New Relic monitoring if present
# Requires the AWS CLI and jq
# Set Variables
# Debug Mode
DEBUGMODE="0"
# Functions
# Check Command
function check_command {
type -P $1 &>/dev/null || fail "Unable to find $1, please install it and run this script again."
}
# Completed
function completed(){
echo
HorizontalRule
tput setaf 2; echo "Completed!" && tput sgr0
HorizontalRule
echo
}
# Fail
function fail(){
tput setaf 1; echo "Failure: $*" && tput sgr0
exit 1
}
# Horizontal Rule
function HorizontalRule(){
echo "============================================================"
}
# Pause
function pause(){
read -n 1 -s -p "Press any key to continue..."
echo
}
# Verify AWS CLI Credentials are setup
# http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html
if ! grep -q aws_access_key_id ~/.aws/config; then
if ! grep -q aws_access_key_id ~/.aws/credentials; then
fail "AWS config not found or CLI not installed. Please run \"aws configure\"."
fi
fi
# Check for AWS CLI profile argument passed into the script
# http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html#cli-multiple-profiles
if [ $# -eq 0 ]; then
scriptname=`basename "$0"`
echo "Usage: ./$scriptname profile"
echo "Where profile is the AWS CLI profile name"
echo "Using default profile"
echo
profile=default
else
profile=$1
fi
# Check required commands
check_command "aws"
check_command "jq"
# Get Elastic Beanstalk Environments
function ebenvironments(){
describeenvironments=$(aws elasticbeanstalk describe-environments --output=json --profile $profile 2>&1)
if [ ! $? -eq 0 ]; then
fail "$describeenvironments"
fi
ebenvironments=$(echo "$describeenvironments" | jq '.Environments | .[] | .EnvironmentName' | cut -d \" -f2)
if [ -z "$ebenvironments" ]; then
fail "No Elastic Beanstalk Environments found."
fi
echo "EB Environments Found:"
HorizontalRule
echo "$ebenvironments"
HorizontalRule
}
# Get Elastic Beanstalk Environment Resources
function ebresources(){
while IFS= read -r ebenvironments
do
describeebresources=$(aws elasticbeanstalk describe-environment-resources --environment-name $ebenvironments --output=json --profile $profile 2>&1)
if [ ! $? -eq 0 ]; then
fail "$describeebresources"
fi
ebresources=$(echo "$describeebresources" | jq '.EnvironmentResources | .Instances | .[] | .Id' | cut -d \" -f2)
if [ -z "$ebresources" ]; then
fail "No Elastic Beanstalk Environment Resources found."
fi
echo "EB Server IDs Found for Environment $ebenvironments:"
HorizontalRule
echo "$ebresources"
HorizontalRule
ebresourcescount=$(echo "$ebresources" | wc -l)
if [[ $DEBUGMODE = "1" ]]; then
echo ebresourcescount "$ebresourcescount"
fi
ebresourceslist=$(echo "$ebresources" | nl)
if [[ $DEBUGMODE = "1" ]]; then
echo ebresourceslist "$ebresourceslist"
fi
# Get IP Address
START=1
if [[ $DEBUGMODE = "1" ]]; then
echo "Getting IP for $ebresourcescount instance(s)."
fi
for (( COUNT=$START; COUNT<=$ebresourcescount; COUNT++ ))
do
currentinstanceid=$(echo "$ebresourceslist" | grep -w [^0-9][[:space:]]$COUNT | cut -f2)
if [[ $DEBUGMODE = "1" ]]; then
echo "Getting IP for Instance ID: $currentinstanceid"
fi
describeinstances=$(aws ec2 describe-instances --instance-ids "$currentinstanceid" --query 'Reservations[*].Instances[*].PublicIpAddress' --output=json --profile $profile 2>&1)
if [ ! $? -eq 0 ]; then
fail "$describeinstances"
fi
getipaddr=$(echo "$describeinstances" | jq '.[] | .[]' | cut -d \" -f2)
echo "IP Address: $getipaddr"
# Set Hostname
echo '#!/usr/bin/env bash' >> sethostname.sh
echo "sudo sed -i 's/Defaults requiretty/#Defaults requiretty/g' /etc/sudoers" >> sethostname.sh
echo sudo hostname "$ebenvironments"-"$getipaddr" >> sethostname.sh
echo "chkconfig --list newrelic-sysmond &> /dev/null && sudo service newrelic-sysmond restart" >> sethostname.sh
chmod +x sethostname.sh
uploadhostnamescript=$(scp -o StrictHostKeyChecking=no sethostname.sh $getipaddr:~)
sethostname=$(ssh -n $getipaddr '(./sethostname.sh)')
if [[ $DEBUGMODE = "1" ]]; then
echo "$sethostname"
fi
rm sethostname.sh
done
done <<< "$ebenvironments"
completed
}
ebenvironments
# ebenvironments="set one environment here to override the lookup"
ebresources