Как я могу автоматизировать развертывание через несколько брандмауэров ssh (используя аутентификацию PW)? - PullRequest
4 голосов
/ 14 декабря 2011

Я застрял в немного раздражающей ситуации.

Между моим рабочим столом и производственными серверами есть цепочка машин.Примерно так:

desktop -> firewall 1 -> firewall 2 -> prod_box 1
                                    -> prod_box 2
                                    -> ...

Я ищу способ автоматизировать развертывание в коробках продуктов через ssh.

Я знаю, что в целом существует ряд решений, номои ограничения:

  • Изменения в брандмауэре запрещены. 2
  • В конфигурационных окнах запрещены изменения конфигурации (только содержимое).
  • Брандмауэр 1 имеет локальную учетную запись пользователя дляme
  • межсетевой экран 2 и prod доступны как root
  • порт 22 является единственным открытым портом между каждым каналом

Итак, в общем, последовательность команд, которую я выполняю дляdeploy это:

scp archive.tar user@firewall1:archive.tar
ssh user@firewall1
scp archive.tar root@firewall2:/tmp/archive.tar
ssh root@firewall2
scp /tmp/archive.tar root@prod1:/tmp/archive.tar
ssh root@prod1
cd /var/www/
tar xvf /tmp/archive.tar

Это немного сложнее, чем в реальности, но это основная сводка задач, которые нужно сделать.

Я поместил свой ключ ssh в firewall1: /home / user / .ssh / authorized_keys, так что это не проблема.

Однако я не могу сделать это для firewall2 или prod box.

Было бы замечательно, если бы я мог запустить это (команды выше) из сценария оболочки локально, ввести мой пароль 4 раза и покончить с этим.К сожалению, я не могу понять, как это сделать.

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

Что я могу сделать здесь?

Должна быть какая-то библиотека, которую я могу использовать для:

  • входа в систему через ssh с использованием либо файла ключа, либо динамически вводимого пароля
  • удаленной удаленной командной команды через цепочкуssh tunnels

Я не совсем уверен, что пометить этот вопрос, поэтому я только что оставил его как ssh, развертывание пока.

Примечание.Было бы здорово использовать ssh-туннели и инструмент развертывания, чтобы вытолкнуть эти изменения, но мне все равно придется вручную входить в каждый ящик, чтобы настроить туннель, и это все равно не будет работать из-за блокировки порта.

Ответы [ 2 ]

3 голосов
/ 14 декабря 2011

Я работаю над Net :: OpenSSH :: Gateway , расширением для моего другого модуля Perl Net :: OpenSSH , который делает это.экземпляр:

use Net::OpenSSH;
use Net::OpenSSH::Gateway;

my $gateway = Net::OpenSSH::Gateway->find_gateway(
    proxies => ['ssh://user@firewall1',
                'ssh://password:root@firewall2'],
    backend => 'perl');

for my $host (@prod_hosts) {
    my $ssh = Net::OpenSSH->new($host, gateway => $gateway);
    if ($ssh->error) {
        warn "unable to connect to $host\n";
        next;
    }
    $ssh->scp_put($file_path, $destination)
        or warn "scp for $host failed\n";
}

Требуется Perl, доступный в обоих брандмауэрах, но без прав записи или установки какого-либо дополнительного программного обеспечения там.

1 голос
/ 14 декабря 2011

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

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

script1.sh

#!/bin/bash

user=doug
firewall1=firewall_1

#Minimise password entries across the board.
tar cf payload1.tar script3.sh archive.tar
tar cf payload2.tar script2.sh payload1.tar
scp payload2.tar ${user}@${firewall1}:payload2.tar
ssh ${user}@${firewall1} "tar xf payload2.tar;chmod +x script2.sh"
echo "Now connect to ${firewall1} and run ./script.sh"

script2.sh

#!/bin/bash

user=root
firewall2=firewall_2

# Minimise password entries
scp payload1.tar ${user}@${firewall2}:/tmp/payload1.tar
ssh ${user}@${firewall2} "cd /tmp;tar xf payload1.tar;chmod +x script3.sh"
echo "Now connect to ${firewall2} and run /tmp/script3.sh"

script3.sh

#!/bin/bash

user=root
hosts="prod1 prod2 prod3 prod4"

for host in $hosts
do
    echo scp archive.tar ${user}@${host}:/tmp/archive.tar
    echo ssh ${user}@${host} "cd /var/www; tar xvf /tmp/archive.tar"
done

Требуется3 ввода пароля на брандмауэр, что немного раздражает, но такова жизнь.
Это вам хорошо?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...