如何SSH到远程主机并运行多个命令

时间:2018-07-25 18:15:03

标签: bash icinga2

我有一个脚本可以读取文本文件,其中列出了所有节点:

node1
node2
node3
.
.
.

这是我的脚本的一部分:

#!/bin/bash

while read f; do
   ssh-copy-id myusername@"$f" "yum install -y epel-release; wget --no-check-certificate https://packages.icinga.org/epel/7/release/noarch/icinga-rpm-release-7-1.el7.centos.noarch.rpm;yum install https://packages.icinga.org/epel/7/release/noarch/icinga-rpm-release-7-1.el7.centos.noarch.rpm; yum install -y icinga2; yum install -y nagios-plugins-all; chown -R icinga:icinga /etc/icinga2 && chown -R icinga:icinga /var/lib/icinga2 && chown -R icinga:icinga /var/log/icinga2"       
done < linux-list.txt

1)我希望该脚本登录到每个节点并运行一堆命令以安装Icinga-我尝试将它们全部补齐。

2)我希望脚本登录到Icinga主服务器并运行命令:

ssh username@icingamaster

icinga2 pki ticket --cn '$f'

3)然后将生成的代码发送到主机名($ f)

4)我希望将现有的/etc/icinga2/zones.conf文件替换为我自己的zone.conf

能帮我吗,我不确定如何自动将日志记录到每台服务器中,并且应该自动运行命令。

谢谢

1 个答案:

答案 0 :(得分:1)

在深入研究细节之前,也许您实际上应该查看车队管理工具,例如CFengine或Ansible。

ssh-copy-id不允许您指定要运行的命令。无论如何,它是交互式的。我只需将SSH密钥分别安装在每个主机上,然后在无批处理的SSH上非交互式地在单独的批处理中运行所有自动化脚本。

密钥安装只是您当前的脚本减去错误的long命令:

while read f; do
   ssh-copy-id myusername@"$f"
done < linux-list.txt

通过这种方式,您可以在每个主机上运行任意复杂的脚本。

while read f; do
   ssh myusername@"$f" '
        yum install -y epel-release
        wget --no-check-certificate https://packages.icinga.org/epel/7/release/noarch/icinga-rpm-release-7-1.el7.centos.noarch.rpm
        yum install icinga-rpm-release-7-1.el7.centos.noarch.rpm
        yum install -y icinga2  nagios-plugins-all
        chown -R icinga:icinga /etc/icinga2  /var/lib/icinga2 /var/log/icinga2' </dev/null
    ssh username@icingamaster icinga2 pki ticket --cn "$f" |
    ssh myusername@"$f" 'cat >/tmp/pkicode'
     scp ./zones.conf myusername@"$f":/etc/icinga2/zones.conf
done < linux-list.txt

您会注意到我是如何在单引号内的多行中分解第一个命令的(命令然后不能轻易地将单引号引起来),并且不得不猜测一些有关您在后面的命令中的确切含义的东西-显然替换了占位符用您真正想要的东西进行编码。还请注意,有多少命令接受多个参数。因此您可以使用一个命令对yum installchown等进行多件事。

我不是非常熟悉Yum,但是使用wget下载软件包,然后分别在同一URL上运行yum肯定看起来是错误的。 (也许安装下载的软件包的命令应该是rpm而不是yum?至少在Debian上,这是apt-getdpkg之间的分工。)

看起来myusername基本上具有root用户访问权限-如果不是这种情况,请尝试安装sudo并将myusername作为root用户立即添加到sudoers文件中运行这个;并且显然在每个特权命令之前添加sudo

同样,这些是您真的不想重新发明的轮子。首先安装CFengine或Ansible,会使其余部分变得更加简单,尽管显然也略有不同。