Thứ ba, 25/08/2020 | 00:00 GMT+7

Cách quản lý nhiều server bằng lệnh Ansible Ad Hoc

Ansible là một công cụ quản lý cấu hình hiện đại tạo điều kiện thuận lợi cho công việc cài đặt và bảo trì server từ xa. Với thiết kế tối giản nhằm giúp user bắt đầu và vận hành nhanh chóng, nó cho phép bạn điều khiển một đến hàng trăm hệ thống từ vị trí trung tâm bằng sách phát hoặc lệnh đặc biệt.

Không giống như playbook - bao gồm các tập hợp các việc được dùng lại - các lệnh đặc biệt là các việc bạn không thực hiện thường xuyên, chẳng hạn như khởi động lại một dịch vụ hoặc truy xuất thông tin về hệ thống từ xa mà Ansible quản lý.

Trong hướng dẫn cheat sheets này, bạn sẽ học cách sử dụng các lệnh đặc biệt của Ansible để thực hiện các việc phổ biến như cài đặt gói, sao chép file và khởi động lại dịch vụ trên một hoặc nhiều server từ xa, từ một nút điều khiển Ansible.

Yêu cầu

Để làm theo hướng dẫn này, bạn cần:

  • Một nút điều khiển Ansible . Hướng dẫn này giả định nút điều khiển của bạn là một máy Ubuntu 20.04 với Ansible được cài đặt và cấu hình để kết nối với các server Ansible của bạn bằng các SSH key . Đảm bảo rằng nút điều khiển có regular user có quyền sudo và đã bật firewall , như được giải thích trong hướng dẫn Cài đặt Server Ban đầu của ta . Để cài đặt Ansible, hãy làm theo hướng dẫn của ta về Cách cài đặt và cấu hình Ansible trên Ubuntu 20.04 .
  • Hai hoặc nhiều server Ansible . Server Ansible là bất kỳ máy nào mà nút điều khiển Ansible của bạn được cấu hình để tự động hóa. Hướng dẫn này giả định các server Ansible của bạn là server Ubuntu 20.04 từ xa. Đảm bảo mỗi server Ansible có:
    • Chìa SSH key công cộng điều khiển nút Ansible của bổ sung vào authorized_keys của một người sử dụng hệ thống. User này có thể là user root hoặc regular user với các quyền sudo. Để cài đặt điều này, bạn có thể làm theo Bước 2 của Cách cài đặt SSH key trên Ubuntu 20.04 .
  • Tệp kiểm kê được cài đặt trên nút điều khiển Ansible . Đảm bảo rằng bạn có một file khoảng không quảng cáo đang hoạt động chứa tất cả các server Ansible của bạn. Để cài đặt điều này, vui lòng tham khảo hướng dẫn về Cách cài đặt khoảng không quảng cáo có thể phục hồi . Sau đó, hãy đảm bảo bạn có thể kết nối với các node của bạn bằng cách chạy kiểm tra kết nối được nêu trong phần Kiểm tra kết nối với Server Ansible .

Kiểm tra kết nối với các server Ansible

Lệnh sau sẽ kiểm tra kết nối giữa nút điều khiển Ansible của bạn và tất cả các server Ansible của bạn. Lệnh này sử dụng user hệ thống hiện tại và SSH key tương ứng của nó làm đăng nhập từ xa và bao gồm tùy chọn -m , cho phép Ansible chạy module ping . Nó cũng có cờ -i , cho biết Ansible ping các server được liệt kê trong file inventory được chỉ định

  • ansible all -i inventory -m ping

Nếu đây là lần đầu tiên bạn kết nối với các server này qua SSH, bạn cần xác nhận tính xác thực của các server mà bạn đang kết nối qua Ansible. Khi được yêu cầu , hãy nhập yes và sau đó nhấn ENTER để xác nhận.

Bạn sẽ nhận được kết quả tương tự như sau:

Output
server1 | SUCCESS => { "changed": false, "ping": "pong" } server2 | SUCCESS => { "changed": false, "ping": "pong" }

Khi bạn nhận được phản hồi "pong" từ server , điều đó nghĩa là kết nối đang hoạt động và bạn đã sẵn sàng chạy các lệnh Ansible trên server đó.

Điều chỉnh các tùy chọn kết nối

Theo mặc định, Ansible cố gắng kết nối với các node với quyền là user từ xa có cùng tên với user hệ thống hiện tại của bạn, sử dụng cặp SSH key tương ứng của nó.

Để kết nối với quyền là một user từ xa khác, hãy thêm lệnh bằng cờ -u và tên của user dự định:

  • ansible all -i inventory -m ping -u sammy

Nếu bạn đang sử dụng SSH key tùy chỉnh để kết nối với các server từ xa, bạn có thể cung cấp khóa này tại thời điểm thực thi bằng tùy chọn --private-key :

  • ansible all -i inventory -m ping --private-key=~/.ssh/custom_id

Lưu ý : Để biết thêm thông tin về cách kết nối với các node , vui lòng tham khảo hướng dẫn Cách sử dụng Ansible của ta , hướng dẫn này cho thấy nhiều tùy chọn kết nối hơn.

Khi bạn có thể kết nối bằng các tùy chọn thích hợp, bạn có thể điều chỉnh file khoảng không quảng cáo của bạn để tự động đặt user từ xa và private key , trong trường hợp chúng khác với giá trị mặc định được Ansible chỉ định. Sau đó, bạn sẽ không cần phải cung cấp các tham số đó trong dòng lệnh.

Tệp kiểm kê ví dụ sau chỉ cài đặt biến ansible_user cho server server1 :

~ / ansible / hàng tồn kho
server1 ansible_host=203.0.113.111 ansible_user=sammy server2 ansible_host=203.0.113.112 

Ansible bây giờ sẽ sử dụng sammy làm user từ xa mặc định khi kết nối với server server1 .

Để cài đặt SSH key tùy chỉnh, hãy bao gồm biến ansible_ssh_private_key_file như sau:

~ / ansible / hàng tồn kho
server1 ansible_host=203.0.113.111 ansible_ssh_private_key_file=/home/sammy/.ssh/custom_id server2 ansible_host=203.0.113.112 

Trong cả hai trường hợp, ta chỉ cài đặt các giá trị tùy chỉnh cho server1 . Nếu bạn muốn sử dụng cùng một cài đặt cho nhiều server , bạn có thể sử dụng một group con cho:

~ / ansible / hàng tồn kho
[group_a] 203.0.113.111 203.0.113.112  [group_b] 203.0.113.113   [group_a:vars] ansible_user=sammy ansible_ssh_private_key_file=/home/sammy/.ssh/custom_id 

Cấu hình ví dụ này sẽ chỉ định user tùy chỉnh và SSH key để kết nối với các server được liệt kê trong group_a .

Xác định mục tiêu để thực thi lệnh

Khi chạy các lệnh đặc biệt với Ansible, bạn có thể nhắm đến các server riêng lẻ, cũng như bất kỳ sự kết hợp nào của group , server và group con. Ví dụ: đây là cách bạn kiểm tra kết nối cho mọi server trong group servers có tên:

  • ansible servers -i inventory -m ping

Bạn cũng có thể chỉ định nhiều server và group bằng cách phân tách chúng bằng dấu hai chấm:

  • ansible server1:server2:dbservers -i inventory -m ping

Để bao gồm một ngoại lệ trong một mẫu, hãy sử dụng dấu chấm than, có tiền tố là ký tự thoát \ , như sau. Lệnh này sẽ chạy trên tất cả các server từ group1 , ngoại trừ server2 :

  • ansible group1:\!server2 -i inventory -m ping

Ví dụ: trong trường hợp bạn chỉ muốn chạy một lệnh trên các server thuộc cả group1group2 , bạn nên sử dụng & thay thế. Đừng quên đặt tiền tố nó bằng ký tự \ Escape:

  • ansible group1:\&group2 -i inventory -m ping

Để biết thêm thông tin về cách sử dụng các mẫu khi xác định mục tiêu để thực thi lệnh, vui lòng tham khảo Bước 5 trong hướng dẫn của ta về Cách cài đặt khoảng không quảng cáo khả thi .

Chạy các module Ansible

Mô-đun Ansible là các đoạn mã có thể được gọi từ playbook và cũng từ dòng lệnh để tạo điều kiện thực hiện các thủ tục trên các node từ xa. Ví dụ bao gồm module apt , được sử dụng để quản lý các gói hệ thống trên Ubuntu và module user , được sử dụng để quản lý user hệ thống. Lệnh ping được sử dụng xuyên suốt hướng dẫn này cũng là một module , thường được sử dụng để kiểm tra kết nối từ nút điều khiển đến server .

Ansible đi kèm với một bộ sưu tập phong phú các module tích hợp sẵn, một số module yêu cầu cài đặt phần mềm bổ sung để cung cấp đầy đủ chức năng. Bạn cũng có thể tạo các module tùy chỉnh của riêng mình bằng cách sử dụng ngôn ngữ bạn chọn.

Để thực thi một module với các đối số, hãy bao gồm cờ -a theo sau là các tùy chọn thích hợp trong dấu ngoặc kép, như sau:

ansible target -i inventory -m module -a "module options" 

Ví dụ, điều này sẽ sử dụng module apt để cài đặt tree gói trên server1 :

  • ansible server1 -i inventory -m apt -a "name=tree"

Chạy lệnh Bash

Khi module không được cung cấp thông qua tùy chọn -m , module lệnh được sử dụng theo mặc định để thực thi lệnh được chỉ định trên (các) server từ xa.

Điều này cho phép bạn thực thi hầu như bất kỳ lệnh nào mà bạn thường có thể thực thi thông qua terminal SSH, miễn là user kết nối có đủ quyền và không có bất kỳ dấu nhắc tương tác nào.

Ví dụ này thực thi lệnh uptime trên tất cả các server từ khoảng không quảng cáo được chỉ định:

  • ansible all -i inventory -a "uptime"
Output
server1 | CHANGED | rc=0 >> 14:12:18 up 55 days, 2:15, 1 user, load average: 0.03, 0.01, 0.00 server2 | CHANGED | rc=0 >> 14:12:19 up 10 days, 6:38, 1 user, load average: 0.01, 0.02, 0.00

Sử dụng tính năng leo thang quyền để chạy lệnh với sudo

Nếu lệnh hoặc module bạn muốn thực thi trên server từ xa yêu cầu quyền hệ thống mở rộng hoặc một user hệ thống khác, bạn cần phải sử dụng module báo cáo quyền của Ansible, trở thành . Mô-đun này là một phần trừu tượng cho sudo cũng như các phần mềm báo cáo quyền khác được Ansible hỗ trợ trên các hệ điều hành khác nhau.

Ví dụ: nếu bạn muốn chạy lệnh tail để xuất các thông báo log mới nhất từ log lỗi của Nginx trên server có tên server1 từ inventory , bạn cần bao gồm tùy chọn --become như sau:

  • ansible server1 -i inventory -a "tail /var/log/nginx/error.log" --become

Điều này sẽ tương đương với việc chạy sudo tail /var/log/nginx/error.log trên server từ xa, sử dụng user hệ thống local hiện tại hoặc user từ xa được cài đặt trong file khoảng không quảng cáo của bạn.

Các hệ thống báo cáo quyền như sudo thường yêu cầu bạn xác nhận thông tin đăng nhập của bạn bằng cách nhắc bạn cung cấp password của user . Điều đó sẽ khiến Ansible không thực hiện được lệnh hoặc playbook. Sau đó, bạn có thể sử dụng tùy --ask-become-pass be --ask-become-pass hoặc -K để Ansible nhắc bạn nhập password sudo đó:

  • ansible server1 -i inventory -a "tail /var/log/nginx/error.log" --become -K

Cài đặt và gỡ bỏ các gói

Ví dụ sau sử dụng module apt để cài đặt gói nginx trên tất cả các node từ file khoảng không quảng cáo được cung cấp:

  • ansible all -i inventory -m apt -a "name=nginx" --become -K

Để xóa một gói, hãy bao gồm đối số state và đặt nó thành absent :.

  • ansible all -i inventory -m apt -a "name=nginx state=absent" --become -K

Sao chép các file

Với module file , bạn có thể sao chép file giữa nút điều khiển và nút được quản lý, theo cả hai hướng. Lệnh sau sao chép file văn bản local tới tất cả các server từ xa trong file khoảng không quảng cáo được chỉ định:

  • ansible all -i inventory -m copy -a "src=./file.txt dest=~/myfile.txt"

Để sao chép file từ server từ xa sang nút điều khiển của bạn, hãy bao gồm tùy chọn remote_src :

  • ansible all -i inventory -m copy -a "src=~/myfile.txt remote_src=yes dest=./file.txt"

Thay đổi quyền đối với file

Để sửa đổi quyền đối với file và folder trên các node từ xa của bạn, bạn có thể sử dụng module file .

Lệnh sau sẽ điều chỉnh quyền trên file có tên file.txt nằm tại /var/www trên server từ xa. Nó sẽ đặt umask của file thành 600 , sẽ chỉ bật quyền đọc và ghi cho chủ sở hữu file hiện tại. Ngoài ra, nó sẽ đặt quyền sở hữu file đó cho user và một group được gọi là sammy :

  • ansible all -i inventory -m file -a "dest=/var/www/file.txt mode=600 owner=sammy group=sammy" --become -K

Vì file nằm trong folder thường do root sở hữu, ta có thể cần quyền sudo để sửa đổi các thuộc tính của nó. Đó là lý do tại sao ta bao gồm các tùy chọn --become-K . Chúng sẽ sử dụng hệ thống báo cáo quyền của Ansible để chạy lệnh với các quyền mở rộng và nó sẽ nhắc bạn cung cấp password sudo cho user từ xa.

Khởi động lại dịch vụ

Bạn có thể sử dụng module service để quản lý các dịch vụ đang chạy trên các node từ xa do Ansible quản lý. Điều này sẽ yêu cầu các quyền hệ thống mở rộng, vì vậy hãy đảm bảo user từ xa của bạn có quyền sudo và bạn bao gồm tùy chọn --become để sử dụng hệ thống báo cáo quyền của Ansible. Sử dụng -K sẽ nhắc bạn cung cấp password sudo cho user đang kết nối.

Ví dụ: để khởi động lại dịch vụ nginx trên tất cả các server trong group được gọi là webservers , bạn sẽ chạy:

  • ansible webservers -i inventory -m service -a "name=nginx state=restarted" --become -K

Khởi động lại server

Mặc dù Ansible không có module chuyên dụng để khởi động lại server nhưng bạn có thể đưa ra lệnh bash gọi lệnh /sbin/reboot trên server từ xa.

Khởi động lại server sẽ yêu cầu các quyền hệ thống mở rộng, vì vậy hãy đảm bảo user từ xa của bạn có quyền sudo và bạn bao gồm tùy chọn --become để sử dụng hệ thống báo cáo quyền của Ansible. Sử dụng -K sẽ nhắc bạn cung cấp password sudo cho user đang kết nối.

Cảnh báo : Lệnh sau sẽ khởi động lại hoàn toàn (các) server được nhắm đến bởi Ansible. Điều đó có thể gây gián đoạn tạm thời cho bất kỳ ứng dụng nào dựa trên các server đó.

Ví dụ: để khởi động lại tất cả các server trong một group webservers , bạn sẽ chạy:

  • ansible webservers -i inventory -a "/sbin/reboot" --become -K

Thu thập thông tin về các node từ xa

Mô-đun setup trả về thông tin chi tiết về các hệ thống từ xa do Ansible quản lý, còn gọi là sự kiện hệ thống .

Để lấy thông tin hệ thống cho server1 , hãy chạy:

  • ansible server1 -i inventory -m setup

Thao tác này sẽ in một lượng lớn dữ liệu JSON chứa thông tin chi tiết về môi trường server từ xa. Để chỉ in thông tin phù hợp nhất, hãy bao gồm đối số "gather_subset=min" như sau:

  • ansible server1 -i inventory -m setup -a "gather_subset=min"

Để chỉ in các mục cụ thể của JSON, bạn có thể sử dụng đối số filter . Điều này sẽ chấp nhận một mẫu ký tự đại diện được sử dụng để khớp các chuỗi, tương tự như fnmatch . Ví dụ: để lấy thông tin về cả network interface ipv4 và ipv6, bạn có thể sử dụng *ipv* làm bộ lọc:

  • ansible server1 -i inventory -m setup -a "filter=*ipv*"
Output
server1 | SUCCESS => { "ansible_facts": { "ansible_all_ipv4_addresses": [ "203.0.113.111", "10.0.0.1" ], "ansible_all_ipv6_addresses": [ "fe80::a4f5:16ff:fe75:e758" ], "ansible_default_ipv4": { "address": "203.0.113.111", "alias": "eth0", "broadcast": "203.0.113.111", "gateway": "203.0.113.1", "interface": "eth0", "macaddress": "a6:f5:16:75:e7:58", "mtu": 1500, "netmask": "255.255.240.0", "network": "203.0.113.0", "type": "ether" }, "ansible_default_ipv6": {} }, "changed": false }

Nếu bạn muốn kiểm tra việc sử dụng đĩa, bạn có thể chạy lệnh Bash gọi tiện ích df , như sau:

  • ansible all -i inventory -a "df -h"
Output
server1 | CHANGED | rc=0 >> Filesystem Size Used Avail Use% Mounted on udev 3.9G 0 3.9G 0% /dev tmpfs 798M 624K 798M 1% /run /dev/vda1 155G 2.3G 153G 2% / tmpfs 3.9G 0 3.9G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup /dev/vda15 105M 3.6M 101M 4% /boot/efi tmpfs 798M 0 798M 0% /run/user/0 server2 | CHANGED | rc=0 >> Filesystem Size Used Avail Use% Mounted on udev 2.0G 0 2.0G 0% /dev tmpfs 395M 608K 394M 1% /run /dev/vda1 78G 2.2G 76G 3% / tmpfs 2.0G 0 2.0G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup /dev/vda15 105M 3.6M 101M 4% /boot/efi tmpfs 395M 0 395M 0% /run/user/0

Kết luận

Trong hướng dẫn này, ta đã trình bày cách sử dụng các lệnh đặc biệt của Ansible để quản lý các server từ xa, bao gồm cách thực thi các việc phổ biến như khởi động lại dịch vụ hoặc sao chép file từ nút điều khiển sang các server từ xa do Ansible quản lý. Ta cũng đã thấy cách thu thập thông tin từ các node từ xa bằng cách sử dụng các tham số giới hạn và lọc.

Là một nguồn bổ sung, bạn có thể kiểm tra tài liệu chính thức của Ansible về các lệnh đặc biệt.


Tags:

Các tin liên quan