มาเขียน ansible playbook กัน (part 1)
ansible เป็น software ที่ช่วยในการ automate การ setup server โดยวันนี้เราจะมาลองเขียน ansible playbook กัน
โดยก่อนจะเริ่มกัน เราจะ setup ansible control node ด้วย environment ดังนี้
- มี non-root account ที่สามารถเข้าผ่าน ssh key ได้ ซึ่งสามารถเตรียมได้ตาม link นี้
- ติดตั้ง ansible และเตรียม inventory file ของ ansible host เรียบร้อยแล้ว ( ทดสอบ ping ด้วย ansible ผ่าน ) ซึ่งสามารถเตรียมได้ตาม link นี้
โอเค มาเริ่มกัน
ก่อนอื่น เราจะสร้าง folder กันก่อน ตามคำสั่งดังนี้
cd ~
mkdir ansible-practice
cd ansible-practice
โดยเราจะ copy inventory file ที่เราเขียนไว้ตาม link นี้ มาใส่ใน folder นี้ โดยใช้คำสั่ง
cp /etc/ansible/hosts ~/ansible-practice/inventory
จากนั้น สร้าง playbook file โดยใช้คำสั่ง
nano playbook-01.yml
โดยเราจะเขียน file ตามนี้
โดยจาก file playbook สามารถแบ่ง field ต่างๆ ได้ดังนี้
- hosts: all เพื่อให้ทุกๆ hosts ใน inventory ทำ tasks ที่กำหนด
- tasks: เป็น array ลำดับคำสั่ง โดยเราสามารถกำหนด name ของแค่ละ task ได้
- debug: ใช้ในการ debug โดยเราจะใช้ msg เป็น comment เมื่อเสร็จ task นั้นๆ
จากนั้น run playbook โดยใช้คำสั่ง
ansible-playbook -i <inventory-file-path> <playbook-file-path>-u <username-ansible-host>
จะได้ผลลัพธ์ดังนี้
การกำหนด variable ใน playbook
สามารถกำนหนดตัวแปรในรูปแบบ key: value ผ่าน field vars ได้ดังนี้
โดยการเข้าถึงตัวแปรจะใช้ syntax {{ key }} นั่นเอง
การกำหนดเงื่อนไข ใน playbook
สามารถกำหนดเงื่อนไขผ่าน field when ได้ดังนี้
เมื่อรันจะได้ผลลัพธ์ตามนี้
จะเห็นได้ว่า task1 ถูกข้ามไป เนื่องจาก condition fail
นอกจากนี้ เรายังสามารถนำผลลัพธ์จาก task ก่อนหน้า มาเป็นเงื่อนไขของ task ต่อๆไปได้ด้วย โดยใช้ field register ตามนี้
โดยเราจะลองรัน ls ~/test_file เพื่อดูว่ามีไฟล์รึเปล่า ถ้าไม่มีจะสร้าง และถ้ามีจะ show message ว่ามีนั่นเอง
โดย syntax แต่ละอัน ทำงานดังนี้
- command ทำการรัน command ที่กำหนด
- register เก็บผลลัพธ์จาก command มาใส่ในตัวแปร
- ignore_errors แม้ command errors ให้ทำ task ต่อไปอยู่ดี
- file path และ state เป็นการนำ command ที่เกี่ยวกับ file system มาเขียนในรูปแบบที่อ่านง่ายขึ้น โดยตัว command จะกลายเป็น state นั่นเอง
- when: <variable> is succeeded หรือ failed ใช้ในการกำหนดเงื่อนไขการทำงานของ task
เมื่อรันครั้งแรกจะได้ผลลัพธ์ดังนี้
และเมื่อรันครั้งที่สองจะได้ผลลัพธ์ดังนี้
เนื่องจาก ls ไม่ได้ error แล้วนั่นเอง
การวน loop ใน playbook
เราสามารถใช้ field loop และ item ในการวนลูปได้ดังนี้
โดย loop จะใช้ในการกำหนดสมาชิกของลูป และ item จะใช้ในการเข้าถึงสมาชิกแต่ละตัวของ loop นั่นเอง
โอเค part 1 ประมาณนี้ก่อนแล้วกันนะ part ต่อไปเราจะมาลองลง package และเขียน template กัน