[Ansible] Phần 2 – Cài đặt và cấu hình Ansible trên CentOS 7

Ansible là gì?

Ansible là một công cụ nguồn mở để tự động hóa các tác vụ. Nó quản lý cấu hình của máy chủ Linux và Windows của bạn. Nó hoạt động mà không cần một tác nhân, điều đó có nghĩa là Ansible sử dụng SSH và ủy quyền SSH của người dùng hiện tại.

Bạn có thể sử dụng Ansible để tự động hóa ba loại tác vụ:

  • Cấp phép : Thiết lập một số máy chủ bạn cần trong cơ sở hạ tầng của mình.
  • Quản lý cấu hình : Thay đổi cấu hình của ứng dụng, HĐH hoặc thiết bị; bắt đầu và dừng dịch vụ; cài đặt hoặc cập nhật ứng dụng; thực hiện chính sách bảo mật hoặc thực hiện nhiều nhiệm vụ cấu hình khác.
  • Triển khai ứng dụng : Làm cho DevOps dễ dàng hơn bằng cách tự động triển khai các ứng dụng được phát triển nội bộ vào các hệ thống sản xuất của bạn.

Bài viết này sẽ hướng dẫn bạn qua quy trình cài đặt và thiết lập cho Ansible trên CentOS 7, cũng như cấu hình để quản trị một máy đang chạy trên Windows Server.

Mô hình

Mô hình triển khai lab Ansible

Trong mô hình này nếu dựng đầy đủ sẽ cần có các môi trường với các hệ điều hành Linux phổ biến hiện nay, do vậy BKNET sẽ sử dụng các client gồm các hệ điều hành CentOS7, CentOS8, Ubuntu 18.04, Ubuntu 20.04 để phát huy trong các bài LAB tiếp theo.

Đối với hạ tầng LAB hạn chế, bạn chỉ cần có 03 máy chủ với hệ điều hành CentOS7 là đủ (gồm AnsibleServer, Server01 và Server02), sau đó mở rộng ra các client tiếp theo là được. Trong phần 2 này chúng tôi cũng chỉ sử dụng 03 máy kể tên ở trên để thực hành trước, các phần tiếp theo sẽ thêm các máy tiếp theo.

IP Planning

Hostname OS IP
Ansible Server CentOS7 192.168.10.100
Server01 CentOS7 192.168.10.101
Server02 CentOS7 192.168.10.102
Server03 Ubuntu 16.04 192.168.10.103

Hướng dẫn Cài đặt Ansible

Bước 1: Cài đặt Ansible

Để bắt đầu khám phá Ansible như một phương tiện quản lý các server khác nhau của ta , ta cần cài đặt phần mềm Ansible trên ít nhất một máy.

Để có được Ansible cho CentOS 7, trước tiên hãy đảm bảo repository CentOS 7 EPEL đã được cài đặt:

yum install epel-release

Khi repository được cài đặt, hãy cài đặt Ansible với yum

yum install ansible

Bây giờ ta có tất cả các phần mềm cần thiết để quản trị các server của ta thông qua Ansible.

Sau khi cài đặt xong, chúng ta có thể kiểm phiên bản Ansible đã cài đặt là bao nhiêu dùng lệnh:

ansible --version

Kết quả

[root@ansible ~]# ansible --version
ansible 2.9.25
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Oct 14 2020, 14:45:30) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
[root@ansible ~]#

Bước 2: Cấu hình SSH Key

Ansible hoạt động theo cơ chế agentless, có nghĩa là không cần cài agent vào các máy client để điều khiển, thay vào đó ansible sẽ sử dụng việc điều khiển các client thông qua SSH. Do vậy, tới bước này ta có thể dùng 2 cách để ansible có thể điều khiển được các máy client.

  • Cách 1: Sử dụng usename, port của ssh để khai báo trong inventory. Các này không được khuyến cáo khi dùng trong thực tế vì việc password dạng clear text sẽ hiện thị, hoặc nếu dùng cách này thì cần phải secure cho file inventory này bằng ansible-vault
  • Cách 2: Sử dụng ssh keypair. Có nghĩa là ta sẽ tạo ra private key và public key trên node AnisbleServer và copy chúng sang các node client (hay còn gọi là các host).

Tạo SSH key cho các node

Đứng tại node Ansible Server tạo SSH Key, sau đó copy các sang node còn lại. Mục tiêu là sử dụng keypair để không phải nhập password mỗi khi đăng nhập vào các client.

Đứng tại user root của node Ansible Server và thực hiện bước tạo key:

ssh-keygen

Thực hiện các thao tác Enter và để mặc định các tùy chọn khi lab.

Cài đặt Ansible 01

Thực hiện copy file key sang các node còn lại

ssh-copy-id root@192.168.10.101

Ấn Yes và nhập mật khẩu root của node server01

Cài đặt Ansible 02

Làm tương tự với node server02 và server03

ssh-copy-id root@192.168.10.102
ssh-copy-id root@192.168.10.103

Sau đó đứng từ node Ansible Server, thử ssh sang các node Server01 & Server2, nếu không bị hỏi mật khẩu thì ta đã sử dụng ssh key thành công.

Lưu ý nhớ dùng lệnh exit sau khi đăng nhập ở từng node. Tiếp tục chuyển sang bước khai báo file inventory để chứa danh sách các host cần thiết.

Bước 3: Cấu hình Ansible Server

Thực hiện việc này trên node Ansible Server

Mặc định thì danh sách các host mà Ansible Server điều khiển sẽ nằm ở file /etc/ansible/host. File mặc định này sẽ chứa các khai báo mẫu, ta sẽ thực hiện sao lưu lại và khai báo file theo bài LAB này.

cp /etc/ansible/hosts /etc/ansible/hosts.bak

Sau đó mở file /etc/ansible/host để khai báo

vi /etc/ansible/hosts

Nội dung của file sẽ có dạng như sau

[centos]
192.168.10.101
192.168.10.102

[ubuntu]
192.168.10.103

Sau khi thêm các dòng trên, ta lưu file trên lại. Chú ý rằng ta có thể sử dụng cặp thẻ

[ ] để khai báo các group. Các group này sẽ do ta quy hoạch sao cho phù hợp với hệ thống, với ứng dụng của chúng ta. Ở đây tôi tạm tạo group là [centos][ubuntu]

Thực hiện kiểm tra danh sách host đã đươc khai báo trong file inventory ở trên bằng lệnh ansible all --list-hosts . Trong đó all là một tùy chọn của lệnh trên, mục tiêu là liệt kê tất cả các hosts nằm trong file inventory, bất kể các host đó nằm ở group nào.

ansible all --list-hosts

Kết quả:

Cài đặt Ansible 03

Nếu chúng ta chỉ muốn kiểm tra các host trong group [centos] ta thực hiện với tùy chọn lệnh như sau ansible centos --list-host, kết quả sẽ như bên dưới.

ansible centos --list-host

Cài đặt Ansible 04

Tới bước này chúng ta mới dừng lại việc khai báo danh sách các host. Trong thực tế các ta cần khai báo thêm các tùy chọn về mật khẩu, về port thậm chí cả về user mà Ansible Server được phép sử dụng để điều khiển các host.

Một file inventory tương đối hoàn chỉnh sẽ có định đạng như sau. Đây cũng là cú pháp của file inventory từ bản Ansible 2.0 trở lên. Hãy sửa lại file inventory của bạn để có định dạng như bên dưới, sẽ bổ sung thêm các tùy chọn

Sửa file /etc/ansible/hostvới nội dung như bên dưới

[centos]
server01 ansible_host=192.168.10.101 ansible_port=22 ansible_user=root
server02 ansible_host=192.168.10.102 ansible_port=22 ansible_user=root

[ubuntu]
server03 ansible_host=192.168.10.103 ansible_port=22 ansible_user=root
  • server01, serrver02,server03: Tương ứng là các hostname của các node
  • ansible_host: Địa chỉ IP của node client tương ứng
  • ansible_port: Port của SSH phía client, nếu ta thay đổi thì sẽ chỉnh lại cho đúng.
  • ansible_user: Là username của client mà AnsibleServer sẽ dùng để tương tác, trong bước trên tôi sử dụng là user root và thông qua SSH Key.

Bước 4: Sử dụng một số lệnh kiểm tra cơ bản

Để kiểm tra xem việc khai báo này đã đúng và bắt đầu tiếp các bài lab tiếp theo hay chưa, hãy sử dụng tùy chọn -m trong lệnh dưới, đây là dấu hiệu nhận biết về việc sẽ sử dụng module có tên là ping (-m là viết tắt của module). Trong bài này sẽ giới thiệu thêm một số moudle khác ngoài module ping này.

ansible all -m ping

Như ở trên đã nói hoặc trong các tài liệu khác có đề cập, ansible có khái niệm sử dụng các module được cung cấp sẵn để người quản trị làm các công việc cấu hình, sử dụng ansible cho hợp lý. Việc sử dụng module trong ansible rất linh hoạt và có rất nhiều module, ta cần đọc hoặc tra cứu từ trang chủ về các module mà ansible hỗ trợ.

Kết quả của lệnh trên như bên dưới:

Cài đặt Ansible 05

Kết quả trên cho thấy server02 phản hồi về trạng thái màu xanh. Có nghĩa là đứng từ Ansible Server ta đã ping thành công tới server02, còn màu đỏ chỉ ra rằng Ansible Server không tìm thấy server1 và server03

Sở dĩ có kết quả như trên là vì trong phần này của bài LAB, tôi đã khai báo đủ 03 node server nhưng mới có node server02 là được bật khi tôi thực hiện lab.

Ta có thể lựa chọn các group để thực hiện tương tác thông qua Ansible, ví dụ tôi sẽ thực hiện module ping với group là centos6 đã khai bào ở trên bằng lệnh ansible centos -m ping. Kết quả là

Cài đặt Ansible 06

Các shell module cho phép chúng tôi gửi một lệnh terminal đến máy chủ từ xa và lấy kết quả. Ví dụ, để tìm hiểu mức sử dụng bộ nhớ trên máy server01 của chúng tôi, chúng tôi có thể sử dụng:

[root@ansible ~]# ansible -m shell -a 'free -m' server01
server01 | CHANGED | rc=0 >>
              total        used        free      shared  buff/cache   available
Mem:           1819         219        1471           9         128        1457
Swap:          2047           0        2047
[root@ansible ~]#

Module setup trong ansible

Ta có thể sử dụng module setup để kiểm tra các thông tin tổng quát về hệ điều hành của các node, ví dụ kiểm tra phiên bản, kiểm tra thông tin card mạng, tên host, thông số về phần cứng ….

Ví dụ ta có thể sử dụng lệnh sau để kiểm tra xem distro của các host là gì ansible all -m setup -a 'filter=ansible_distribution'. Kết quả ta sẽ nhìn thấy như sau:

ansible all  -m setup -a 'filter=ansible_distribution'

Kết quả:

[root@ansible ~]# ansible all  -m setup -a 'filter=ansible_distribution'
server01 | SUCCESS => {
    "ansible_facts": {
        "ansible_distribution": "CentOS",
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false
}
server02 | SUCCESS => {
    "ansible_facts": {
        "ansible_distribution": "CentOS",
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false
}
server03 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.10.103 port 22: No                                    route to host",
    "unreachable": true
}
[root@ansible ~]#

Hoặc ta có thể sử dụng lệnh ansible all -m setup -a 'filter=ansible_default_ipv4' để liệt kê ra các địa chỉ IPv4 trên các node. Kết quả sẽ trả về

[root@ansible ~]# ansible all  -m setup -a 'filter=ansible_default_ipv4'
server01 | SUCCESS => {
    "ansible_facts": {
        "ansible_default_ipv4": {
            "address": "192.168.10.101",
            "alias": "ens33",
            "broadcast": "192.168.10.255",
            "gateway": "192.168.10.2",
            "interface": "ens33",
            "macaddress": "00:0c:29:2f:50:c8",
            "mtu": 1500,
            "netmask": "255.255.255.0",
            "network": "192.168.10.0",
            "type": "ether"
        },
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false
}
server02 | SUCCESS => {
    "ansible_facts": {
        "ansible_default_ipv4": {
            "address": "192.168.10.102",
            "alias": "ens33",
            "broadcast": "192.168.10.255",
            "gateway": "192.168.10.2",
            "interface": "ens33",
            "macaddress": "00:0c:29:90:28:8f",
            "mtu": 1500,
            "netmask": "255.255.255.0",
            "network": "192.168.10.0",
            "type": "ether"
        },
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false
}
server03 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.10.103 port 22: No route to host",
    "unreachable": true
}
[root@ansible ~]#

Tới đây, việc setup cở bản LAB ansible này đã hoàn tất, nếu muốn khám phá thêm các module khác thì bạn có thể chủ động tìm kiếm từ trang chủ của Ansible hoặc các blog khác hoặc ngay tại các bài viết sau này từ Bknet việt Nam.

Nếu bạn chưa thử đọc phần 1 của chúng tôi, hãy thử xem qua để có các bước đi tốt nhất về Ansible nhé, link ở đây này

Bài viết này hữu ích như thế nào?

Hãy bấm vào ngôi sao để đánh giá!

Đánh giá trung bình 5 / 5. Số phiếu bầu: 32

Xin chào! Chúng tôi có thể giúp gì cho bạn?
Xin chào! Chúng tôi có thể giúp gì cho bạn?