Я ищу способ перенести конфигурацию с одного центрального компьютера на несколько удаленных машин без необходимости устанавливать что-либо на удаленных машинах.
Цель состоит в том, чтобы сделать что-то похожее на инструменты, подобные тем cfengine
, но на множестве машин, на которых не настроены агенты. На самом деле это может быть хорошей техникой настройки cfagent
на множестве существующих удаленных машин.
ssh
configuration
bash
scripting
tremoloqui
источник
источник
Ответы:
Вы можете передать сценарий и заставить его исполниться эфемерно, отправив его и выполнив оболочку.
например
Естественно, эту
"ls -l; echo 'Hello World'"
часть можно заменить скриптом bash, который хранится в файле на локальном компьютере.например
Ура!
источник
Есть несколько способов сделать это.
1:
2:
3:
номер 3 - мой предпочтительный способ, он позволяет интерактивные команды, например
su -S service nginx restart
(# 1 будет использовать остальную часть скрипта в качестве ввода для вопроса о пароле, когда вы используете
su -S
.)источник
Я бы порекомендовал Python's Fabric для этой цели:
Вы должны быть в состоянии использовать вышеупомянутое, чтобы начать. Обратитесь к отличной документации Fabric, чтобы сделать все остальное. Как дополнение, вы можете полностью написать свой скрипт в Fabric - копирование не требуется, однако следует отметить, что для изменения скрипта на всех машинах вам нужно будет только отредактировать локальную копию и заново развернуть ее. Более того, немного больше, чем просто базовое использование API, вы можете изменить сценарий в зависимости от того, на каком хосте он в данный момент работает и / или других переменных. Это своего рода питонический Ожидание.
источник
run
иsudo
), даже не нужно.Это именно то, для чего используется Ansible. Там нет агента, вам просто нужно создать текстовый файл с именем:
с контентом, который выглядит примерно так:
Это будет означать, что машины "web1, web2 ... web8" находятся в группе "webhosts". Тогда вы можете делать такие вещи, как:
перезапустить службу apache2 на всех ваших машинах, используя sudo.
Вы можете делать на лету команды, такие как:
или вы можете запустить локальный скрипт на удаленной машине:
или вы можете создать playbook (подробности смотрите в документации) с полной конфигурацией, которой вы хотите, чтобы ваши серверы соответствовали, и развернуть ее:
По сути, вы можете начать использовать его в качестве инструмента командной строки для запуска команд на нескольких серверах и расширить его использование в полноценный инструмент настройки по своему усмотрению.
источник
ansible webhosts -m script script.sh
Как объясняется в этом ответе, вы можете использовать heredoc :
Вы должны быть осторожны с heredoc, потому что он просто отправляет текст, но на самом деле не ждет ответа. Это означает, что он не будет ждать выполнения ваших команд.
источник
Ответ здесь ( https://stackoverflow.com/a/2732991/4752883 ) прекрасно работает, если вы пытаетесь запустить скрипт на удаленной машине Linux с помощью
plink
илиssh
. Это будет работать, если скрипт имеет несколько строкlinux
.** Однако, если вы пытаетесь запустить пакетный скрипт, расположенный на локальном
linux/windows
компьютере, а ваш удаленный компьютер естьWindows
, и он состоит из нескольких строк, используя **plink root@MachineB -m local_script.bat
это не сработает.
Будет выполнена только первая строка скрипта. Это, вероятно, ограничение
plink
.Решение 1:
Чтобы запустить многострочный пакетный скрипт (особенно, если он относительно простой и состоит из нескольких строк):
Если ваш оригинальный пакетный скрипт выглядит следующим образом
Вы можете объединить строки, используя разделитель «&&», как показано в вашем
local_script.bat
файле следующим образом https://stackoverflow.com/a/8055390/4752883 :После этого изменения вы можете запустить скрипт, как указано здесь @ JasonR.Coombs: https://stackoverflow.com/a/2732991/4752883
Решение 2:
Если ваш пакетный сценарий относительно сложен, может быть лучше использовать пакетный сценарий, который инкапсулирует команду plink, а также следующие действия, указанные здесь @Martin https://stackoverflow.com/a/32196999/4752883 :
источник
Почему бы просто не скопировать сначала сценарий, а затем запустить его?
Конечно, вы должны быть осторожны, чтобы не загружать его в доступное для записи место, чтобы никто другой не мог возиться с ним до того, как вы запустите его (возможно, от имени root).
источник
Перепишите сценарий таким образом , что каждая команда в нем уже будет с приставкой SSH и имя хоста / IP или список таких передается в скрипт в качестве аргумента (если у вас есть ключ аутентификации SSH-агент без пароля / настройки). Может потребоваться некоторая работа для правильной передачи кодов ошибок / возврата из удаленных команд ....
источник
Если скрипт не слишком большой, и вы используете bash или ksh ...
И stdin, и stdout работают правильно, но сценарий ограничен размером аргумента (обычно около 100 КБ). Аргументы сценария могут работать в конце строки, возможно, после дополнительного аргумента "-". «-T» для выделения pty является необязательным.
Осторожно: это смущает завершение bash, не нажимайте вкладку.
источник