LINUX.ORG.RU

Выполнение команды на нескольких серверах

 ,


0

1

Добрый день.
Запилил скриптик для запуска команды на нескольких серверах. Всё это давно реализовано и есть куча готовых инструментов, но у меня ситуация была обусловлена тем, что у клиента стоят аиксы и доступ по ssh имеется только к одному, через который можно подключаться к другим. Есть dsh, но чтобы он работал нормально, нужно сидеть и копировать ssh ключи на сервера, а делать это у клиента не хочется, да и время займёт. Да, конечно, иметь одинаковые пароли на серверах не очень хорошо, но ситуации бывают разные, к примеру, использование скрипта непривилегированным пользователем для мониторинга состояния и т.п. Для работы скрипта понадобится установить программу expect, благо в репозиториях она лежит, а на аиксах предустановлена.
Скрипт состоит из 3 файлов:

  • cycle - запускает цикл и запрашивает некоторые данные: имя пользователя, пароль, команда и файл со списком ip-адресов
  • script - собственно «бэкэнд», куда передаются данные и выполняется команда.
  • ip_addr - название файла со списком айпи адресов


Оставил возможность вручную указывать файл с ip адресами, чтобы можно было создать несколько файлов с разными адресами (для разных учётных данных, разных организаций и т.п.).
Содержимое скриптов:

  • cycle:
    #!/bin/bash
    IFS=$'\n' # make newlines the only separator (to use command with spaces)
    read -p "$(echo -e 'Username: ')" username
    read -sp "$(echo -e 'Password: ')" password
    read -p "$(echo -e '\nCommand: ')" command
    read -p "$(echo -e 'IP address list: ')" ip_addr
    while read ip;
    do expect -f script $username $password $command $ip
    done < ip_addr 
  • script:
    #!/usr/bin/expect
    set timeout -1
    set username [lindex $argv 0]
    set password [lindex $argv 1]
    set command [lindex $argv 2]
    set ip [lindex $argv 3]
    spawn ssh -oStrictHostKeyChecking=no $username@$ip $command
    expect { "assword:" { send "$password\r"; } }
    eof $spawn_id
    


Записал видео, чтобы было представление, как это всё работает. В видео указан два раза локалхост для примера.

https://youtu.be/xKV7B3dBKkY


P.S. Протестировал я значит скрипт на аиксах и нифига! На линуксах работает, а на аиксах пришлось подправлять. Интересно. Вот рабочий конфиг для аиксов:

  • cycle:
    #!/usr/bin/bash
    IFS=$'\n' # make newlines the only separator (to use command with spaces)
    read -p "$(echo -e 'Username: ')" username
    read -sp "$(echo -e 'Password: ')" password
    read -p "$(echo -e '\nCommand: ')" command
    read -p "$(echo -e 'IP address list: ')" ip_addr
    for ip in $(cat < $ip_addr) ;
    do expect -f script $username $password $command $ip;
    done  
    
  • script:
    #!/usr/bin/expect -f 
    set timeout -1
    set username [lindex $argv 0]
    set password [lindex $argv 1]
    set command [lindex $argv 2]
    set ip [lindex $argv 3]
    spawn ssh -oStrictHostKeyChecking=no $username@$ip $command 
    expect "password:"
    send "$password\r"
    interact
    

А можно было просто свой клиент ссш настроить чтобы использовать первый аикс как прокси для подключения к остальным. Есть в конфиге опция «на этот хост ходить через тот». И авторизация по ключам.

legolegs ★★★★★ ()

Время на написание поста и запись видео вполне сопоставимо с написанием этого супер нетленного интегрированного решения.

aedeph_ ★★ ()

Что-то уровень скриптов меня смущает, но видео смотрится очень органично и свежо, продолжайте пожалуйста. Вам стоит начать делать обзоры, например, комментировать процесс компиляции каждой новой версии хромиума. Я думаю многих это заинтересует, можно будет даже поднять денег с ютуба.

anonymous ()
Ответ на: комментарий от legolegs

Ну, запускать эту команду на локалхосте или на первом аиксе в общем-то не важно, так как суть скрипта всё таки в выполнении команды на нескольких серверах. А авторизация по ключам всё таки не вариант.

Datt_ ()
Ответ на: комментарий от aedeph_

Написано было больше для себя и для тех, у кого вдруг проблемы с написанием.

Datt_ ()
Ответ на: комментарий от madcore

Ну это немного разные вещи, GNU parallel позволяет запускать скрипты одновременно, что по сути могло бы заменить цикл while, но, опять же, gnu parallel не предустановлен на аиксах и суть скрипта не в зацикленности. В кратце, скрипт коннектится по ssh к нескольким серверам и выполняет команду. GNU parallel просто распаралелил бы цикл, но второй файл (script) всё равно нужен, так как частично проблема в указании пароля для ssh в самом скрипте, без него просто пришлось бы вводить пароли раз за разом. Есть конечно ssh ключи и sshpass, но их нет на аиксах

Datt_ ()
Ответ на: комментарий от anonymous

Да я каждую неделю на твитче поднимаю пару лямов на своих скриптах =)

Datt_ ()
Ответ на: комментарий от Datt_

ой, ssh ключи есть на аиксах, просто не хочется их трогать у клиента

Datt_ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.