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 como você encontraria com ferramentas como cfengine
, mas em um conjunto de máquinas que não possuem agentes configurados. Isso pode realmente ser uma boa técnica de configuração cfagent
em um conjunto de máquinas remotas existentes.
ssh
configuration
bash
scripting
tremoloqui
fonte
fonte
Respostas:
Você pode transmitir um script e executá-lo efêmera, canalizando-o e executando um shell.
por exemplo
Naturalmente, a
"ls -l; echo 'Hello World'"
peça pode ser substituída por um script bash armazenado em um arquivo na máquina local.por exemplo
Felicidades!
fonte
Há várias maneiras de fazer isso.
1:
2:
3:
número 3 é o meu caminho preferido, ele permite comandos interativos, por exemplo
su -S service nginx restart
(O nº 1 consumirá o restante do script como entrada para a pergunta de senha quando você o usar
su -S
.)fonte
Eu recomendaria o Fabric do python para este fim:
Você deve poder usar o descrito acima para começar. Consulte a excelente documentação do Fabric para fazer o resto. Como um adendo, é totalmente possível escrever seu script totalmente no Fabric - não é necessário copiar; no entanto, observe que, para alterar o script em todas as máquinas, você só precisará editar a cópia local e reimplementar. Além disso, com um pouco mais do que o uso básico da API, você pode modificar o script com base em qual host está sendo executado no momento e / ou em outras variáveis. É uma espécie de expectativa pitônica.
fonte
run
esudo
), nem é necessário.É exatamente para isso que o Ansible é usado. Não há agente, você apenas precisa criar um arquivo de texto chamado:
com conteúdo parecido com:
Isso especificaria que as máquinas "web1, web2 ... web8" estão no grupo "webhosts". Então você pode fazer coisas como:
para reiniciar o serviço apache2 em todas as suas máquinas, usando o sudo.
Você pode executar comandos on the fly como:
ou você pode executar um script local na máquina remota:
ou você pode criar um manual (consulte a documentação para obter detalhes) com uma configuração completa com a qual deseja que seus servidores estejam em conformidade e implantá-la:
Basicamente, você pode começar a usá-lo como uma ferramenta de linha de comando para executar comandos em vários servidores e expandir seu uso em uma ferramenta de configuração completa, conforme desejar.
fonte
ansible webhosts -m script script.sh
Conforme explicado nesta resposta, você pode usar o heredoc :
Você precisa ter cuidado com o heredoc, porque ele envia apenas texto, mas na verdade não espera a resposta. Isso significa que não esperará que seus comandos sejam executados.
fonte
A resposta aqui ( https://stackoverflow.com/a/2732991/4752883 ) funciona muito bem se você estiver tentando executar um script em uma máquina Linux remota usando
plink
orssh
. Funcionará se o script tiver várias linhas ativadaslinux
.** No entanto, se você estiver tentando executar um script em lote localizado em uma
linux/windows
máquina local e a sua máquina remota estiverWindows
, ela consiste em várias linhas usando **plink root@MachineB -m local_script.bat
não vai funcionar.
Somente a primeira linha do script será executada. Esta é provavelmente uma limitação de
plink
.Solução 1:
Para executar um script em lotes com várias linhas (especialmente se for relativamente simples, consistindo em algumas linhas):
Se o script em lote original for o seguinte
você pode combinar as linhas usando o separador "&&", como segue no seu
local_script.bat
arquivo, da seguinte maneira : https://stackoverflow.com/a/8055390/4752883 :Após essa alteração, você poderá executar o script conforme indicado aqui por @ JasonR.Coombs: https://stackoverflow.com/a/2732991/4752883
Solução 2:
Se o seu script em lote for relativamente complicado, pode ser melhor usar um script em lote que encapsule o comando plink, bem como a seguir, conforme indicado aqui por @Martin https://stackoverflow.com/a/32196999/4752883 :
fonte
Por que não simplesmente copiar o script primeiro e depois executá-lo?
É claro que você deve tomar cuidado para não carregá-lo em um local gravável pelo mundo, para que ninguém mais possa mexer nele antes de executá-lo (possivelmente como root).
fonte
Reescreva o script de maneira que cada comando já seja prefixado com ssh e um nome de host / ip ou lista dele seja passado para o script como argumento (assumindo que você tenha a autenticação de chave sem senha / ssh-agent configurada). Pode ser necessário algum trabalho para transmitir corretamente os códigos de erro / retorno dos comandos remotos ....
fonte
Se o script não for muito grande e você estiver usando o bash ou o ksh ...
Stdin e stdout funcionam corretamente, mas o script é limitado ao tamanho do argumento (geralmente cerca de 100k). Argumentos para o script podem funcionar, no final da linha, possivelmente após um argumento "-" extra. O "-t" para alocar um pty é opcional.
Cuidado: Isso confunde a conclusão do bash, não clique na guia.
fonte