Как использовать heredoc для ответов на оперативные вопросы

Я пытаюсь автоматизировать установку 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 [email protected] 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

Спасибо


person Irina I    schedule 27.07.2018    source источник
comment
<<EOF требует, чтобы EOF было выровнено по левому краю, а не с отступом.   -  person Charles Duffy    schedule 27.07.2018
comment
Кстати, вы можете прочитать свой linux-list.txt на FD, отличном от стандартного ввода, чтобы избежать необходимости </dev/null для каждого процесса, который в противном случае мог бы использовать часть своего содержимого. 5<linux-list.txt, а затем while read -r f <&5; do, например.   -  person Charles Duffy    schedule 27.07.2018
comment
Кроме того, этот вопрос немного широк — идеальный вопрос StackOverflow фокусируется только на одной конкретной проблеме с кратчайшим возможным минимальный воспроизводимый пример, воспроизводящий его; вот мой код, что похоже на то, что он может быть неправильным? Без конкретного неправильного поведения или усилий по сокращению до самого короткого воспроизводителя трудно построить канонический ответ.   -  person Charles Duffy    schedule 27.07.2018
comment
FWIW, предыдущий вопрос в этой длинной теме: stackoverflow.com/questions/51544500/   -  person tripleee    schedule 28.07.2018
comment
Пожалуйста, посмотрите: shellcheck.net   -  person Cyrus    schedule 28.07.2018


Ответы (1)


У вас есть несколько ошибок в коде.

#!/bin/bash

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

   ssh [email protected] 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) для прямого захвата его в переменную. Кроме того, пустые строки в этом документе производят нажатие клавиши etrer без каких-либо других действий перед ним на входе в icinga2.

Как уже предлагалось в предыдущих ваших вопросах, вам, вероятно, следует использовать icinga2 node setup вместо node wizard в сценариях.

person tripleee    schedule 27.07.2018
comment
Спасибо, я читаю документы для команды настройки узла icinga, но не знаю, как вспомогательный узел может получить доступ к серверу и получить билет pki. - person Irina I; 30.07.2018
comment
Всё так же, ssh root@master icinga2 blah blah get ticket for "$f" | ssh user@"$f" 'ticket=$(cat); icinga2 node setup --ticket "$ticket" --etc --etc' - person tripleee; 30.07.2018
comment
Пожалуйста. Если этот ответ помог вам решить вашу проблему, подумайте о том, чтобы проголосовать и/или принять его. См. также справку. - person tripleee; 31.07.2018