【问题标题】:How to use heredoc to answers prompt questions如何使用heredoc回答提示问题
【发布时间】:2018-07-27 20:03:06
【问题描述】:

我正在尝试在许多远程客户端上自动安装 Icinga2。 PKI 令牌将在 Icinga 服务器上生成,并且每个客户端都不同 - 然后它应该被发送到每个客户端。 作为客户端安装的一部分,icinga2 节点向导将运行,我想将一系列输入通过管道传递到如下提示。你能检查一下我是否正确使用了heredoc吗?

#!/bin/bash

while read f; do
   ssh-copy-id myusername"$f"
   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 myusername@master.icinga.test.com icinga2 pki ticket --cn "$f" |
   ssh myusername@"$f" 'cat >/tmp/pkicode'

   PKI= echo $/tmp/pkicode
   icinga2 node wizard << EOF
   Y
   Enter
   master.icinga.test.com
   Y
   10.20.20.1
   N
   Y
   $PKI
   Enter
   Enter
   Y
   Y
   Enter
   Enter
   N
   N
   EOF
   scp ./zones.conf myusername@"$f":/etc/icinga2/zones.conf
done < linux-list.txt

谢谢

【问题讨论】:

  • &lt;&lt;EOF 要求 EOF 左对齐,而不是缩进。
  • 顺便说一句,您可能希望在标准输入以外的 FD 上阅读您的 linux-list.txt,以避免在每个可能消耗其部分内容的进程上都需要 &lt;/dev/null。例如5&lt;linux-list.txt,然后是while read -r f &lt;&amp;5; do
  • 除此之外,这个问题有点过于宽泛了——一个理想的 StackOverflow 问题只关注一个单一的、特定的问题,并用最短的minimal reproducible example 重现它; “这是我的代码,看起来可能有什么问题?”,如果没有特定的不当行为或努力修剪到最短的复制器,很难建立一个规范的答案。
  • FWIW 这个长线程中的上一个问题是stackoverflow.com/questions/51544500/…
  • 请看:shellcheck.net

标签: bash icinga2


【解决方案1】:

代码中有一些错误。

#!/bin/bash

while read f; do
   ssh-copy-id myusername"$f"
   ssh myusername@"$f" '
     :
    ' </dev/null

   ssh myusername@master.icinga.test.com icinga2 pki ticket --cn "$f" </dev/null |
   ssh myusername@"$f" '
      PKI=$(cat)
      icinga2 node wizard <<________EOF
Y

master.icinga.test.com
Y
10.20.20.1
N
Y
$PKI


Y
Y


N
N
________EOF
        '
   scp ./zones.conf myusername@"$f":/etc/icinga2/zones.conf
done < linux-list.txt

您会特别注意到最后一个ssh 需要将所有应该在单引号内运行的代码。它通过标准输入接收票证,并使用$(cat) 直接将其捕获到变量中。此外,此处文档中的空行会在 icinga2 的输入中产生一个 etrer 击键,之前没有其他任何内容。

正如您之前的问题中已经建议的那样,您可能应该在脚本中使用 icinga2 node setup 而不是 node wizard

【讨论】:

  • 谢谢,我正在阅读 icinga 节点设置命令的文档,不确定卫星节点如何访问服务器并获得 pki 票证。
  • 还是一样,ssh root@master icinga2 blah blah get ticket for "$f" | ssh user@"$f" 'ticket=$(cat); icinga2 node setup --ticket "$ticket" --etc --etc'
  • 不客气。如果此答案帮助您解决了问题,请考虑投票和/或接受它。另见help.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2019-07-12
相关资源
最近更新 更多