-1

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

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 替换现有文件

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

谢谢

4

1 回答 1

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然后yum分别在同一个 URL 上运行肯定看起来是错误的。(也许安装下载包的命令应该是rpm而不是?至少在Debian上这是和yum之间的分工。)apt-getdpkg

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

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

于 2018-07-26T07:23:58.610 回答