Ansible Fundamentals - Ad-hoc Commands
Introduction. Việc triển khai và quản lý servers một cách đáng tin cậy và hiểu quả không phải là một công việc đơn giản. Khi những công cụ như Ansible chưa xuất hiện, luôn có một rào cản giữa các quản trị viên hệ thống (system administrators) với các nhà phát triển (developers) cũng như người ...
Introduction.
Việc triển khai và quản lý servers một cách đáng tin cậy và hiểu quả không phải là một công việc đơn giản. Khi những công cụ như Ansible chưa xuất hiện, luôn có một rào cản giữa các quản trị viên hệ thống (system administrators) với các nhà phát triển (developers) cũng như người dùng cuối (users). Các quản trị viện thường phải quản lý servers một cách thủ công từ những công việc như cài đặt phần mềm, thay đổi cấu hình và quản lý các services. Đối với các hệ thống nhỏ, việc quản lý như vậy có thể chấp nhận được. Tuy nhiên với các hệ thống phức tạp với hàng trăm servers, việc quản lý như vậy là không hiểu quả (nêu không muốn nói là không thể) và thường gây ra lỗi.
Chính vì lý do đó, việc có các công cụ để quản lý cấu hình - configuration management cũng như hỗ trợ quá trình server provisioning là cần thiết. Thay vì phải triển khai (deploying), thay đổi/cập nhật (patching) và hủy bỏ (destroying) servers thủ công, các công việc đó có thể được tự động hóa với rất ít hoặc không có sự can thiệp từ các quản trị viên.
Khi hệ thống ứng dụng trở nên phức tạp hơn, việc tách biệt quản trị viên hệ thống và các nhà phát triển là không được khuyến khích. Chúng ta cần tích hợp công việc của hai bên lại nếu có thể. Đó cũng là một trong những nguyên nhân mà chúng ta có thuật ngữ DevOps hay SRE - Site Reliability Engineering. Chúng ta sẽ không bàn đến định nghĩ của các khái niêm kia do nó đôi khi quá trừu tượng. Khi các nhà phát triển coi infrastructure như một phần quan trọng trong quá trình phát triển ứng dụng, độ ổn định cũng như hiệu năng sẽ có tính quy chuẩn cao hơn. Ngược lại khi các quản trị viên hệ thống (hay sysadmins) làm việc chặt chẽ hơn với các nhà phát triển, tốc độ phát triển ứng dụng sẽ được cải thiện. Từ đó sẽ có nhiều thời gian hơn cho việc cải thiện hiệu năng hệ thống cũng như đưa ra các thử nghiệm mới.
Ansible là một công cụ giúp cho việc thực hiện DevOps dễ dàng hơn. Nó có thể được coi như một ngôn ngữ chung giữa sysadmins, developers hay thậm chí là cả người dùng.
Why using Ansible?
Các bạn có thể tìm hiểu thêm ở đây - https://www.ansible.com/overview/it-automation cũng như trong Documentation của Ansible. Tuy nhiên có một số điểm sau đây khiến cho Ansible trở thành một công cụ khá phổ biến:
- Clear & Simple: Ansible sử dụng YAML một định dang dữ liệu tương tự JSON nhưng đơn giản hơn khá nhiều. Chúng ta chỉ cần làm quen mới một số thành phần trong YAML như variables, objects, lists, data types, anchors, references là có thể đọc và hiểu Ansible. YAML khá dễ dàng đối với các developers và sysadmins.
- Pretty Fast: Ansible rất dễ học và sử dụng ở mức cơ bản. Ansible là agentless do chúng ta không cần cài đặt các agents hay daemons trên các servers.
- Complete && Efficient: Thông thường chúng ta phải sử dụng các công cụ khác nhau cho việc quản lý cấu hình - configuration management (Puppet, Chef), deployment (Capistrano, Fabric) hay thực hiện các lệnh ad-hoc (SSH). Ansible có thể kết hợp ba việc đó lại và giấu đi hầu hết các công việc phức tạp cần thực hiện.
- Secure: Ansible sử dụng SSH để quản lý các hosts.
Learning Resources.
Tất nhiên bài viết của mình không thể đề cập mọi khía cạnh của Ansible một cách chi tiết (mình cũng chỉ làm quen với Ansible trong một hai tháng trở lại đây). Sau khi đã làm quen với các kiến thức cơ bản, bạn có thể tìm hiểu và đọc thêm tài liệu ở một số nguồn sau đây:
- Official Ansible Documentation - Ansibe Core
- Ansible Project on GitHub
- Ansible Blog
- Ansible Glossary
- Ansible Forum
- Ansible Examples
- Ansible Subreddit
Development environment.
Ansible có thể làm việc với remote hoặc local server miễn là chúng ta có quyền truy cập đến các server đó. Tuy nhiên để thuận tiện cho việc testing chúng ta sẽ sử dụng local servers. Thông thường chúng ta sẽ thực hiện các công việc trên local server trước khi triển khai lên production server (TDD). Để thực hiện các ví dụ trong các phần tiếp theo, chúng ta sẽ sử dụng Vagrant để cài đặt các local servers (virtual machines). Chúng ta sẽ cần cài Virtual Box và Vagrant (việc này khá đơn giản nên mình sẽ không đề cập ở đây).
- Cài đặt Ansible: http://docs.ansible.com/ansible/latest/intro_installation.html
- Cài đặt Vagrant: https://www.vagrantup.com/downloads.html
- Cài đặt Virtual Box: https://www.virtualbox.org/wiki/Downloads
Lưu ý servers trong ví dụ của chúng ta sẽ là Debian (cụ thể là Ubuntu 16.04). Mình thường sử dụng bento/ubuntu-16.04, tuy nhiên bạn có thể sử dụng các vagrant box khác nếu muốn. Nếu bạn dùng CentOS hay loại server nào khác, một số command, service có thể sẽ có sự khác biệt.
Một trong những tính năng quan trọng của Vagrant đó là Server provisioning. Khi chạy lệnh vagrant up lần đầu tiên, Vagrant sẽ tự động provisions các virtual machines được khởi tạo sử dụng các provisioners được định nghĩa trong Vagrantfile. Sau khi các khởi tạo các virtual machines, chúng ta có thể sử dụng lệnh vagrant provision để chạy lại các provisioners nếu cần thiết.
Ansible là một trong những provisioner được cung cấp sẵn bởi Vagrant (cùng với một số provisioner khác như shell, Chef, Docker, hay Puppet). Khi chúng ta sử dụng vagrant provision hay vagrant up (lần gọi đầu tiên), Vagrant sẽ trao quyền xử lý cho Ansible, ở đây Ansible có thể chạy một playbook được định nghĩa trước. Dưới đây là một cách sử dụng Ansible provisioner với Vagrant đơn giản:
# Inside Vagrantfile config.vm.provision "ansible" do |ansible| ansible.playbook = "main.yml" end
Ở đây main.yml sẽ là một Ansible playbook (sẽ được bàn luận trong các bài viết sau) cùng thư mục với Vagrantfile.
Sau đây chúng ta sẽ định nghĩa 3 local servers đơn giản để thuận tiện cho việc trình bày trong phần sau. Ba local servers đó bao gồm 2 application servers và 1 database server được minh họa trong hình bên dưới:
Thông thường chúng ta sẽ có một load balancer đứng trước hai application servers. Để đơn giản cho việc minh họa các ví dụ chúng ta sẽ loại bỏ load balancer ở đây đi.
Nội dụng của Vagrantfile sẽ như sau:
# -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure("2") do |config| config.vm.box = "bento/ubuntu-16.04" config.ssh.insert_key = false config.vm.synced_folder ".", "/vagrant", disabled: true config.vm.provider :virtualbox do |v| v.memory = 256 v.linked_clone = true end config.vm.define "app1" do |app| app.vm.hostname = "app1.test" app.vm.network :private_network, ip: "192.168.60.4" end config.vm.define "app2" do |app| app.vm.hostname = "app2.test" app.vm.network :private_network, ip: "192.168.60.5" end config.vm.define "db" do |db| db.vm.hostname = "db.test" db.vm.network :private_network, ip: "192.168.60.6" end end
Các thông số có thể thay đổi theo ý muốn, mỗi server sẽ được gán với một private IPv4 address. Chạy lệnh vagrant up chúng ta sẽ có môi trường để thử nghiệm Ansible.