1:

1:

Estou procurando uma maneira de enviar a configuração de uma máquina central para várias máquinas remotas sem a necessidade de instalar nada nas máquinas remotas.

O objetivo é fazer algo parecido com ferramentas como cfengine, mas em um conjunto de máquinas que não possuem agentes configurados. Na verdade, essa pode ser uma boa técnica de configuração cfagentem um conjunto de máquinas remotas existentes.

Responder1

Você pode passar um script e executá-lo efêmeramente canalizando-o e executando um shell.

por exemplo

echo "ls -l; echo 'Hello World'" | ssh me@myserver /bin/bash

Naturalmente, a "ls -l; echo 'Hello World'"parte poderia ser substituída por um script bash armazenado em um arquivo na máquina local.

por exemplo

cat script.sh | ssh me@myserver /bin/bash

Saúde!

Responder2

Há várias maneiras de fazer isso.

1:

ssh user@remote_server 'bash -s' < localfile

2:

cat localfile  | ssh user@remote_server

3:

ssh user@remote_server "$(< localfile)"

o número 3 é a minha forma preferida, pois permite comandos interativos, por exemplosudo -S service nginx restart

(#1 e #2 consumirão o restante do script como entrada para a pergunta da senha quando você usar sudo -S.)

Responder3

Eu recomendaria o Fabric do python para essa finalidade:

#!/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

Você deve ser capaz de usar o acima para começar. Consulte o excelente da Fabricdocumentaçãopara fazer o resto. Como adendo, é totalmente possível escrever seu script totalmente dentro do Fabric - sem necessidade de cópia, no entanto, deve-se observar que para alterar o script em todas as máquinas, você só precisaria editar a cópia local e reimplantar. Além disso, com um pouco mais do que o uso básico da API, você pode modificar o script com base no host em que ele está sendo executado e/ou outras variáveis. É uma espécie de expectativa pitônica.

Responder4

Como explicado emesta respostavocê pode usarheredoc:

ssh user@host <<'ENDSSH'
#commands to run on remote host
ENDSSH

É preciso ter cuidado com o heredoc, pois ele apenas envia texto, mas não espera realmente pela resposta. Isso significa que ele não esperará que seus comandos sejam executados.

informação relacionada