我陷入了一些烦人的境地。
我的桌面和生产服务器之间有一系列机器。像这样:
desktop -> firewall 1 -> firewall 2 -> prod_box 1
-> prod_box 2
-> ...
我正在寻找一种通过ssh自动部署到产品盒的方法。
我知道一般有很多解决方案,但我的限制是:
因此,一般来说,我要部署的命令序列是:
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中,这样没问题。
但是,我无法为防火墙2或prod框执行此操作。
如果我可以在本地运行shell脚本(上面的命令),输入4次密码并完成它,那就太好了。可悲的是,我无法弄清楚如何做到这一点。
我需要一些方法来链接ssh命令。我整个下午都在尝试使用python来做这件事并最终放弃,因为ssh库似乎不支持密码输入式登录。
我可以在这做什么?
我必须使用某种类型的库:
我不确定要标记这个问题的内容,所以我刚刚将其保留为ssh,暂时部署。
NB。使用ssh隧道和部署工具推出这些更改会很棒,但是我仍然需要手动登录每个盒子来设置隧道,但由于端口阻塞,无论如何都无法工作。
答案 0 :(得分:3)
我正在使用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 :(得分:1)
不幸的是,这不可能像一个shell脚本一样。我确实尝试过,但是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个密码输入,这有点烦人,但这就是生活 你有什么好处吗?