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