【问题标题】:How to ssh to remote hosts and run multiple commands如何 ssh 到远程主机并运行多个命令
【发布时间】:2018-07-25 18:15:03
【问题描述】:

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

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

你能帮我吗,我不知道如何自动登录到每个服务器并且运行命令应该是自动的。

谢谢

【问题讨论】:

标签: bash icinga2


【解决方案1】:

在我们深入研究细节之前,也许您应该真正了解一下 CFengine 或 Ansible 等车队管理工具。

ssh-copy-id 不允许您指定要运行的命令。无论如何,它按照定义是交互式的。我只需在每台主机上分别安装 SSH 密钥,然后在单独的批处理中以非交互方式通过无密码 SSH 运行任何自动化脚本。

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

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 添加到 sudoers 文件中;并且显然在每个特权命令之前添加sudo

再说一遍,这些轮子是你不想重新发明的。安装 CFengine 或 Ansible 作为您做的第一件事,这会使其余部分更加简单,尽管显然也略有不同。

【讨论】:

  • 感谢您的回复。在主服务器上创建的令牌需要发送到客户端 ($f),作为客户端安装的一部分,我必须运行此命令“代码”icinga2 节点向导“代码”,然后运行其中一个提示问题将需要该令牌。我将如何将其传递给提示?谢谢我添加到评论中的代码标签不起作用
  • 这是我必须输入的答案,有什么办法可以自动化吗? ' Y Enter master.icinga.test.com Y 10.20.20.1 N Y [之前在 Icinga master 上创建的 PKI 票证] Enter Enter Y Y Enter Enter N N '
  • 最好提出一个新问题,而不是堆积新信息和附加要求。
猜你喜欢
  • 2019-08-09
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
  • 2020-07-05
  • 2016-03-19
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
相关资源
最近更新 更多