A001 | เริ่มต้นกับ Ansible – Inventory

Ansible เป็นเครื่องมือจัดการการตั้งค่า Server ที่เราสามารถเขียนบอกว่าต้องการให้มี/ไม่มีอะไรบน server โดยใช้ syntax ของ YAML ในการเขียน โดยโครงสร้างหลักๆ จะแบ่งเป็น 4 ส่วนดังนี้

  1. inventory
  2. playbook
  3. role
  4. module/collection

ซึ่งข้อ 4 จะเป็นสิ่งที่มีสำเร็จรูปมาให้แล้ว แต่อาจต้องโหลดเพิ่มผ่านคำสั่ง ansible-galaxy collection อีกที โดยสามารถดู collection ที่มีอยู่แล้วได้ด้วยคำสั่ง ansible-galaxy collection list ส่วนการทำอะไรต้องการ collection ไหนให้ดูในเอกสารของ ansible module นั้นๆ อีกครั้ง

Inventory

การเริ่มใช้งาน ansible (ไม่นับขั้นตอนติดตั้ง) สิ่งแรกที่เราต้องมีก็คือ inventory file ที่จะให้ ansible รู้ว่าเรากำลังจะจัดการเครื่องไหนบ้าง โดยโครงสร้างที่ง่ายที่สุดคือโครงสร้างแบบ ini file ดังนี้

[groupname]
host1
host2

(สมมติว่าเซฟในชื่อไฟล์ชื่อ hosts)

เมื่อมีไฟล์ inventory แล้ว เราสามารถเรียกใช้ ansible โดยให้เรียกไฟล์ inventory ได้โดยการใส่ parameter -i hosts (แก้คำว่า hosts เป็นชื่อไฟล์ inventory ที่เราสร้างขึ้นมา) เพิ่มในคำสั่ง ansible หรือ ansible-playbook ตอนเราสั่ง หรือสามารถตั้งค่าในไฟล์ ansible.cfg ให้ใช้งานไฟล์ inventory นี้โดยอัตโนมัติก็ได้ โดยสร้างไฟล์ชื่อ ansible.cfg ไว้ใน folder เดียวกัน แล้วใส่ข้อความลักษณะประมาณนี้

[defaults]
inventory = hosts

โดยปกติแล้ว ansible จะเชื่อมต่อไปหา server ตามที่เราระบุผ่าน ssh config และจะพยายามใช้ ssh key ในการเชื่อมต่อ (ถ้ามี) โดยถ้าไฟล์ private key ของเราไม่ใช่ชื่อ ~/.ssh/id_rsa ก็สามารถระบุตัวแปรเพิ่มไปใน inventory ได้ว่าให้แต่ละ host ใช้ key ไหน

[groupname]
host1 ansible_private_key_file="/home/user/.ssh/privatekey1"
host2 ansible_private_key_file="/home/user/.ssh/privatekey2"

หรือถ้าทั้ง group ทุก server ใช้ key เดียวกันหมดก็สามารถกำหนดเป็น variable ของ group ก็ได้เช่นกัน เช่น

[groupname]
host1
host2
 
[groupname:vars]
ansible_private_key_file="/home/user/.ssh/privatekey1"

หรือหากเราต้องการใช้รหัสผ่านในการเชื่อมต่อ (ไม่แนะนำ) สามารถตั้งรหัสผ่านไว้ให้แต่ละ host ได้ (ย้ำว่าไม่แนะนำ อย่าหาทำ) ลักษณะดังนี้

[groupname]
host1 ansible_password="123456"
host2 ansible_password="abcdef"

เมื่อได้ inventory แล้วสามารถทดสอบการเชื่อมต่อไปหา host ปลายทางได้โดยใช้คำสั่งดังนี้

 ansible -i hosts -m ping all 

หากไม่สามารถเชื่อมต่อได้ ให้ลองเพิ่ม option -vvv ลงไปเพื่อดูว่า ansible เชื่อมต่อไปยัง server ปลายทางด้วย user/คำสั่งอะไรยังไง แล้วแก้ไขการตั้งค่าของ ansible ให้ถูกต้องอีกครั้ง

ansible จะใช้การตั้งค่าของ ssh client ตามที่เราตั้งค่าไว้ (~/.ssh/config) ดังนั้นสามารถตั้งค่าการเชื่อมต่อในนี้ก็ได้เช่นกัน

0253 | update cloudflare ในไทยปี 2022

ของเก่าเคยพูดถึงไว้เมื่อปี 2017 ครับ แล้วมันเปลี่ยนไปเยอะมากๆ แล้ว สถานการณ์ตอนนี้เป็นประมาณนี้

3bb

  • เจ้าแรกที่ cloudflare เข้ามาติดตั้ง ISP node
  • ต่อกับ AS45758 (3BB ISP)
  • 172.68.4.0/22, 2400:cb00:86::/48
  • ประกาศ route ของ node cloudflare มาทาง domestic เรียบร้อยแล้ว

True

  • ต่ออยู่กับ TICC-IIG (AS38082 — gateway ออกต่างประเทศของทรู)
  • 172.68.240.0/22, 2400:cb00:129::/48
  • ทาง True ประกาศ route “เฉพาะ IPv4” ของ node cloudflare มาทาง domestic ผ่าน AS55554 ไว้ให้
  • ส่วน กรณีต่อหา origin ในไทยด้วย IPv6 จะวิ่งอ้อมทาง inter

NT (TOT)

  • ต่ออยู่กับ NT-IIG (AS38040)
  • 172.68.104.0/22, 2400:cb00:104::/48
  • ไม่มีการประกาศ route เข้ามาทางขา domestic ทั้ง ipv4 และ ipv6

DTAC

  • ต่ออยู่กับ AS10089
  • 162.158.204.0/23, 2400:cb00:175::/48
  • ไม่มีการประกาศ route เข้ามาทางขา domestic ทั้ง ipv4 และ ipv6

AIS

  • ต่ออยู่กับ AWN IIG AS45430
  • กรุงเทพ 172.68.232.0/22, 2400:cb00:127::/48
  • (น่าจะ)สุราษฎร์ธานี 172.70.195.0/24, 2400:cb00:435::/48
  • ไม่มีการประกาศ route เข้ามาทางขา domestic ทั้ง ipv4 และ ipv6

NT (CAT)

  • ต่ออยู่กับ NT-IIG (AS4651) และ Thailand-IX (เพิ่งต่อสดๆ ร้อนๆ)
  • 172.70.116.0/24, 2400:cb00:480::/48
  • ประกาศเข้าภายในประเทศเรียบร้อยทั้ง IPv4 และ IPv6

แปลว่า ถ้า server คุณอยู่ภายในประเทศ และผู้เข้าชมเว็บใช้เน็ต NT TOT, DTAC หรือ AIS (ในระหว่างที่ cloudflare ของ ISP นั้นๆ ทำงานปกติ) — ซึ่งก็มีปริมาณเยอะเอาเรื่องอยู่ — ข้อมูลก็จะวิ่งอ้อมต่างประเทศก่อนกลับมาเข้า server ต้นทางให้ช้าลงเล่นๆ

Tags: