如何创建perl脚本以访问多个主机并更新或执行自定义作业

fzwojiic  于 2021-06-19  发布在  Mysql
关注(0)|答案(2)|浏览(279)

因此,我们每周或每月对许多服务器进行一次更新。有时一个git拉就足够了,有时一个svn更新,有时数据库有变化。或者两者的结合。还有这个项目,有许多小服务器,有一个非常简化的版本,我们的系统和非常不可靠的互联网。有时可以从一台服务器上完成,有时也可以从本地工作计算机上完成。
我想做我们的工作更容易一点通过我们所有的服务器和做适当的行动。我发现了几个有用的perl包:net::ssh::perl和net::ssh::expect;net::ssh::perl让我失望。我也没有找到如何使用它 cmd 接连指挥。例如:

my $ssh = Net::SSH::Perl->new($host);
$ssh->login($user, $pass);

my($stdout, $stderr, $exit) = $ssh->cmd('cd web/scripts && ls -la ');
warn Dumper $stdout;

my($stdout, $stderr, $exit) = $ssh->cmd('ls -la');
warn Dumper $stdout;

2号 ls -la 命令返回不同的结果。据我所知(并在文档中解释),ssh执行命令,然后退出。据说我可以使用ssh2版本的ssh协议(或者类似的),不应该有这个问题,但是它仍然存在(或者我不知道如何使用它)。
如果要求我输入密码(例如,如果我运行 mysql -u user -p )我无法提供。我已经试过了 $ssh->cmd($cmd, [ $stdin ]) ,第二个选项,但没有结果。mysql只是一个例子。我可能希望添加一个ip到 /etc/hosts 并被提示 su 密码或 svn update 一个文件,并要求我的svn密码。我知道大多数进程可以配置为不要求密码,但我们希望他们要求密码。
这个 $ssh->shell 选项似乎能起作用,但当我这样做时:

$ssh->shell();`ls -la`;

反斜杠命令不会进入ssh shell。实际上,我不知道它去了哪里,也不知道它是否有什么作用。
当因特网连接不好时,net::ssh::expect使我失败。
出于mysql的目的,我创建了一个perl脚本,它与每个不同的主机建立连接,并执行我想要的更改。但如果我能在一个剧本里完成这一切就太好了。
如果能对这个主题有更多的了解,我将不胜感激。

q7solyqu

q7solyqu1#

在纯perl的基础上,您还可以使用rex,请参阅rexify网站,它是一种ansible,它有ssh、并行作业和许多特性,但更简单。好吧,它比ansible简单,但值得一试。

d8tt03nd

d8tt03nd2#

这就是ansible的用途。它使用ssh与多个主机通信,并提供了一个合适的变量作用域系统和流控制,用于将各种任务应用于各种主机。
您可以使用perl构建自己的配置管理,但是可以使用 raw 命令(在远程系统上不需要python)或更完整的模块(确实需要)已经实现,并采用相同的方法。帮你自己一个忙-别再发明这个轮子了。
ansible远不是完美的,但它很好地涵盖了您的用例。
我个人从docker容器运行它,因为python的包安装故事几乎和perl的一样糟糕:p

相关问题