IaC

Sử dụng Ansible để cài đặt và thiết lập Docker trên Ubuntu 20.04

Docker hiện đang là một thành phần quan trọng và rất phổ biến trong quá trình phát triển, vận hành ứng dụng. Thêm vào đó là quá trình quản trị các server cũng đang ngày càng phức tạp hơn khi có nhiều các nền tảng, môi trường cho các ứng dụng. Do đó, yêu cầu phải có một phương pháp để có thể tự động hóa được quá trình quản trị cấu hình server và kết hợp sử dụng với Docker một cách hiệu quả, chính xác và nhanh chóng. Ở bài viết trước mình đã hướng dẫn Sử dụng Ansible để cài đặt Docker trên Ubuntu 18.04 và hôm nay chúng ta sẽ tìm hiểu qua bài viết cách sử dụng Ansible để cài đặt Docker trên Ubuntu 20.04 nhé.

Giới thiệu về sử dụng Ansible để cài đặt và thiết lập Docker trên Ubuntu 20.04

Tự động hóa server hiện đang đóng một vai trò trọng yếu trong việc quản trị các hệ thống do sự gia tăng các môi trường hoạt động của các ứng dụng ngày nay. Những công cụ quản trị cấu hình như Ansible đang thường xuyên được dùng để giúp hợp lí hóa quá trình tự động setup server bằng việc thiết lập các tiêu chuẩn về thủ tục thực hiện cho các server mới. Ngoài ra còn giúp giảm thiểu được lỗi liên quan đến thiết lập thủ công do con người hay người quản trị gây ra.

Xem thêm: Hướng dẫn cài đặt Kubernetes trên CentOS 7 tự động hoá với Ansible

Ansible cung cấp một kiến trúc đơn giản, không cần phải có các phần mềm chuyên dụng được cài đặt trên các node. Ngoài ra, còn mang lại những tính năng và các modules được dựng sẵn rất mạnh mẽ giúp tạo điều kiện thuận lợi cho việc viết các scripts tự động hóa.

Docker là một ứng dụng giúp đơn giản hóa quy trình quản lí các vùng chứa hay các quy trình quản lí tài nguyên và hoạt động tương tự như các máy ảo nhưng có tính portable hơn, thân thiện với tài nguyên hơn và phụ thuộc nhiều vào hệ điều hành của máy chủ. Bài viết này sẽ hướng dẫn cách sử dụng Ansible để tự động hóa các bước cài đặt và set up Docker trên hệ điều hành Ubuntu 20.04.

Yêu cầu tiên quyết để sử dụng Ansible để cài đặt Docker trên Ubuntu 20.04

Để theo dõi các bước set up của playbook trong bài này, các bạn cần có:

  • Một Ansible control node: máy chủ Ubuntu 20.04 của các bạn phải cài đặt trước Ansible và đã được cấu hình để kết nối đến các hosts của Ansible bằng SSH key. Control node phải có một user thông thường có đặc quyền sudo và tường lửa được bật.
  • Một hoặc nhiều Hosts của Ansible: một hoặc nhiều Ubuntu 20.04 remote Server.

Chú ý: Trước khi bắt đầu, các bạn cần đảm bảo rằng Ansible control node của mình có thể kết nối được và thực thi được các lệnh trên host đó.

Xem thêm: Tự động hóa các tác vụ Kubernetes với Ansible module

Vai trò của Playbook

Playbook trong bài viết này sẽ giúp cài đặt và set up Docker một cách tự động. Sau khi viết playbook, ta có thể tái sử dụng lại cho các lần cài đặt sau.

Để chạy được playbook, các bạn cần phải thực hiện các lệnh sau lần lượt theo thứ tự trên Ansible hosts:

  1. Cài đặt aptitude – là một package manager được dùng bởi Ansible thay thế cho apt.
  2. Cài đặt các packages mà hệ thống cần.
  3. Cài đặt Docker GPG APT key.
  4. Thêm repository chính thức của Docker vào nguồn của apt.
  5. Cài đặt Docker.
  6. Cài đặt Python Docker module bằng pip.
  7. Tải về image mặc định được chỉ định bởi default_container_image từ Docker Hub.
  8. Tạo số containers được chỉ định bởi biến container_count, mỗi container sử dụng image được chỉ định bởi default_container_image và thực thi lệnh định nghĩa bởi default_container_command.

Khi playbook đã chạy xong, các bạn sẽ có được số container được tạo ra tương ứng với những options đã được định nghĩa bên trong các biến cấu hình.

Để bắt đầu, hãy đăng nhập vào máy chủ Ansible control node bằng user với quyền sudo.

Các bước thực hiện

Trường hợp bạn đang dùng VPS thì bên cạnh việc sử dụng Ansible để cài đặt và thiết lập Docker, việc này còn giúp quản lý VPS một cách hiệu quả, tiết kiệm thời gian và đảm bảo tính nhất quán trong môi trường triển khai Docker.

Bạn cũng cần đảm bảo VPS có đủ tài nguyên, chạy trên hệ điều hành tương thích, sử dụng phiên bản Docker phù hợp, băng thông ổn định, kèm nhiều biện pháp bảo mật chặt chẽ là những yếu tố quan trọng để đảm bảo hiệu suất và độ ổn định của môi trường triển khai Docker trên VPS.

Xem thêm: Tự động hóa PostgreSQL với Ansible

Bước 1: Tạo Playbook

Tất cả các tác vụ của người dùng nhận biết sẽ được đặt vào trong file playbook.yml. Một tác vụ là đơn vị hành động nhỏ nhất mà ta có thể tự động hóa được bằng Ansible playbook.

Đầu tiên cần tạo playbook trước bằng editor tùy ý, ở đây sử dụng nano:

nano playbook.yml

Lệnh trên sẽ mở môt file YAML trống. Trước khi bước vào định nghĩa các tác vụ, ta cần thêm các dòng sau vào file:

---
- hosts: all
  become: true
  vars:
    container_count: 4
    default_container_name: docker
    default_container_image: ubuntu
    default_container_command: sleep 1

Hầu hết mỗi playbook đều sẽ có cách khai báo ban đầu tương tự như trên. hosts khai báo các servers mà Ansible control node để playbook chạy trên đó. become nêu ra tất cả các lệnh đều được thực hiện dưới quyền root.

vars cho phép lưu dữ liệu vào các biến. Nếu trong tương lai, các bạn muốn thay đổi thì chỉ cần chỉnh sửa những dòng này trong file là được. Dưới đây là giải thích ngắn gọn về các biến trên:

  • container_count: Số lượng container sẽ tạo.
  • default_container_name: Tên mặc định của container.
  • default_container_image: Image mặc định của Docker sẽ đươc dùng khi tạo các containers.
  • default_container_command: Lệnh mặc định sẽ chạy trên các containers mới.

Chú ý: Nếu các bạn muốn xem file hoàn chỉnh của playbook, hãy tham khảo ở bước 5. Các files định dạng YAML rất nhạy cảm với việc thụt đầu dòng trong cấu trúc file, vì vậy các bạn hãy kiểm tra lại file của mình sau khi hoàn thành thêm các tác vụ.

Bước 2: Thêm những tác vụ cài đặt các Packages vào Playbook

Mặc định, các tác vụ sẽ được thực thi đồng bộ bởi Ansible lần lượt từ trên xuống dưới trong playbook. Điều này dẫn đến việc thứ tự định nghĩa các tác vụ là rất quan trọng, và các bạn có thể ngầm giả sử rằng mỗi tác vụ sẽ được thực thi sau khi tác vụ trước đã thực thi xong.

Tất cả các tác vụ trong playbook của bài hướng dẫn đều có thể chạy độc lập và có thể tái sử dụng được cho các playbooks khác.

Thêm các tác vụ đầu tiên bao gồm: cài đặt aptitue – là một công cụ để giao tiếp với package manager của Linux và cài đặt các package cần thiết khác cho hệ thống. Ansible sẽ đảm bảo rằng các package này luôn được cài đặt trên server của các bạn:

tasks:
    - name: Install aptitude
      apt:
        name: aptitude
        state: latest
        update_cache: true

    - name: Install required system packages
      apt:
        pkg:
          - apt-transport-https
          - ca-certificates
          - curl
          - software-properties-common
          - python3-pip
          - virtualenv
          - python3-setuptools
        state: latest
        update_cache: true

Ở đây, các bạn đang sử dụng module apt được dựng sẵn của Ansible để ra lệnh cho Ansible cài đặt các packages. Các modules trong Ansible là các lối tắt để thực thi thay cho những thao tác mà các bạn cần phải chạy bằng các lệnh như trên bash. Để an toàn, Ansible sẽ chọn apt để cài đặt các packages trong trường hợp aptitude có vấn đề không thể dùng được.

Các bạn có thể thêm hoặc xóa các packages tùy ý. Điều này sẽ không những đảm bảo rằng các packages được cài đặt mà còn là với phiên bản mới nhất và được hoàn thành sau khi lệnh update của apt được gọi.

Bước 3: Thêm những tác vụ cài đặt Docker vào Playbook

Các tác vụ sẽ cài đặt phiên bản mới nhất của Docker từ repository chính thức. Docker GPG key được thêm vào để xác nhận tài về, repository chính thức được thêm vào như là một nguồn package mới và sau đó Docker sẽ được cài đặt. Thêm vào đó, module của Docker cho Python cũng được cài đặt theo:

- name: Add Docker GPG apt Key
      apt_key:
        url: https://download.docker.com/linux/ubuntu/gpg
        state: present

    - name: Add Docker Repository
      apt_repository:
        repo: deb https://download.docker.com/linux/ubuntu focal stable
        state: present

    - name: Update apt and install docker-ce
      apt:
        name: docker-ce
        state: latest
        update_cache: true

    - name: Install Docker Module for Python
      pip:
        name: docker

Như đã thấy những modules được dựng sẵn như apt_keyapt_repository trỏ vào những URLs, và được giao nhiệm vụ để đảm bảo có mặt. Điều này cho phép cài đặt phiên bản mới nhất của Docker cùng với sử dụng pip để cài đặt module cho Python.

Bước 4: Thêm Docker Image và các tác vụ Container vào Playbook

Sau khi đã có được Docker qua Bước 3, các bạn bắt đầu tạo ra các containers ở đây và kéo về các Docker images mong muốn. Theo mặc định, các images đến từ Docker Hub chính thức của Docker. Với những images này, các containers sẽ được tạo ra theo các đặc tả đã được đặt ra bởi các biến khai báo ở đầu của playbook:

- name: Pull default Docker image
      community.docker.docker_image:
        name: "{{ default_container_image }}"
        source: pull

    - name: Create default containers
      community.docker.docker_container:
        name: "{{ default_container_name }}{{ item }}"
        image: "{{ default_container_image }}"
        command: "{{ default_container_command }}"
        state: present
      with_sequence: count={{ container_count }}

docker_image được sử dụng để kéo về Docker image mà ta mong muốn sử dụng làm nền cho các containers. docker_container cho phép bạn đặc tả những chi tiết các containers được tạo cùng với những lệnh kèm theo.

with_sequence là cách để Ansible tạo vòng lặp, trong trường hợp này Ansible sẽ lặp cho việc tạo các containers với số lần count được chỉ định. Đây là một vòng lặp đơn giản, do đó biến item dùng để chỉ số của lần lặp hiện tại. Số này ở đây được dùng để đặt tên cho các containers.

Bước 5: Kiểm tra lại Playbook

Playbook của các bạn đến bây giờ sẽ trông tương tự như sau, các bạn có thể tùy chỉnh theo ý thích của mình.

---
- hosts: all
  become: true
  vars:
    container_count: 4
    default_container_name: docker
    default_container_image: ubuntu
    default_container_command: sleep 1d

  tasks:
    - name: Install aptitude
      apt:
        name: aptitude
        state: latest
        update_cache: true

    - name: Install required system packages
      apt:
        pkg:
          - apt-transport-https
          - ca-certificates
          - curl
          - software-properties-common
          - python3-pip
          - virtualenv
          - python3-setuptools
        state: latest
        update_cache: true

    - name: Add Docker GPG apt Key
      apt_key:
        url: https://download.docker.com/linux/ubuntu/gpg
        state: present

    - name: Add Docker Repository
      apt_repository:
        repo: deb https://download.docker.com/linux/ubuntu focal stable
        state: present

    - name: Update apt and install docker-ce
      apt:
        name: docker-ce
        state: latest
        update_cache: true

    - name: Install Docker Module for Python
      pip:
        name: docker

    - name: Pull default Docker image
      community.docker.docker_image:
        name: "{{ default_container_image }}"
        source: pull

    - name: Create default containers
      community.docker.docker_container:
        name: "{{ default_container_name }}{{ item }}"
        image: "{{ default_container_image }}"
        command: "{{ default_container_command }}"
        state: present
      with_sequence: count={{ container_count }}

Theo nhu cầu, các bạn hãy chỉnh sửa playbook cho phù hợp với workflow của mình. Ví dụ, các bạn có thể dùng module docker_image dể để những images lên Docker Hub or module docker_container để cài đặt networks cho container.

Chú ý: Hãy để ý đến các thụt đầu dòng trong file YAML của mình. Nếu có lỗi xảy ra, thì rất có thể là do chúng. YAML khuyến khích nên sử dụng 2 khoảng trắng để thụt đầu dòng – giống như trong playbook của bài này.

Bước 6: Khởi chạy Playbook

Bây giờ, các bạn đã có thể chạy playbook trên các server khác nhau. Hầu hết các playbooks mặc định được cấu hình để thực thi trên mỗi server bên trong inventory của các bạn, do đó ở đây các bạn nên chỉ định server cần chạy.

Để thực thi playbook trên chỉ server1, hãy kết nối như là sammy, bằng lệnh dưới đây:

ansible-playbook playbook.yml -l server1 -u sammy

Flag -l chỉ định server và flag -u chỉ định user để đăng nhập vào remote server. Các bạn sẽ nhận được output tương tự như dưới đây:

Output
. . .
changed: [server1]

TASK [Create default containers] *****************************************************************************************************************
changed: [server1] => (item=1)
changed: [server1] => (item=2)
changed: [server1] => (item=3)
changed: [server1] => (item=4)

PLAY RECAP ***************************************************************************************************************************************
server1                  : ok=9    changed=8    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

Theo output trên, server đã được set up thành công. Output của các bạn không cần phải hoàn toàn giống như trên, chỉ cần là không có lỗi hiện ra.

Khi playbook đã chạy xong, hãy đăng nhập vào server được cung cấp bởi Ansible bằng SSH để kiểm tra các containers đã được tạo thành công hay chưa.

Đăng nhập từ xa vào server với lệnh sau:

ssh sammy@your_remote_server_ip

Xem các containers hiện có trên remote server bằng lệnh:

sudo docker ps -a

Các bạn nên nhận được output tương tự như dưới đây:

Output
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS          PORTS             NAMES
a3fe9bfb89cf          ubuntu              "sleep 1d"           5 minutes ago       Created                                 docker4
8799c16cde1e        ubuntu              "sleep 1d"          5 minutes ago        Created                                 docker3
ad0c2123b183        ubuntu              "sleep 1d"          5 minutes ago       Created                                 docker2
b9350916ffd8         ubuntu              "sleep 1d"           5 minutes ago       Created                                 docker1

Như vậy là các containers đã được tạo thành công thông qua việc định nghĩa trong playbook. Và vì đây là tác vụ cuối cùng trong playbook, nên cũng đã khẳng định rằng playbook của các bạn đã thực thi thành công trên server này

Như các bạn đã thấy, việc tự động hóa bằng playbook thật sự đã tiết kiệm được rất nhiều thời gian và đồng thời cũng cho phép server các bạn tuân theo một cấu hình tiêu chuẩn mà có thể được tùy chỉnh theo nhu cầu. Do đó, đây là một thành phần rất thiết yếu mà bất kì một team phát triển nào cũng cần phải có.

Lời kết

Trong bài hướng dẫn về cách sử dụng Ansible để cài đặt Docker trên Ubuntu 20.04 này, các bạn đã tìm hiểu về cách sử dụng Ansible để tự động hóa quá trình cài đặt và set up Docker trên các remote Server. Điều đã giúp việc quản lí và cấu hình các server được thuận tiện hơn rất nhiều. Hy vọng những thông tin này sẽ hữu ích với bạn và có thể giúp bạn áp dụng vào công việc của mình. Nếu có gì thắc mắc hãy bình luận bên dưới. Cảm ơn các bạn đã theo dõi.

Một số bài viết liên quan có thể bạn sẽ thích:

Mọi thắc mắc xin hãy liên hệ
Email: [email protected]

(Nguồn: vietnix.vn)

Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button