Я ищу способ передачи конфигурации с одной центральной машины на несколько удаленных машин без необходимости установки чего-либо на удаленных машинах.
Цель состоит в том, чтобы сделать что-то вроде того, что вы найдете с помощью инструментов вроде cfengine
, но на наборе машин, на которых не установлены агенты. Это может быть на самом деле хорошей техникой настройки cfagent
на наборе существующих удаленных машин.
решение1
Вы можете передать скрипт и заставить его выполняться эфемерно, передав его по конвейеру и выполнив оболочку.
например
echo "ls -l; echo 'Hello World'" | ssh me@myserver /bin/bash
Естественно, эту "ls -l; echo 'Hello World'"
часть можно заменить скриптом bash, сохраненным в файле на локальной машине.
например
cat script.sh | ssh me@myserver /bin/bash
Ваше здоровье!
решение2
Есть несколько способов сделать это.
1:
ssh user@remote_server 'bash -s' < localfile
2:
cat localfile | ssh user@remote_server
3:
ssh user@remote_server "$(< localfile)"
Номер 3 — мой предпочтительный способ, он позволяет выполнять интерактивные команды, напримерsudo -S service nginx restart
(#1 и #2 будут использовать остальную часть скрипта в качестве входных данных для вопроса пароля, когда вы используете sudo -S
.)
решение3
Я бы рекомендовал использовать Fabric Python для этой цели:
#!/usr/bin/python
# ~/fabfile.py
from fabric_api import *
env.hosts = ['host1', 'host2']
def deploy_script():
put('your_script.sh', 'your_script.sh', mode=0755)
sudo('./your_script.sh')
# from shell
$ fab deploy_script
Вы должны быть в состоянии использовать вышеизложенное, чтобы начать. Проконсультируйтесь с Fabric's greatдокументациядля выполнения всего остального. В качестве дополнения, вполне возможно написать свой скрипт целиком в Fabric — копирование не требуется, однако следует отметить, что для изменения скрипта на всех машинах вам нужно будет только отредактировать локальную копию и повторно развернуть. Кроме того, с использованием API, немного большим, чем просто базовое, вы можете изменить скрипт на основе того, на каком хосте он в данный момент запущен и/или других переменных. Это своего рода Expect на Python.
решение4
Как объяснено вэтот ответвы можете использоватьхередок:
ssh user@host <<'ENDSSH'
#commands to run on remote host
ENDSSH
С heredoc нужно быть осторожнее, потому что он просто отправляет текст, но не ждет ответа. Это значит, что он не будет ждать выполнения ваших команд.