Header Ads Widget

Ticker

6/recent/ticker-posts

Ansible Phần 1: Làm quen với tự động hóa bằng Ansible

Tôi sẻ bắt đầu với một vấn đề đó là bạn có 10 máy server và cần setup cho 10 máy này, bạn không thể setup từng máy với từng thao tác được, nếu set 10 máy nghĩa là ta phải thực hiện đúng 10 lần thao tác như nhau, nhưng với Ansible bạn có thể thực hiện set cho 10 máy chỉ với 1 lệnh duy nhất bởi mọi thứ hoạt động chủ yếu dựa vào IP thông qua SSH

Ansible là gì ?

Ansible là một platform opensource, nghĩa là bạn có thể viết thêm hay chỉnh sửa tuỳ ý. Ansible khá đơn giản để sử dụng. Nôm na bạn có thể hình dung là chỉ việc khai báo địa chỉ server và những điều muốn làm với server đó vào ansible, rồi sau đó chỉ cần chạy script bạn vừa viết trên và ngồi uống trà chờ hoàn thành.

Thành Phần Trong Ansible

Cái này cũng khá nhiều nhưng về cơ bản thì có các phần sau:
  • Playbooks - Là nơi bạn sẽ khai báo kịch bản chạy cho server nơi chứa các Task của chúng ta, nếu bạn muốn thực hiện cùng các nhiệm vụ đó trên nhiều con server thì bạn chỉ cần liệt kê tên server hay tên group server. Khai báo tên server hay group server sẽ nằm trong phần Inventory nhé.
Ở trên có 2 Task cần chạy:
  1. Task 1: Chạy lệnh ngày
  2. Task 2: Chạy file Script
  • Tasks - Là những công việc nhỏ trong cuốn sổ Playbooks trên 
  • Inventory - Khai báo địa chỉ server cần được setup 
#Local Test
[all:vars]
ansible_user='ubuntu'           #Username may thuc thi
ansible_become='yes'             #Chay commands nhu la root
ansible_become_pass='{{ my_user_password }}' # Mat khau cho sudo user 
ansible_become_method='sudo'     #Su dung sudo de thuc thi nhu la root
[lanhosts]
192.168.194.132
Ban sẻ chú ý thấy rằng [lanhosts] mà mình khai báo ở trên sẻ là group server còn phí dưới là địa chỉ IP của từng server, đối với server window, Ansible cung cấp kiểu connect là winrm. Bên cạnh đó cách khai báo password cũng khác với Linux. Ở window sẽ sử dụng param ansible_ssh_pass, còn linux là ansible_password.
  • Modules - Những chức năng hỗ trợ cho việc thực thi tasks dễ và đa dạng 
Sẻ có rất nhiều Modules nhưng đây là một số modules cơ bản trong Ansible mà mình tìm hiểu được
  1. System: Bao gồm các module như User, Group, Hostname, Systemd, Service, v.v... 
  2. Commands: Thường có module con như Command, Expect, Raw, Script, Shell, v.v...
  3. Files: Các module làm việc với file như Copy, Find, Lineinfile, Replace, v.v...
  4. Database: Ansbile cũng support mạnh mẽ những module làm việc với DB như Mongodb, Mssql, Mysql, Postgresql, Proxysql, v.v...
  5. Cloud: Ansible cũng không quên kết hợp với các dịch vụ clound nổi tiếng như Amazon, Google, Docker, Linode, VMware, Digital Ocean, v.v...
  6. Windows: Mạnh mẽ với những module như win_copy, win_command, win_domain, win_file, win_shell
  • Variables - Cũng như các đoạn mã lập trình khác thì đây là nơi chứa biến

  • Conditions - Cho phép thực hiện chạy lệnh với điều khiện thực hiện bằng Where 

  • Loops - Nó giống như vòng lặp trong các đoạn code bình thường. 
---
- hosts: lanhosts
  tasks:

          - name: Get date for testing purpose
            command: /bin/date
            changed_when: False
            register: date


          - debug: var={{ item }}
            with_items:
                    - date.stdout
  • Roles - Nó sẻ giúp bạn phân chia khu vực với các nhiệm vụ riêng biệt. 

Bây giờ chúng ta bắt đầu cài đặt Ansible cho Linux
sudo apt-get update && sudo apt-get upgrade
Kiểm tra gói Package Ansible bằng lệnh
sudo apt-get search ansible
sudo apt-get show ansible
sudo apt-get install ansible
Sau khi đã cài đặt ta thực hiện check version Ansible coi đã cài đặt hoàn tất chưa
ansible --version

Tiếp đến chúng ta bắt đầu thực hiện tạo file SSH Key của máy của chúng ta, tại sao phải tạo file này, đơn giản khi bạn connect SSH đến 1 máy Ubuntu thông thường việc đầu tiên nó sẻ hỏi Pass của chính bạn, tiếp đến sẻ là Pass của User đó, nhưng Ansible lại chạy trên nền SSH vì vậy phải thực hiện xuất file Pass SSH của máy mình dưới dạng mã hóa để khi truy cập đến máy thực thi ta không còn yêu cầu Password nữa, để làm điều này ta bắt đầu thực hiện các vấn đề sau
Tạo File SSH Key của chính bạn
ssh-keygen -t ed25519 -C "My SSH Key"
Trong đó ssh-keygen là phương thức tạo file mã hóa Pass của chúng ta và ed25519 là chuẩn mã hóa, sau khi enter nó sẻ tạo 2 file trong máy

Để có thể truy cập đến máy thực thi ta phải sao chép file Pass Mã hóa của chúng ta đến máy thực thi bằng câu lệnh sau, file ta cần chép sẻ là file id_ed25519.pub
ssh-copy-id -i $HOME/.ssh/id_ed25519.pub [email protected]
User là ubuntu và 192.168.194.132 là IP của máy thực thi, ở máy thực thi sau khi copy key của mình xong sẻ có dòng key mã hóa này
ok ta sẻ bắt đầu test thử bằng cách ssh vào máy thực thi như bình thường
ssh [email protected]
Awesome ! bạn sẻ thấy rằng nó không còn yêu cầu Pass khi truy cập ssh nữa Tiếp đến ta sẻ tạo một file inventory với lệnh
sudo vi inventory
trong khung edit write điền vào địa chỉ IP của máy thực thi lệnh giống như trong hình cho file inventory
thực hiện test thử khi chạy 2 lệnh 'uptime' và 'lsb_release -a' để thấy được thời gian và hệ điều hành của máy: (-m là loại module, -k là nhập password, , -u là user, -i là đường dẫn host define)
ansible -u ubuntu -i inventory -m raw -a 'uptime' lanhosts
ansible -u ubuntu -i inventory -m raw -a 'lsb_release -a' lanhosts
Tôi bắt đầu tạo 1 file date.yml vì đây là 1 file Playbook nên đuôi của nó là yml với nội dung như sau, các bạn nên cẩn trọng vì mọi dấu cách hoặc dấu phẩy cũng khiến cho file Playbook không thể thực thi được, ở trong file date.yml này tôi đã sử dụng phần Loops để giải quyết vấn đề, nếu như cách thông thường thì bạn sẻ viết file như thế này
cho từng service nhưng làm điều đó rất lâu, vì cài đặt nhiều gói services ở đây vì thế mình đã tích hợp luôn sẵn phần Loops mình đã giới thiệu ở đầu bài để thực hiện cho công việc dễ dàng hơn và con script nhìn đẹp mắt hơn. bởi Ansible có hỗ trợ tại sao ta không sử dụng nó chứ đúng không hehe
Ok quay lại ở trên ta đã khai báo về máy thực thi với file inventory các thông tin cơ bản cũng như IP và đã có 1 file Playbook date.yml bây giờ ta bắt đầu build thử ta sẻ được kết quả như hình bên dưới
Tôi sẻ thêm vài thông tin máy chủ vào file inventory như sau để việc thực thi file một cách bảo mật hơn cho việc quản lý các máy thực thi:
trong đó phần ansible_become_pass='{{ my_user_password }}' để chúng ta điền password của máy thực thi file còn không chúng ta có thể để ansible_become_pass='MyPassword' nhưng như vậy thì thật sự quá tệ và kém bảo mật, nên vì thế ta thực hiện lệnh mã hóa để tạo file password.yml
File passwords.yml là file chứa pass root của máy thực thi khi ta bấm lệnh tạo ở trên nó sẻ yêu cầu tạo password, pass này là password bảo vệ file passwords.yml sau khi đã nhập password bảo vệ file passwords.yml ta sẻ viết 1 dòng lệnh chứa passwords root của máy thực thi và đơn nhiên pass này sẻ được mã hóa chèn đoạn code sau vào trong file passwords.yml
my_user_password: chỗ này là password root của máy thực thi
ta cùng xem file passwords.yml sau khi tạo sẻ như thế nào nhé như vậy dòng lệnh ở trên đã được mã hóa và ta không còn thấy pass root của máy thực thi nữa
Tuyệt vời toàn bộ đã được mã hóa coi bộ khá bảo mật, bắt đầu chạy dòng lệnh sau để thực hiện Playbook date.yml nó sẻ yêu cầu bạn nhập password bảo vệ file passwords.yml
Ok như vậy đã xong phần Test thử và làm quen với Ansible

Post a Comment

0 Comments