Codding Gun

Infrastructure as Code(IaC) คืออะไร

Infrastructure as Code คือ การเขียน Code เพื่อจัดการกับส่วนประกอบต่างๆของ Infrastructure ตัวอย่างของ Infrastructure as Code(IaC) เช่น Terraform จัดการ Resource ต่างๆบน Cloud และ Ansible ที่นำมาจัดการ Configuration บน Server หรือใน router

Infrastructure as Code(IaC) vs Shell Script

ถ้าเราอยากทำงาแบบอัตโนมัติ เราก็เขียน Bash script หรือ Shell script ก็ได้นี่ไม่เห็นต้องมาเรียนรู้ Syntax ของ Infrastructure as Code ให้วุ่นวาย ซึ่งเราจะพบปัญหาต่างๆเหล่านี้

ดังนั้น Infrastructure as Code(IaC) จะเกิดมาเพื่อแก้ปัญหาต่างๆเหล่านี้ ข้อแนะนำสำหรับผู้ที่เขียน Shell script หรือ Bash script คือเปลี่ยนจากการเขียน script มาเป็น IaC ซะเพราะมันง่ายกว่าสิ่งที่คุณกำลังเขียนอยู่มากๆ

Declarative vs Imperative

การเขียน Code หรือ Script เพื่อจัดการกับ Infrastructure นั้นมีได้ 2 รูปแบบคือ

ในปัจจุบัน Infrastructure as Code(IaC) จะเป็นการเขียนแบบ Declarative

Idempotency คืออะไร?

Idempotency คือ เราเขียนสามารถ run command ซ้ำๆได้ โดยที่ไม่เกิด Error หรือการเปลี่ยนแปลงกับ state ของระบบ(Managed System) เนื่องจาก Infrastructure as Code ของเราเขียนแบบ Declarative จึงเริ่มต้นจากจุดไหนก็ได้ ในตัวอย่างเราจะเขียนคำว่า “foobar” ลงไปในไฟล์ชื่อว่า “myfile” ซึ่งเหมือนกับ command ในตัวอย่างนี้

echo foobar >> /tmp/myfile

ใน Code ชุดแรกจะเขียนด้วย puppet ซึ่งเป็น Infrastructure as Code แบบ declarative เราจะสามารถ run puppet apply ซ้ำๆได้ โดยที่เนื้อหาใน “myfile” จะยังคงมีคำว่า “foobar” บรรทัดเดียวเหมือนเดิม

puppet apply sample.pp

ไฟล์ sample.pp จะมีเนื้อหาแบบนี้

file_line { 'foobar':
  ensure => present,
  path   => '/tmp/myfile',
  line   => 'foobar',
}

แบบที่ 2 เราจะเขียนโดย shell script โดยใช้ชื่อว่า sample.sh ซึ่งจะมีเนื้อหาแบบนี้

#!/bin/sh

if ! grep -E '^foobar$' /tmp/myfile > /dev/null 2>&1; then 
  echo foobar >> /tmp/myfile
fi

ซึ่งทุกครั้งที่เรา Run shell script นี้ด้วยคำสั่งนี้ซ้ำๆ

./sample.sh

สิ่งที่เกิดขึ้นคือจะมีการเพิ่มคำว่า “foobar” เข้าไปใน myfile เรื่อยๆ นั่นก็คือ state ของ Managed System จะเปลี่ยนไปเรื่อยๆ ทุกครั้งที่ run

ดังนั้นความหมายของ Idempotency คือไม่ว่าเราจะ run Code กี่ครั้งก็ตาม state สุดท้ายจะตรงกันเสมอ

ข้อดีของ Infrastructure as Code

ซึ่งข้อดีของการทำ Infrastructure as Code มีดังนี้

ในปัจจุบบันเราจะนิยมการเขียนแบบ Declarative มากกว่า เพราะสั้น กระชับเข้าใจง่าย และที่สำคัญคือ error น้อยกว่า เพราะเราไม่ได้สนใจจุดตั้งต้น เราจะเริ่มจากจุดไหนก็ได้ แต่ imperative จะต้องเริ่มจากศูนย์เสมอ

Push vs Pull

Infrastructure as Code(Iac) จะถูกจัดออกเป็น 2 กลุ่มคือ Push และ Pull โดยที่ทั้ง 2 กลุ่มนี้จะต่างกันตรงที่

ความแตกต่างของ 2 Model นี้คือคนที่ตรวจสอบว่า Current State(สิ่งที่ระบบเป็นอยู่) กับ Desired State(สิ่งที่เราอยากได้) นั้นต่างกันยังไงคือ Push model จะใช้ controller (จะอยู่ในเครื่องที่ run command) แต่ถ้าเป็น Pull model จะใช้ Agent เป็นคนจัดการ

ความแตกต่างของ Infrastructure as Code แบบ Push และ Pull

ซึ่งเราจะจัดกลุ่มของ Infrastructure as Code ได้ดังนี้

หลังจากที่รู้จักกับ Infrastructure as Code(IaC) กันมาพอสมควรแล้วลองมาดูกันว่า IaC แต่ละตัวนั้นมีวิธีการติดตั้งและใช้งานยังไงบ้าง

Phanupong Permpimol
Follow me