Tin tức, hướng dẫn và chia sẻ về công nghệ

[10 phút ][Ansible] [Cơ bản] [Phần 2] Dựng LAB để thực hành ansible

Trong phần 1 của chuỗi bài cơ bản về Ansible, tôi đã tổng hợp nhanh một số vấn đề hoặc lăn tăn trước khi bắt đầu vọc vạch. Phần đó kiểu tâm sự, ba hoa để anh/em vào tìm hiểu cho mượt nên hơi dài dòng chút.

Trong phần 2 này, tôi sẽ đi ngay vào việc dựng LAB để anh/em khỏi cảm thấy nhàm chán, tâm lý chung thì sau khi đọc muốn thu ngay được cái gì đó hoặc ngắm nghía xem như thế nào. Trong phần này sẽ giải quyết.

Đầu tiên, tôi sẽ chuẩn bị mô hình và IP Planning thật hoành tráng, mục tiêu là để có thể LAB đủ các phần và minh họa việc sử dụng Ansible cho đúng cách, hợp lý với thực tế của tôi cũng như của các bạn. Cụ thể gồm

1. Mô hình

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 cloud365 sẽ sử dụng các client gồm các hệ điều hành CentOS7, CentOS6, Ubuntu 16.04, Ubuntu 18.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, Client1 và Client2), sau đó mở rộng ra các client tiếp theo là được. Trong phần 2 này 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.

2. IP Planning

HostnameOSIP
AnsibleServerCentOS7192.168.80.132
Client1CentOS7 192.168.80.122
Client2CentOS6 192.168.80.123
Client3Ubuntu 16.04 192.168.80.124
Client4 Ubuntu 18.04 192.168.80.125

3. Cài đặt

3.1. Thiết lập hostname, IP cho các node

Bước này sẽ thực hiện thiết lập hostname, IP cho các node để được mô hình và IP Planning ở trên. Do phần này là cơ bản với những anh em biết sử dụng Linux nên tôi sẽ bỏ qua bước này.

3.2. Cài đặt ansible trên node Ansible Server

Việc cài đặt ansible khác đơn giản, chỉ thông qua lệnh bên dưới là có thể cài xong Ansible.

Lưu ý: Bước này thực hiện trên node AnsibleServer – node 192.168.80.132

Login với tài khoản root và thực hiện các lệnh dưới (lưu ý lúc nếu bạn có IP Planning khác, nên đặt IP tĩnh theo phân hoạch của bạn trước).

yum install -y epel-release 
yum update -y

yum install -y ansible

Kiểm tra lại phiên bản ansible sau khi cài bằng lệnh anssible --version. Ta có kết quả phiên bản ở dưới.

[root@ansibleserver ~]# ansible --version
ansible 2.8.4
  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, Aug  7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]

3.3. Cấu hình SSH Key và khai báo file inventory

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).

Trong hướng dẫn này sẽ sử dụng cách 2, còn cách 1 sẽ được hướng dẫn ở các phần sau.

3.3.1. Tạo SSH key cho các node

Đứng tại node AnsibleServer 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 AnsibleServer 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.

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:ialESG10iMjC8ppgMWh46DaB34s7iuFwbUCB6a0FDP4 root@ansibleserver
The key's randomart image is:
+---[RSA 2048]----+
|X=o+...          |
|%@oo+.           |
|*=Oo.            |
|.B++.  o .       |
|+o=E..o S        |
|o..+..           |
|o ..+            |
|+oo.             |
|oo .             |
+----[SHA256]-----+

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

ssh-copy-id root@192.168.80.122

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

root@ansibleserver ~]# ssh-copy-id root@192.168.80.122
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.80.122 (192.168.80.122)' can't be established.
ECDSA key fingerprint is SHA256:DETqQWWDBSaytKdSl1UlKay/wViWrWwhaUZoXre27FI.
ECDSA key fingerprint is MD5:8e:5b:c0:03:38:c6:07:f0:12:c8:6e:fe:33:36:ef:f9.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.80.122's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@192.168.80.122'"
and check to make sure that only the key(s) you wanted were added.

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

ssh-copy-id root@192.168.80.123

Sau đó đứng từ node AnsibleServer, thử ssh sang các node client1 & client2, 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.

3.3.2. Khai báo file inventory

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

Mặc định thì danh sách các host mà AnsibleServer đ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.

mv /etc/ansible/hosts /etc/ansible/hosts.org

Tạo file mới để khai báo các host

vi /etc/ansible/hosts

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

192.168.80.122

[centos6]
192.168.80.123

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à [centos6]

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ả:

[root@ansibleserver ~]# ansible all --list-hosts
  hosts (2):
    192.168.80.122
    192.168.80.123

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 centos6 --list-host, kết quả sẽ như bên dưới.

[root@ansibleserver ~]# ansible centos6 --list-host
  hosts (1):
    192.168.80.123

Ta có thể sửa lại file /etc/ansible/hosts với đầy đủ các client như mô hình LAB (Mặc dù chưa bật các client tiếp theo lên), giống như file dưới

192.168.80.122

[centos6]
192.168.80.123

[ubuntu]
192.168.80.124
192.168.80.125

Sau đó chạy lệnh ansible all --list-host , ta sẽ có kết quả như bên dưới.

[root@ansibleserver ~]# ansible all --list-hosts
  hosts (4):
    192.168.80.122
    192.168.80.123
    192.168.80.124
    192.168.80.125

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à AnsibleServer đượ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/host với nội dung như bên dưới

client1 ansible_host=192.168.80.122 ansible_port=22 ansible_user=root

[centos6]
client2 ansible_host=192.168.80.123 ansible_port=22 ansible_user=root

[ubuntu]
client3 ansible_host=192.168.80.124 ansible_port=22 ansible_user=root
client4 ansible_host=192.168.80.125 ansible_port=22 ansible_user=root
  • client1, client2, client3, client4: 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.

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

Kết quả khi sử dụng module ping để kiểm tra các host.

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

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 đủ 04 node client nhưng mới có 02 node client1 & client2 là được bật khi tôi thực hiện lab.

Bạn có thể thử nghiệm thêm bằng cách tắt node client2 và thực hiện lại lệnh ansible all -m ping, ta thấy với các node mà AnsibleServer không liên lạc được sẽ có kết quả: unreachable": true

[root@ansibleserver ~]# ansible all -m ping
client1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
client3 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.80.124 port 22: No route to host",
    "unreachable": true
}
client4 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.80.125 port 22: No route to host",
    "unreachable": true
}
client2 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.80.123 port 22: Connection timed out",
    "unreachable": true
}

Bật node mà bạn đã tắt trước đó để thực hành tiếp một số lệnh và module cơ bản nhất của Ansible.

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 centos6 -m ping. Kết quả là

[root@ansibleserver ~]# ansible centos6 -m ping
client2 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

5. Sử dụng các module cơ bản của ansilbe trong chế độ tương tác

Chế độ tương tác của ansible tạm hiểu là chế độ dùng các lệnh đơn, ngay sau khi thực hiện lệnh thì sẽ có output để quan sát.

Trong thực tế với mức độ sử dụng như này thì bạn mới ở mức con số 0 về Ansible, nó chỉ có ý nghĩa cho bạn vọc vạch ansible với trình độ khởi đầu và dùng để thao tác nhanh trong ngữ cảnh cần kiểm tra hoặc xác nhận lại các config trước đó mà thôi.

Để phát huy sức mạnh của Ansible, bạn phải luyện tới các trình độ cao cấp hơn, ví dụ như sử dụng được các playbooks, tự viết được playbooks hoặc hiểu các khái niệm về task, vars …Chi tiết các phần này sẽ có trong các bài tiếp theo hoặc bài nâng cao.

5.1. Sử dụng module command

Như đã nói ở trên, việc sử dụng module ở chế độ tương tác của ansible chưa thể phát huy được hiệu quả của Ansible, nhưng bạn vẫn cần có các bước đi khởi đầu này để hiểu và phân biệt được cách sử dụng ansible cho hiệu quả trong tương lai. Hay đơn giản hơn là có câu nói rằng:

Vạn dặm đường xa đều bắt đầu từ các bước đi

Trích nhặt từ Internet

Sử dụng một trong các câu lệnh dưới để thực hành moulde command, ta sẽ kiểm tra uptime của toàn bộ các node hoặc một số node thuộc group nào đó bằng lệnh "ansible all -m command -a "ten_cau_lenh_module_command_ho_tro". Ví dụ:

Lưu ý thêm có tùy chọn -a để truyền thêm các đầu vào cho module command. Tùy chọn này cũng được dùng trong các module khác nhé.

[root@ansibleserver ~]# ansible centos6 -m command -a "uptime"
client2 | CHANGED | rc=0 >>
 09:06:41 up 15 min,  1 user,  load average: 0.00, 0.00, 0.00

Hoặc

[root@ansibleserver ~]# ansible all -m command -a "uptime"
client2 | CHANGED | rc=0 >>
 09:08:42 up 17 min,  1 user,  load average: 0.00, 0.00, 0.00

client1 | CHANGED | rc=0 >>
 09:08:43 up  1:24,  1 user,  load average: 0.00, 0.00, 0.00

client3 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.80.124 port 22: No route to host",
    "unreachable": true
}
client4 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.80.125 port 22: No route to host",
    "unreachable": true
}

Ta quan sát thấy trong các output trên là thông tin trả về khi module command thực hiện lệnh uptime trong linux. Với module này ta có thể thay thế bằng nhiều lệnh khác. Ví dụ ta có thể thực hiện lệnh dưới

ansible all -m command -a "ls -alh"

Lệnh trên sẽ trả về kết quả của lệnh ls -alh ở từng node client. Bạn hãy tự quan sát kết quả của mình nhé, bạn sẽ thấy có chút ngạc nhiên khi tốc độ thực hiện và kết quả trả về, nó sẽ còn phát huy hơn nữa khi bạn có nhiều host được khai báo trong file inventory, bắt đầu thấy hay ho rồi phải ko nhỉ?

Thực hành thêm với lệnh ansible all -m command -a "uname -rms" và xem kết quả trả về phiên bản kernel của các host nhé.

Tới đây tạm hiểu tính năng module command của ansible là cho phép ta dùng ansible để thực thi các lệnh của Linux từ xa, đa số là các lệnh đơn thôi nhé.

Vậy nếu dùng các lệnh dạng nhóm lệnh như trong shell hoặc thực thi các shell thì ta sẽ thực hiện như nào nhỉ?

Yên tâm đi, ansible có quá nhiều module ngoài module command kia, trong này có liệt kê nhé (list các module của ansible). Nhưng khoan vào ma trận module này nhé, nó làm cho bạn rối bời và loạn xạ ngay. Hãy chuyển tạm sang module shell một chút để biết cách dùng

Còn nếu quan tâm thêm về module command thì hãy tham khảo ở đây

5.2. 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:

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

Trong trường hợp ta bật tiếp các host client3client4 và copy SSH key ở bước trước, sau đó thực hiện lại lệnh trên ta sẽ có kết quả như sau:

Thực hiện bước copy SSH key sang các node còn lại, client3 và client4

Thực hiện lại lệnh ở trên để quan sát kết quả về các distro của các host ansible all -m setup -a 'filter=ansible_distribution'. Ta sử dụng thêm tùy chọn -a để lọc kết quả của lệnh ansible all -m setup bởi vì kết quả của lệnh rất dài và nhiều tham số, bạn có thể thử nó riêng biệt.

[root@ansibleserver ~]# ansible all  -m setup -a 'filter=ansible_distribution'
client2 | SUCCESS => {
    "ansible_facts": {
        "ansible_distribution": "CentOS",
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false
}
client1 | SUCCESS => {
    "ansible_facts": {
        "ansible_distribution": "CentOS",
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false
}
client3 | SUCCESS => {
    "ansible_facts": {
        "ansible_distribution": "Ubuntu",
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false
}
client4 | SUCCESS => {
    "ansible_facts": {
        "ansible_distribution": "Ubuntu",
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false
}

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@ansibleserver ~]# ansible all  -m setup -a 'filter=ansible_default_ipv4'
client2 | SUCCESS => {
    "ansible_facts": {
        "ansible_default_ipv4": {
            "address": "192.168.80.123",
            "alias": "eth0",
            "broadcast": "192.168.80.255",
            "gateway": "192.168.80.1",
            "interface": "eth0",
            "macaddress": "52:54:00:da:c7:2a",
            "mtu": 1500,
            "netmask": "255.255.255.0",
            "network": "192.168.80.0",
            "type": "ether"
        },
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false
}
client1 | SUCCESS => {
    "ansible_facts": {
        "ansible_default_ipv4": {
            "address": "192.168.80.122",
            "alias": "eth0",
            "broadcast": "192.168.80.255",
            "gateway": "192.168.80.1",
            "interface": "eth0",
            "macaddress": "52:54:00:02:42:ed",
            "mtu": 1500,
            "netmask": "255.255.255.0",
            "network": "192.168.80.0",
            "type": "ether"
        },
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false
}
client4 | SUCCESS => {
    "ansible_facts": {
        "ansible_default_ipv4": {
            "address": "192.168.80.125",
            "alias": "eth0",
            "broadcast": "192.168.80.255",
            "gateway": "192.168.80.1",
            "interface": "eth0",
            "macaddress": "52:54:00:15:59:dc",
            "mtu": 1500,
            "netmask": "255.255.255.0",
            "network": "192.168.80.0",
            "type": "ether"
        },
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false
}
client3 | SUCCESS => {
    "ansible_facts": {
        "ansible_default_ipv4": {
            "address": "192.168.80.124",
            "alias": "eth0",
            "broadcast": "192.168.80.255",
            "gateway": "192.168.80.1",
            "interface": "eth0",
            "macaddress": "52:54:00:5c:6e:53",
            "mtu": 1500,
            "netmask": "255.255.255.0",
            "network": "192.168.80.0",
            "type": "ether"
        },
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false
}
[root@ansibleserver ~]#

Tới đây, việc setup cở bản cụm LAB 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ừ team Cloud365.

Chúc các bạn có những bước đi đầu tiên trong hành trình tìm hiểu Ansible này. Cloud365 tin rằng nếu chăm chỉ thực hành và tìm hiểu, bạn sẽ thấy có nhiều thú vị với Ansible và sớm đưa được vào thực tế.

Chúc các bạn vui vẻ, hãy đón chờ phần tiếp theo nhé.

Trân trọng cảm ơn

Cloud365 team <3

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

2 Comments

  1. Long

    Thường xuyên check cloud365, cảm ơn team đã chia sẻ và mong có thêm nhiều bài viết nữa.

    • Công TÔ

      Cám ơn bạn đọc đã động viên. Bạn có thể join kênh telegram của news.cloud365.vn để nhận tin mỗi khi có bài viết mới nhé.

Leave a Reply

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