Как подключиться к удаленным хостам по ssh и запустить несколько команд

У меня есть скрипт, который читает текстовый файл, в котором перечислены все узлы:

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

Не могли бы вы помочь мне, я не уверен, как автоматизировать журнал на каждом сервере, и команды запуска должны быть автоматизированы.

Спасибо


person Irina I    schedule 25.07.2018    source источник
comment
Возможный дубликат Каков самый чистый способ ssh и запуска нескольких команд в Bash?   -  person jww    schedule 23.08.2019


Ответы (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 install или chown и т. д. более чем одну вещь с помощью одной команды.

Я не очень хорошо знаком с Yum, но загрузка пакета с wget, а затем запуск yum по тому же URL-адресу отдельно определенно выглядит неправильно. (Возможно, команда для установки загруженного пакета должна быть rpm вместо yum? По крайней мере, в Debian это разделение труда между apt-get и dpkg.)

Похоже, что myusername в основном имеет root-доступ - если это не так, возможно, установите sudo и добавьте myusername в файл sudoers как root непосредственно перед попыткой запустить это; и, очевидно, добавляйте sudo перед каждой привилегированной командой.

Опять же, это колеса, которые вы действительно не хотите изобретать заново. Установка CFengine или Ansible в качестве самого первого действия делает остальную часть несколько более простой, хотя, очевидно, также немного отличается.

person tripleee    schedule 26.07.2018
comment
Благодарю за ваш ответ. Токен, созданный на мастере, необходимо отправить клиенту ($f), как часть установки клиента, мне нужно будет запустить эту команду «код» мастера узла icinga2 «код», а затем один из подсказки будут нуждаться в этом жетоне. Как бы я передал это в подсказку? Спасибо Тег кода, который я добавил в свой комментарий, не работает - person Irina I; 26.07.2018
comment
Это ответы, которые я должен напечатать, есть ли способ автоматизировать это? ' Y Enter master.icinga.test.com Y 10.20.20.1 N Y [Билет PKI, созданный ранее на мастере Icinga] Enter Enter Y Y Enter Enter N N ' - person Irina I; 26.07.2018
comment
Лучше задать новый вопрос, чем накапливать новую информацию и дополнительные требования. - person tripleee; 26.07.2018