Ansible เป็น configuration management tool ตัวนึง พัฒนาโดยใช้ Python ข้อดีของ Ansible คือมี structure และ configuration ที่ทำการเรียนรู้ได้ โดยไม่ยากนัก ขณะเดียวกัน ก็มีคนทำ template ไว้ให้ใช้แล้ว ค่อนข่างจะเยอะพอสมควร ซึ่งสามารถเข้าไปดูได้ที่ Ansible-galaxy สำหรับตอนนี้เราจะมาดูกัน จะนำเอา Ansible มาช่วยประยุกต์ใช้งาน System Administrator ได้อย่างไรบ้าง ในที่นี้คือ การเพิ่ม-ลบ SSH Public-key pair หรือ พูดให้เข้าใจง่ายๆ คือ การบริหารจัดการ SSH Public-key นั่นเอง อาทิเช่นเรา

กรณี เราต้องทำการเพิ่ม User หรือ Staff เข้าไปยัง Server ที่พนักงานคนนั้นต้องเข้าไปดูแล เช่นกัน หากพนักงานลาออก หรือ เปลี่ยนสายงาน เราก็ต้องมีการบริหารจัดการที่ดีตามนโยบายที่วางไว้ คือ การเพิก-ถอนสิทธิ ต่างๆ ในทรัพยากรขององค์กรออกไปด้วย ในที่นี้คือ SSH access ถ้าทรัพยากรที่เรามีเพียงแค่่ 1-2 เครื่อง คงไม่เป็นไรแต่ถ้าเกิดมากกว่าน้นล่ะ เช่น 10vm หรือ มากกว่า 50เครื่องขึ้นไป ไม่ใช่งานสนุก หรือ ประหยัดเวลาแน่ Configuration หรือ Ansible จะนำเข้ามาช่วยตรงนี้

ติดตั้ง Ansible กรณีนี้เป็นแบบรวบรัดนะครับ ผมติดตังผ่าน python package management.

apt-get install python-setuptools build-essentials

easy_install pip

pip install ansible

ตัว configuration หลักๆ ที่เกี่ยวข้องจะมีอยู่ 3 ไฟล์ หลักๆ คือ

  • playbook ไฟล์ สำหรับกำหนดขั้นตอนที่เราจะทำงาน
  • Inventory ไฟล์ สำหรับระบุ Host หรือ server ต่างๆที่เราจะทำงานด้วย
  • variable ไฟล์ สำหรับ define variable เพื่อให้ Ansible นำไปใช้งานในที่นี้คือ SSH Public-key

Playbook ไฟล์มีอยู่ 1 task และ 2 tags และ ใช้ module ของ Ansible ที่ชื่อว่า authorized_keys เป็นตัวจัดการการทำงาน จะเห็ว่าผมเพิ่ม tags เข้าไปเพื่อจะใช้กำหนดภายหลังว่า ผมจะทำงานแบบไหน ( task ) ซึ่งใน 1 task สามารถที่จะมีได้หลาย tags

---
- hosts: all
connection: local
gather_facts: no
vars_files:
- ./ssh-users.yml
tasks:
- name: Add user key
authorized_key:
user={{ item.user }}
key="{{ item.key }}"
state=present
with_items: ssh_users
tags:
- addkey
- name: Remove user key
authorized_key:
user={{ item.user }}
key="{{ item.key }}"
state=absent
with_items: ssh_users
tags:
- removekey

Variable file สำหรับทำการกำหนดค่า สำหรับการอ้างอิงใน playbook โดยจะเป็นการกำหนดค่าตัวแปลที่จะอ้างถึง SSH Public-key ที่เรามี จากตัวอย่างข้างล่างน้ สมมุติ หน่วย IT เรามีพนักงาน 5 คนดังนั้นจะมี Public-key ที่ต้องใช้ 5 ไฟล์ ( ตามข้างล่าง )

# user IS remote user or SSH user that have key to install
# key IS SSH Public key store
ssh_users:
- user: udomsak
key: "{{ lookup('file', './ssh_keys/udomsak.pub') }}"
- user: udomsak
key: "{{ lookup('file', './ssh_keys/somchai.pub') }}"
- user: udomsak
key: "{{ lookup('file', './ssh_keys/somsri.pub') }}"
- user: udomsak
key: "{{ lookup('file', './ssh_keys/somjai.pub') }}"
- user: udomsak
key: "{{ lookup('file', './ssh_keys/sommai.pub') }}"

Inventory file ( hosts ) สำหรับกำหนด รุปแบบของ resource ( Host หรือ Server ) ที่เราทำงานด้วย ตัวอย่างข้างล่างนี้ เป็นการกำหนดการทำงานเป็น Group หรือ กลุ่มของ Server ช่วยให้เราบริหารจัดการได้ดีขึ้น ยกตัวอย่างเช่น กลุ่มของ Webserver01 มี server ทั้งหมด 2 ตัว และ monitoring 3 ตัว โดยมีการระบุ key-file ที่แตกต่างกัน

[webserver01]
www.google.com ansible_ssh_user=web ansible_ssh_private_key=/home/udomsak/.ssh/id_rsa_google_site
www.example.com ansible_ssh_user=ftp ansible_ssh_private_key=/home/udomsak/.ssh/id_rsa_example_site
[monitoring]
monitor01.example.com
monitor02.example.com
monitor03.example.com

หลังจากทำเสร็จแล้วเราสามารถทดสอบ playbook เราคร่าวๆ โดยใช้คำสั่งนี้

ansible-playbook ssh-manage.yml --check

ทีนี้เมาดูส่วนที่เหลือสำหรับ Ansible อยากจะบอกอีกนิดว่า Playbook คือไฟล์ที่รวมขั้นตอนการทำงานเอาไว้เรียกว่า Task เอาไว้ ในกรณีถ้าเราไม่ได้แยกการทำงาน ( Task ) เอาไว้เป็น Playbook สำหรับการทำงานแต่ละอย่างเป็นไฟล์ๆ ไป ถ้าเราสั่งให้ Ansible ทำงานมันจะทำการ execute task ทุกอย่างใน Playbook ตั้งแต่บนลงล่าง

ดังนั้นจึงมีคอนเชปต์ของ tags สำหรับระบุหรือแยกเอาไว้ภายหลังว่า เราจะ execute บางส่วนของ Task นั้นตามใจเรา และ เนื่องจากในตัวอย่างนี้ผมได้ทำการรวมเอาทุกฟังก์ชั่นการทำงานเอาไว้ภายใน ไฟล์ Playbook เดียวถ้าผมสั่ง execute จะทำให้มันได้ผลลัพธ์ไม่ตรงกันกับที่เราต้องการ ผมเลยใส่เป็น tags เพิ่มเอาไว้ เพื่อให้เรียกใช้ได้เฉพาะส่วนตามต้องการ

ตัวอย่างการ execute โดยการใช้ tags เข้ามาช่วย

ansible-playbook -i hosts ssh-manage.yml --tags adduser //สำหรับทำการ add user key

ansible-playbook -i hosts ssh-manage.yml --tags removeuser //สำหรับทำการ remove user key

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

เพิ่มเติมอีกเล็กน้อยสำหรับ เทคนิคการใช้งานตัว Ansible เมื่อทำการศึกษา Ansible ใหม่มักจะงง กับ Playbook structure folder และความสับสนในการใช้งาน จึงจำเป็นต้องมีตัวช่วยในการใช้งาน คือ Ansible-role-manager ช่วยในการทำ template folder ให้เราไม่ว่าจะเป็น Playbook, Role.

ติดตั้ง Ansible-role-manager

apt-get install python-setuptools

easy_install pip

pip install ansible-role-manager

หลังจากนั้นเราจะใช้ Ansible role manager เป็นตัวสำหรับสร้าง template directory ให้เรา ถ้าหากอยากจะประหยัดเวลาให้ไป clone มาได้จาก github โดยโครงสร้างจะเป็นตามนี้

├── group_vars
│   ├── production1
│   └── production2
├── hosts
├── host_vars
│   ├── production1a.example.com
│   └── production2b.example.com
├── library
│   └── README
├── production
├── removeuser.yml
├── roles
│   └── README
├── site.yml
├── ssh_keys
│   ├── user1
│   ├── user2
│   ├── user3
│   ├── user4
│   └── user5
├── ssh-manage.yml
└── useradd.yml

Comments are closed.