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 Onet 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
Hostname | OS | IP |
AnsibleServer | CentOS7 | 192.168.80.132 |
Client1 | CentOS7 | 192.168.80.122 |
Client2 | CentOS6 | 192.168.80.123 |
Client3 | Ubuntu 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 [email protected]
Ấn Yes
và nhập mật khẩu root
của node client1
root@ansibleserver ~]# ssh-copy-id [email protected] /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 [email protected]'s password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh '[email protected]'" 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 [email protected]
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 nodeansible_host
: Địa chỉ IP của node client tương ứngansible_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à userroot
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ả 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 client1
và client2
, còn màu đỏ chỉ ra rằng AnsibleServer không tìm thấy client3
và client4
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 client3
và client4
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 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 Onet.
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. Onet 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
Onet 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