it-swarm-vi.com

Tự động chạy các lệnh qua SSH trên nhiều máy chủ

Có một danh sách các địa chỉ IP trong tệp .txt, ví dụ:

1.1.1.1
2.2.2.2
3.3.3.3

Đằng sau mỗi địa chỉ IP đều có một máy chủ và trên mỗi máy chủ đều có một sshd chạy trên cổng 22. Không phải mọi máy chủ đều ở trong known_hosts list (trên PC của tôi, Ubuntu 10.04 LTS/bash).

Làm cách nào tôi có thể chạy các lệnh trên các máy chủ này và thu thập đầu ra?

Lý tưởng nhất là tôi muốn chạy các lệnh song song trên tất cả các máy chủ.

Tôi sẽ sử dụng xác thực khóa công khai trên tất cả các máy chủ.

Dưới đây là một số cạm bẫy tiềm năng:

  • Ssh nhắc tôi đặt khóa ssh của máy chủ đã cho vào known_hosts tập tin.
  • Các lệnh đã cho có thể trả về mã thoát khác, cho biết đầu ra có khả năng không hợp lệ. Tôi cần nhận ra điều đó.
  • Một kết nối có thể không được thiết lập cho một máy chủ nhất định, ví dụ do lỗi mạng.
  • Cần có thời gian chờ, trong trường hợp lệnh chạy lâu hơn dự kiến ​​hoặc máy chủ bị hỏng trong khi chạy lệnh.

Các máy chủ là AIX/ksh (nhưng tôi nghĩ điều đó không thực sự quan trọng.

47
LanceBaynes

Giả sử rằng bạn không thể cài đặt pssh hoặc người khác, bạn có thể làm điều gì đó tương tự:

tmpdir=${TMPDIR:-/tmp}/pssh.$$
mkdir -p $tmpdir
count=0
while IFS= read -r userhost; do
    ssh -n -o BatchMode=yes ${userhost} 'uname -a' > ${tmpdir}/${userhost} 2>&1 &
    count=`expr $count + 1`
done < userhost.lst
while [ $count -gt 0 ]; do
    wait $pids
    count=`expr $count - 1`
done
echo "Output for hosts are in $tmpdir"
15
Arcege

Có một số công cụ hiện có cho phép bạn đăng nhập và thực hiện hàng loạt lệnh trên nhiều máy cùng một lúc. Đây là một cặp vợ chồng:

62
Caleb

Nếu bạn vào Python script hơn bash scripting, thì Fabric có thể là công cụ dành cho bạn.

Từ Trang chủ vải :

Fabric là một thư viện và công cụ dòng lệnh Python (2.5 trở lên) để hợp lý hóa việc sử dụng SSH cho triển khai ứng dụng hoặc quản trị hệ thống.

Nó cung cấp một bộ thao tác cơ bản để thực thi các lệnh Shell cục bộ hoặc từ xa (thông thường hoặc thông qua Sudo) và tải lên/tải xuống các tệp, cũng như chức năng phụ trợ như nhắc người dùng đang chạy để nhập hoặc hủy bỏ thực thi.

Việc sử dụng thông thường liên quan đến việc tạo một mô đun Python chứa một hoặc nhiều hàm, sau đó thực hiện chúng thông qua công cụ dòng lệnh fab.

18
Riccardo Murri

Tôi sử dụng GNU song song cho điều đó, cụ thể nhất là bạn có thể sử dụng this công thức:

parallel --tag --nonall --slf your.txt command

Với your.txt là tệp có tên/địa chỉ IP của máy chủ.

11
Anthon

Thiết lập rất cơ bản:

for Host in $(cat hosts.txt); do ssh "$Host" "$command" >"output.$Host"; done

Xác thực với tên/mật khẩu thực sự không có ý tưởng tốt. Bạn nên thiết lập một khóa riêng cho việc này:

ssh-keygen && for Host in $(cat hosts.txt); do ssh-copy-id $Host; done
8
michas

Tôi đề nghị Ansible.cc . Đó là một trình quản lý cấu hình và bộ điều phối lệnh.

4
Tom

Dự án Hypertable gần đây đã thêm một công cụ ssh nhiều máy chủ. Công cụ này được xây dựng với libssh và thiết lập các kết nối và phát lệnh không đồng bộ song song để song song tối đa. Xem Công cụ SSH nhiều máy chủ để biết tài liệu đầy đủ. Để chạy lệnh trên một tập hợp các máy chủ, bạn sẽ chạy nó như sau:

$ ht ssh 1.1.1.1,2.2.2.2,3.3.3.3 uptime

Bạn cũng có thể chỉ định tên Máy chủ hoặc mẫu IP, ví dụ:

$ ht ssh 1.1.1.[1-99] uptime
$ ht ssh Host[00-99] uptime

Nó cũng hỗ trợ một --random-start-delay <millis> tùy chọn sẽ trì hoãn bắt đầu lệnh trên mỗi Máy chủ theo khoảng thời gian ngẫu nhiên trong khoảng từ 0 đến <millis> mili giây. Tùy chọn này có thể được sử dụng để tránh các vấn đề bầy đàn khi lệnh đang chạy truy cập vào một tài nguyên trung tâm.

2
Doug judd

Tôi nghĩ rằng bạn đang tìm kiếm pssh và các phiên bản song song có liên quan của scp, rsync, v.v.

2
unclejamil

Tôi đã xây dựng một công cụ nguồn mở có tên Overcast để làm cho việc này trở nên dễ dàng hơn.

Đầu tiên bạn xác định máy chủ của mình:

overcast import vm.01 --ip 1.1.1.1 --ssh-key /path/to/key
overcast import vm.02 --ip 2.2.2.2 --ssh-key /path/to/key

Sau đó, bạn có thể chạy nhiều lệnh và tệp tập lệnh trên chúng, theo tuần tự hoặc song song, như vậy:

overcast run vm.* uptime "free -m" /path/to/script --parallel
2
Andrew Childs

Tôi đã phát triển collnode Rất đơn giản và hiệu quả để thực hiện các tác vụ trong một số máy chủ (bao gồm cả cửa sổ)

Cách sử dụng Sưu tầm:

  1. Tạo danh sách máy chủ, để làm việc với:

    # cat hosts.file
    server1
    server2
    server3
    server4
    server5
    
  2. Thực thi CollectionNode vượt qua danh sách phục vụ:

    collectnode --file servers.txt --command='cat /etc/httpd/conf/httpd.conf |grep ^User'
    
  3. Về mặt quang học, có thể lọc kết quả, ví dụ lệnh này chỉ hiển thị máy chủ nơi điều kiện được thực hiện.

    collectnode --file servers.txt --command='cat /etc/httpd/conf/httpd.conf |grep ^User' --where="command contain User"
    

https://collectnode.com/5-t task-collectnode-can-help-managing-servers/

2
fvidalmolina

Chỉ cần một headup cho một câu hỏi thực sự tốt đẹp:

Giải pháp tốt nhất tôi tìm thấy là, không quá ngạc nhiên, tmux.

Bạn có thể thực hiện Ctrl-B: setw sync-panes trong tmux để phục hồi tuyệt vời. Bạn phải mở tất cả các kết nối ssh của mình, trong các ô khác nhau của 1 cửa sổ Tmux cho việc này.

1
Mikhail Krutov

Tôi nghĩ rằng "mong đợi" là những gì bạn cần.
[.__.] Nhiều người thậm chí không biết nó tồn tại. Đây là một chương trình dựa trên tcl sẽ thay mặt bạn đặt câu hỏi và câu trả lời có thể. Hãy xem https://wiki.tcl-lang.org/page/Expect

0
Clement

Tạo một tập tin/etc/sxx/hosts

cư trú như vậy:

[grp_ips]
1.1.1.1
2.2.2.2
3.3.3.3

chia sẻ khóa ssh trên tất cả các máy.

Cài đặt sxx từ gói:

https://github.com/ericcurtin/sxx/release

Sau đó chạy lệnh như vậy:

sxx [email protected]_ips "whatever bash command"
0
ericcurtin

Có lẽ một cái gì đó như thế này hoạt động, để chạy lệnh trên nhiều máy chủ? giả sử tất cả các máy chủ được thiết lập trong .ssh/config để đăng nhập không cần mật khẩu.

$ < hosts.txt xargs -I {} ssh {} command

0
Y0NG

Sử dụng Paramiko http://www.paramiko.org/ và tính song song dựa trên chủ đề https://docs.python.org/3/l Library/threading.html .below mã cho phép thực thi song song nhiều lệnh trên mỗi máy chủ!

ssh = paramiko.SSHClient()
ssh.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
ssh.load_system_Host_keys()
ssh.connect(hostname, port, username, password)
t = threading.Thread(target=tasks[index], args=(ssh, box_ip,))
t.start()

Lưu ý: lặp lại hướng dẫn trên cho mỗi máy chủ.

0
Sharma