Как 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

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

Спасибо

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 файл как корень непосредственно перед попыткой запустить это; и, очевидно, добавить sudo перед каждой привилегированной командой.

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

Другие вопросы по тегам