การใช้ Ansible สร้าง EC2 Instance (VM) บน AWS

Using Ansible to Create an EC2 Instance (VM) on AWS

Nopnithi Khaokaew (Game)
5 min readNov 17, 2020

— — — — — — — — — — — — — — —
สารบัญเนื้อหาทั้งหมด (My Contents)
— — — — — — — — — — — — — — —

1) สร้าง AWS Account (Root Account)

ตรงนี้ผมขอไม่อธิบายนะครับ เพราะทุกท่านน่าจะหาวิธีสร้าง AWS account จาก Google ได้ไม่ยากอยู่แล้ว และไม่ต้องกังวลไป ทุก instance ที่เรา spin up ขึ้นมาในบทความนี้จะยังอยู่ในขอบเขตของ free tier ครับ ไม่เสียเงินแน่นอน

2) สร้าง IAM Group (ด้วย Root Account)

เมื่อ login เข้าสู่ root account แล้วให้ทำการสร้าง group ภายใต้ IAM service โดยพิมพ์ IAM ในช่อง Find Services แล้วคลิกเข้าไป

จากนั้นเลือก Groups ตรง dashboard ซ้ายมือ

เมื่อเข้ามาแล้วเลือก Create New Group

ตั้งชื่อ group เป็น AnsibleGroup แล้วกด Next Step

ทีนี้มาถึงขั้นตอนการกำหนด policy ให้กับ AnsibleGroup group แนะนำว่าให้พิมพ์ FullAccess เข้าไปในช่อง filter แล้วเลื่อนลงไปติ๊กเลือก 2 ตัวนี้

  • AmazonEC2FullAccess
  • AmazonVPCFullAccess

เพื่อที่ว่า Ansible ของเราสามารถจัดการกับ EC2 และ VPC ได้เต็มที่ จากนั้นกด Next Step ครับ

ในหน้า review ก็ดูว่าเราเลือก policy ครบเรียบร้อยแล้วใช่มั้ย ถ้าใช่ก็กด Create Group เป็นอันจบครับ

3) สร้าง IAM User (ด้วย Root Account)

ผมคิดว่าทุกท่านน่าจะคุ้นชินกับ UI จากการสร้าง group แล้วเนอะ ทีนี้ในการสร้าง user ผมจะเขียนอธิบายโดยลดรูปประกอบลงนะครับ (ผมขี้เกียจ อิอิ)

อธิบายนิดนึงว่าตอนที่เราสมัคร AWS account เนี่ย ตัว account ที่เราถืออยู่มันเรียกว่า root account ซึ่งมีสิทธิ์ทำอะไรได้ทุกอย่าง(ยิ่งกว่า administrator) แน่นอนว่าเราจะไม่มีการใช้ root account ในการทำอะไรต่อมิอะไรบน AWS เด็ดขาด (ออกสอบด้วยนะ ฮ่า ๆ) ดังนั้นเราจะมาสร้าง IAM user และกำหนดสิทธิ์แค่บางอย่างเท่านั้นสำหรับใช้เล่นกับ Ansible

ตอนนี้เรายังอยู่กันใน IAM service และเป็น root account อยู่นะครับ เริ่มต้นให้ไปที่ dashboard ซ้ายมือเหมือนขั้นตอนการสร้าง group แล้วเลือก Users และพอเข้ามาในหน้า Users แล้วให้เลือก Add user

ที่หน้า Set user details ให้ใส่รายละเอียดตามนี้

  • User name: ansible01
  • Access type ให้ติ๊กทั้งสองอันให้ครบ
  • Console password ให้เลือก custom password แล้วใส่ password ที่ต้องการไป
  • ไม่ต้องติ๊ก Require password reset นะครับ

จากนั้นกด Next: Permissions

พอกด Next: Permissions มาแล้ว หน้านี้จะให้เราเลือก permission ให้กับ user ที่เราสร้าง ให้ไปตรงที่ Add user to group โดยติ๊กเลือกที่ AnsibleGroup ที่เราสร้างมาก่อนหน้านี้ แล้วกด Next: Tags จากนั้นกด Next ไปเรื่อยจนถึงเจอ Create user แล้วกดได้เลยครับ

เมื่อมาถึงหน้านี้อย่าพึ่งปิดครับ ให้ดาวน์โหลด API access key ก่อน (เป็นไฟล์ CSV) เพราะตัวนี้จะเป็นตัวที่เอาไว้เรียกใช้ AWS API นั่นเองครับ ซึ่งเดี๋ยวเราจะใช้ตอนที่ Ansible มันจะทำการสร้าง EC2 instance นั่นแหละ

4) Logout จาก Root Account และ Login ใหม่ด้วย IAM User

จากขั้นตอนที่ 3 เนี่ยเราจะได้ IAM user (หรือ account นั่นแหละ) ชื่อว่า ansible01 มาใช่มั้ยครับ จากนั้นให้เรา logout ออกจาก root account ก่อน แล้ว login ใหม่ด้วย ansible01 อีกครั้ง

ตามรูปครับ มันจะให้เราใส่ ID หรือ alias ของ root account ก่อน แล้วก็ใส่ IAM user อีกทีเพื่อ login (ใครใช้ AWS อยู่แล้วคงเข้าใจไม่ยาก ใครไม่เคยใช้ก็ดำน้ำเอาไม่ยากครับ)

พอ login เข้ามาแล้วสังเกตตรงนี้ครับ ตอนนี้เราอยู่ภายใต้ IAM user ที่สร้างมาแล้ว อ้อ แล้วถ้าของใครโชว์ region เป็นอย่างอื่นไม่ใช่ Singapore ก็เลือกให้ถูกด้วยครับ

5) สร้าง EC2 Instance เป็น Ansible Node (ด้วย ansible01 User)

กลับไปที่หน้าแรกของ AWS management console แล้วพิมพ์ EC2 ในช่อง Find Service เหมือนตอนเข้า IAM หนะครับ

กด Instances ที่ dashboard ซ้ายมือก่อน เมื่อเข้ามาอีกหน้าแล้วให้กดปุ่ม Launch instances ครับ

เลือก AMI เป็น Ububtu Server 20.04 ครับ

จากนั้นเลือก

  • Instance Type เป็น t2.micro (เพราะมันฟรี)
  • หน้า Configure Instance Details ให้ปล่อยเป็นค่า default ทุกประการ แต่ให้ใส่ user data ตามนี้เลยครับ
#!/bin/bash
apt-add-repository ppa:ansible/ansible -y
apt update -y
apt install ansible -y
apt install python3-pip -y
pip3 install boto

คราวนี้ตอนที่ server เราถูก launch ขึ้นมา มันจะได้ติดตั้ง Ansible และ boto ไว้เรียบร้อยแล้ว

  • หน้า Add Storage เปลี่ยน size เป็น 30 GB
  • หน้า Add Tags ให้กด Add Tag ใส่ tag เป็น Name:AnsibleNode ครับ ดูตามรูปด้านล่างเลย จากนั้นกด Next: Configure Security Group

ทีนี้ในหน้า Configure Security Group ให้สร้าง security group ใหม่ชื่อ AnsibleSecurityGroup แล้ว allow SSH จาก internet เสร็จแล้วกด Review and Launch และเมื่อไปยังหน้า Review Instance Launch แล้วก็กด Launch ต่อได้เลย

จากนั้นมันจะเด้ง popup ขึ้นมา ให้สร้าง SSH key ชื่อ ansibleSSH เสร็จแล้วทำการดาวน์โหลดมาให้เรียบร้อย ก่อนจบด้วยการกด Launch Instances

ที่จริงตรงขวาบนต้องเป็น ansible01 @ <id-or-alias-of-account> นะครับ

เสร็จแล้วรอประมาณ 1–2 นาที เราจะได้ server ตัวแรกของเรา ซึ่งติดตั้ง Ansible มาเรียบร้อยพร้อมใช้งานครับ

6) SSH เข้า Ansible Node ของเรา

จากนั้นให้ไปที่หน้าแรกของ EC2 service ครับ คลิกที่ Instances ตัวที่เราสร้างขึ้นมาจะเจอหน้าตาแบบนี้ ให้กดที่ Connect ครับ

เมื่อเข้ามาแล้วให้เลือกที่แถบ SSH client ครับ จะเป็นวิธีในการ SSH เข้าไปยัง server ของเรา ไม่มีไรยากครับทำตามได้เลย

เมื่อ SSH เข้าไปแล้วก็จะได้แบบนี้

7) เช็ค Ansible และ Boto (Python Library)

เมื่อ SSH เข้ามาแล้วให้ลองเช็คว่า Ansible และ Boto ที่เราติดตั้งผ่าน EC2 user data นั้นเรียบร้อยดีมั้ย โดยใช้คำสั่งนี้

ansible --version
pip3 install boto

ซึ่งถ้าทุกอย่างเรียบร้อยเราควรจะได้ผลลัพธ์แบบนี้

8) เตรียม Key Pairs (บน AnsibleNode)

ในการ connect กับ AWS เนี่ย Ansible มันจะใช้ token ผ่าน Boto โดยเราจะไปสร้างไฟล์ไว้ที่ ~/.aws/credentials ครับ

mkdir ~/.aws
nano .aws/credentials

โดยข้อมูลในไฟล์ credentials มีดังนี้

[default]
aws_access_key_id = <your_access_key>
aws_secret_access_key = <your_secret_key>
region = ap-southeast-1

ข้อมูลที่ใส่ก็ให้ไปเปิดเอาจากไฟล์ CSV ที่ดาวน์โหลดมาจากขั้นตอนที่ 3 นั่นแหละครับ จากนั้นก็เซฟแล้วปิดไป

9) ใช้ Ansible สร้าง EC2 Instance ขึ้นมา (บน Ansible Node)

ตอนนี้เรายังอยู่ใน terminal ของ AnsibleNode บน AWS อยู่นะครับ และเดี๋ยวเราจะใช้ server ตัวนี้แหละสร้าง EC2 instance อีกตัวขึ้นมาด้วย Ansible

เริ่มจากสร้างไฟล์ playbook มาตามนี้ ตั้งชื่อว่า create_ec2_instances.yaml

---
- name: Create EC2 instances
hosts: all
connection: local
gather_facts: False
tasks:
- name: Create Test Server
ec2:
image: ami-0c20b8b385217763f
instance_type: t2.micro
group: AnsibleSecurityGroup
key_name: ansibleSSH
region: ap-southeast-1
instance_tags:
Name: CreatedByAnsible

จากนั้นใช้ Ansible สร้าง EC2 instance ด้วย command นี้

ansible-playbook -i "localhost," create_ec2_instances.yaml

และเมื่อย้อนกลับไปดูใน Intances สังเกตว่ามี EC2 instance (server) ชื่อ CreatedByAnsible โผล่ขึ้นมาเรียบร้อยครับ

สรุป

ที่จริงแล้วการ provision EC2 instance ขึ้นมาด้วย Ansible อาจไม่ใช่ตัวเลือกที่ดีที่สุด (เพราะใช้ Terraform น่าจะดูดีกว่าเยอะ) แต่ทว่านี่เป็นการเรียนรู้ครับ และเดี๋ยวบทความนี้จะถูกนำไปอ้างอิงกับอีกบทความหนึ่งของผมที่กำลังเขียนอยู่ด้วย

ส่วน link ด้านล่างนี้เป็น manual ของ ec2 module นะครับ เผื่อใครอยากศึกษาต่อว่าจะใช้ Ansible ในการสร้าง EC2 instance ยังไงได้บ้าง

— — — — — — — — — — — — — — —
สารบัญเนื้อหาทั้งหมด (My Contents)
— — — — — — — — — — — — — — —

--

--

Nopnithi Khaokaew (Game)
Nopnithi Khaokaew (Game)

Written by Nopnithi Khaokaew (Game)

Cloud Solutions Architect & Hobbyist Developer | 6x AWS Certified, CKA, CKAD, 2x HashiCorp Certified (Terraform, Vault), etc.

No responses yet