Skip to content
OMZ logo

Back to ansible

Bắt đầu với Ansible trong 5 phút

Đặng Văn Đại

@daikk115

Hà Mạnh Đông

@hamanhdong

Trong loạt bài về Ansible này, mình sẽ sử dụng Ubuntu 20.04, các bạn nếu cài đặt trên môi trường khác ví dụ CentOS thì vui lòng google từ khóa của bước đó + trên CentOS

Lịch sử IT automation

IT automation

IT automation trong ngữ cảnh rộng lớn của IT, là các processes và các softwares giúp ta quản lý IT infrastructure (bao gồm các thành phần như: servers, networking, và storage). Vào những thời gian đầu của IT, có rất ít các servers và cần rất nhiều sysadmin để quản trị những server đó, thường ít nhất là 2 sysamdin cho mỗi server. Và việc mà các sysadmin phải làm như cài đặt phần mềm, nâng cấp version hay thay đổi các file config đều được thực hiện một cách thủ công. Do đó, việc quản lý tốn rất nhiều công sức và thường dễ xảy ra lỗi, vì vậy nhiều sysadmin đã bắt đầu dùng các scripts để giúp họ dễ dàng quản lý servers hơn. Nhưng các script này vẫn khá phức tạp và được tổ chức chưa tốt.

Khi công nghệ phát triển, các servers cũng trở nên tin cậy, ít lỗi hơn, và dễ dàng để quản lý hơn, các data center phát triển rất nhiều do nhu cầu của các công ty. Và để tốn ít chi phí, các công ty đã sử dụng virtualization, tạo ra hàng loạt các servers giống nhau. Vì vậy, mỗi sysadmin phải quản lý rất nhiều servers cùng lúc, nên cần phải có sự xuất hiện của các configuration management tools để thay thế cho các scripts đã được sử dụng trước đó.

CFEngine là tool quản lý cấu hình đầu tiên từ năm 1990, và hiện tại có rất nhiều tools khác hiệu quả và dễ sử dụng hơn như: Puppet, Chef, Salt và Ansible.

Các loại IT automation

Có rất nhiều cách để phân loại IT automation systems, nhưng cách phân loại dựa trên "how the configurations are propagated" là hay được sử dụng nhất. Dựa trên cách phân loại đó, ta có thể chia ra làm 2 loại là:

  • Agent-based systems: có 2 components khác nhau là 1 server và 1 client được gọi là agent. Chỉ có 1 server và server đó chứa tất cả cấu hình cho môi trường của bạn, trong khi các agents là rất nhiều các máy tính trong môi trường đó sẽ connect với máy chủ. Trong một số trường hợp cũng có thể có nhiều hơn 1 server để đảm bảo tính high availability, nhưng các máy này phải có cấu hình giống hệt nhau. Các máy client sẽ gửi request định kỳ tới server để kiểm tra xem có cấu hình mới cho client đó hay không. Nếu có thì client sẽ download cấu hình đó về và áp dụng cấu hình đó.
  • Agent-less systems: trong agent-less systems không có agent cụ thể nào, và agent-less systems không thực hiện đúng theo mô hình server/client mà có rất nhiều servers, thậm chí số lượng servers có thể bằng số lượng client. Việc giao tiếp sẽ được bắt đầu từ phía server khi muốn áp dụng configutations mới cho 1 hoặc nhiều client thông qua các standard protocols (thường là SSH và PowerShell).

Ngoài ra, đánh giá mức độ bảo mật giữa 2 mô hình trên thì agent-based system sẽ kém bảo mật hơn. Do tất cả các máy đều được kết nối với server chứa toàn bộ config nên server này sẽ dễ bị tấn công hơn. Còn trong mô hình agent-less systems khả năng tấn công thấp hơn do các máy có firewall sẽ không chấp nhận bất kì connection nào. Agent-less system dễ dàng hơn để tích hợp với 1 cơ sở hạ tầng đã có, do các máy tính trong cơ sở hạ tầng đó sẽ được coi như là các máy clients và chỉ cần thực hiện kết nối SSH tới để triển khai cấu hình mà không cần phải thêm các cấu hình bổ sung như việc thực hiện connection client/server như trong agent-base system.

Anisble là gì?

Ansible là 1 agent-less IT automation tool được phát triển bởi Michael DeHaan năm 2012. Ansible được tạo ra với mục đích là: minimal, consistent, secure, highly reliable and easy to learn.

  • Opensource
  • Automation tool
  • Agentless

Ansible làm được gì?

Ansible chủ yếu chạy trong chế độ push sử dụng SSH, nghĩa là ta sẽ push các configurations từ server tới các agent. Nhưng ta cũng có thể chạy ansible sử dụng ansible-pull, nghĩa là ta có thể cài đặt ansible lên mỗi agent, sau đó download các playbook từ server về và chạy khi có 1 số lượng lớn các máy tính (số lượng lớn này là bao nhiêu thì tùy thuộc, nhưng ở đây là nhiều hơn 500 máy) và các updates cần thực hiện song song.

  • Đứng từ 01 server để cấu hình cho hàng trăm server cùng lúc.
  • Tương tự cho việc cài đặt gói hay thực hiện các lệnh shell bất kỳ.
  • Backup cấu hình tập trung từ các server về 01 server.
  • Triển khai các dịch vụ khác nhau lên các server với quy hoạch cho trước bằng 1 câu lệnh duy nhất.
  • ....nhiều lắm....

Ý niệm đơn giản nhất về Ansible trong tôi?

  • Thay vì SSH bằng tay tới các server cấu hình thì tôi dùng Ansible.
  • Local machine: nơi cài đặt Ansible và thực hiện câu lệnh ở đó
  • Remote machine: nơi cần SSH đến và tác động.

Chuẩn bị

  • Một máy tính/máy ảo A cài đặt Ubuntu 20.04
  • Một máy tính/máy ảo B khác cài đặt 20.04
  • Chạy lệnh ssh để log in vào B từ A thành công

Note

  • Với phần bắt đầu nhanh này, hãy copy và paste để có trải nghiệm sớm nhất với Ansible
  • Các khái niệm như group, inventory, playbook sẽ chưa giới thiệu cụ thể ở bài này

01 phút cài đặt ansible

$ sudo apt update.
$ sudo apt install software-properties-common
$ sudo apt-add-repository --yes --update ppa:ansible/ansible
$ sudo apt install ansible sshpass

02 phút để chạy ansible đầu tiên

  • Tạo file inventory (cập nhật IP, port, login user và password)
cat << EOF > inventory
[group1]
192.168.2.106 ansible_port=32768 ansible_user=root ansible_password=mypass
EOF
  • Tạo file playbook
cat << EOF > ls-la.yml
- hosts: group1
  gather_facts: false
  tasks:
    - shell: ls -la
      register: output
    - debug:
        msg: "{{ output.stdout_lines }}"
EOF
  • Thực hiện chạy playbook đầu tiên: ansible-playbook -i inventory ls-la.yml
$ ansible-playbook  -i inventory ls-la.yml
 [WARNING] Ansible is in a world writable directory (/tmp), ignoring it as an ansible.cfg source.

PLAY [group1] ****************************************************************************************************************************************

TASK [shell] *****************************************************************************************************************************************
changed: [192.168.2.106]

TASK [debug] *****************************************************************************************************************************************
ok: [192.168.2.106] => {
    "msg": [
        "total 28",
        "drwx------ 1 root root 4096 Oct 17 16:40 .",
        "drwxr-xr-x 1 root root 4096 Oct 17 16:25 ..",
        "drwx------ 3 root root 4096 Oct 17 16:40 .ansible",
        "-rw------- 1 root root    7 Oct 17 16:28 .bash_history",
        "-rw-r--r-- 1 root root 3106 Feb 20  2014 .bashrc",
        "-rw-r--r-- 1 root root  140 Feb 20  2014 .profile",
        "drwxr-xr-x 2 root root 4096 May 20  2018 .ssh"
    ]
}

PLAY RECAP *******************************************************************************************************************************************
192.168.2.106              : ok=2    changed=1    unreachable=0    failed=0
  • Thực hiện tương tự với một câu lệnh khác mà bạn thích, ví dụ lệnh kiểm tra memory: free -m
cat << EOF > free-m.yml
- hosts: group1
  gather_facts: false
  tasks:
    - shell: free -m
      register: output
    - debug:
        msg: "{{ output.stdout_lines }}"
EOF
  • Chạy lại và xem kết quả: ansible-playbook -i inventory free-m.yml
$ ansible-playbook  -i inventory free-m.yml
 [WARNING] Ansible is in a world writable directory (/tmp), ignoring it as an ansible.cfg source.

PLAY [group1] ****************************************************************************************************************************************

TASK [shell] *****************************************************************************************************************************************
changed: [192.168.2.106]

TASK [debug] *****************************************************************************************************************************************
ok: [192.168.2.106] => {
    "msg": [
        "             total       used       free     shared    buffers     cached",
        "Mem:          5822       5242        580        308        234       2644",
        "-/+ buffers/cache:       2363       3458",
        "Swap:         3960          0       3960"
    ]
}

PLAY RECAP *******************************************************************************************************************************************
192.168.2.106              : ok=2    changed=1    unreachable=0    failed=0

2 phút để sáng tạo và chạy các ansible playbook của riêng bạn

Bây giờ bạn có thể làm gì tiếp?

  • Tip 01: Thoải mái chỉnh sửa các playbook dựa trên các câu lệnh của mình để quản lý hệ thống
  • Tip 02: Nếu bạn có thêm các server khác nữa cũng có thể SSH tới, hãy thực hiện tương tự: ssh thử tới các server đó và cập nhật vào inventory, ví dụ như sau:
cat << EOF > inventory
[group1]
192.168.2.106 ansible_port=32768 ansible_user=root ansible_password=mypass
192.168.2.107 ansible_port=22 ansible_user=root ansible_password=mypass
EOF

Tuyệt cú mèo! Bạn đã chạy thành công ansible!

Trong các bài tiếp theo mình sẽ lần lượt giới thiệu các khái niệm trong Ansible và cách sử dụng chúng ^^