AWS CLI ve Shell Script otomasyonu

June 22, 2017

Merhaba,

Bir firmanın düzenlediği DevOps challenge’ına yönelik script yazmıştım, belki AWS tarafında işleri otomatikleştirmek isteyen kişilerin işine yarayabilir düşüncesiyle kodu paylaşmak istedim.

Buradaki temel amaç, AWS CLI kullanarak kullanıcının belirttiği özelliklere göre yeni bir Instance oluşturmak. CIDR, Security Group, Volume, Region, Image, Zone gibi birçok tanımlı değişkeni kendinize göre ayarlayıp çalıştırabilirsiniz.

Scriptin çalışma akışı şu şekildedir: 1-)Type seçimi yapıldıktan sonra öncelikle AWS’in default security grubuna gelen SSH isteği için kural eklemesi yapılır. Amazon AMI imajı t2.micro olarak gerekli opsiyonlarla oluşturulur. Burada tabi ki istenen RAM & HDD seçimine göre instance type değiştirilebilir.

2-) Instance hazır hale gelene kadar kullanıcı bekletilerek peşine 10 GB’lık EBS storage oluşturulur. Availability Zone seçilir. Sonrasında Volume ve Instance ID’lerini ayrı değişkenlerde tutulur.

3-) Instance ID’lerini bir dosyada tutularak satır bazlı okuma yapılır ve o an oluşturulan Volume ID’si loop içerisinde hangi ID uygunsa o Instance’a attach edilir.

4-) Peşine IP değerini yine değiskene alarak ilgili Instance’a bir SSH bağlantısı kurulur ve attach edilen 10 GB’lık storage formatlanarak sisteme mount edilir.

5-) Son olarak alınan üç farklı değer bir dosyaya yazdırılark fonksiyon çağırılır. Başlangıçta ListNodes veya ListAll seçenekleri seçildiğinde, tutulan bu değişkenlerin değeri script çalıştırılırken kullanıcıdan birincil argüman olarak alınan customerID değişkenine göre bağlantılı NodeID veya bütün özellikler ekrana yazdırılır.

 
shopt -s expand_aliases
 
customerId=$1
 
#read -p customerId
 
echo 'Please select your NodeType: '
options=("Manager" "Peer" "ListNodes" "ListAll" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        "Manager")
            create () {
 
aws ec2 authorize-security-group-ingress --group-name default --protocol tcp --port 22 --cidr 203.0.113.0/24
 
aws ec2 run-instances --image-id ami-c58c1dd3 --count 1 --instance-type t2.micro --key-name devopss --security-groups default
 
sleep 30
 
aws ec2 create-volume --size 10 --region us-east-1 --availability-zone us-east-1d --volume-type gp2
 
sleep 25
 
volumeId="$(aws ec2 describe-volumes | grep VolumeId | awk {'print $2'} | grep -oP '"\K[^"\047]+(?=["\047])' | tail -n 1)"
 
echo $volumeId
 
instanceId="$(aws ec2 describe-instances | grep InstanceId | awk {'print $2'} | grep -oP '"\K[^"\047]+(?=["\047])' > instanceids)"
 
file=instanceids
while IFS= read -r line
do
aws ec2 attach-volume --volume-id $volumeId --instance-id $line  --device /dev/sdf
done < "$file"
 
ip="$(aws ec2 describe-instances | grep PublicIp | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' |  uniq )"
 
echo $ip
 
ssh -T -o "StrictHostKeyChecking no" -tt -i "/root/Downloads/devopss.pem" ec2-user@$ip << ENDHERE
sudo su -
echo -e "o\un\nn\np\n1\n\n\nw\nq" | fdisk /dev/sdf
logout
logout
ENDHERE
ids1=$(tail -n 1 instanceids)
echo $ids1
 
 
echo $customerId " " $ids1 " " $ip >> ids
 
}
create
ids1=$(tail -n 1 instanceids)
echo $ids1
break
;;
"Peer")
create () {
 
aws ec2 authorize-security-group-ingress --group-name default --protocol tcp --port 22 --cidr 203.0.113.0/24
 
aws ec2 run-instances --image-id ami-c58c1dd3 --count 1 --instance-type t2.micro --key-name devopss --security-groups default
 
sleep 30
 
#aws ec2 create-volume --size 10 --region us-east-1 --availability-zone us-east-1d --volume-type gp2
 
#sleep 25
 
#volumeId="$(aws ec2 describe-volumes | grep VolumeId | awk {'print $2'} | grep -oP '"\K[^"\047]+(?=["\047])' | tail -n 1)"
 
#echo $volumeId
 
instanceId="$(aws ec2 describe-instances | grep InstanceId | awk {'print $2'} | grep -oP '"\K[^"\047]+(?=["\047])' > instanceids)"
 
file=instanceids
while IFS= read -r line
do
aws ec2 attach-volume --volume-id $volumeId --instance-id $line  --device /dev/sdf
done < "$file"
 
ip="$(aws ec2 describe-instances | grep PublicIp | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' |  uniq )"
 
echo $ip
 
ssh -T -o "StrictHostKeyChecking no" -tt -i "/root/Downloads/devopss.pem" ec2-user@$ip << ENDHERE
sudo su -
echo -e "o\un\nn\np\n1\n\n\nw\nq" | fdisk /dev/sdf
logout
logout
ENDHERE
ids1=$(tail -n 1 instanceids)
echo $ids1
 
 
echo $customerId " " $ids1 " " $ip >> ids
 
}
create
ids1=$(tail -n 1 instanceids)
echo $ids1
break
;;
"ListNodes")
read -p 'Enter CustomerID: ' cust
var2=$(cat ids | grep $cust | awk {'print $2'})
echo $var2
break
;;
"ListAll")
cat ids
;;
"Quit")
break
;;
*) echo "Invalid option.";;
esac
done


Written by Deniz Parlak