propagação automática de configurações bash em muitas máquinas?

6

Eu preciso consolar para muitas máquinas através do SSH. Incluindo Linux, Mac, dispositivos móveis, máquinas virtuais. Às vezes, preciso fazer login em mais de 10 máquinas em um dia.

Eu gosto de minhas configurações pessoais .bashrc ou .bash_profile, como prompt (PS1), controle de histórico, aliases e outras configurações úteis. Mas manter essas configurações em muitas máquinas não é nada além de dor.

Então, se alguém tem idéia de como automatizar isso? Melhor seria 'carregar' as configurações comigo do meu 'motherworld-PC'.

    
por exebook 26.04.2013 / 05:41

6 respostas

7

Você pode usar a abordagem descrita no link

Você terá que usar o PermitLocalCommand e o LocalCommand para conseguir isso.

Eu acho que a solução é Ok, mas eu não gostei, pois irá substituir o .bashrc da máquina remota por scp ing meu .bashrc local para o .bashrc remoto. Também não consegui fazer funcionar exatamente como eu esperava.

Outra solução é usar o git para gerenciar todos os seus arquivos de ponto, como descrito em

link

Mas um grande problema para mim é que eu teria que configurar cada servidor com meus arquivos de ponto. Mesmo se eu tivesse tempo (e paciência) para implantar meus arquivos de pontos em cada servidor, eu ainda teria um problema.

Imaginando um contexto em que mais de um usuário faz login no mesmo servidor usando o mesmo login, seria injusto alterar os padrões do servidor para os padrões meu .

Então ...

Então, desenvolvi minha própria solução para isso, espero que você goste e ache útil:

Você precisará:

  • Crie uma essência (privada) no link do seu .bashrc
    • Você precisará de um login no github para criar uma essência
    • Preste atenção a informações confidenciais, como senhas, em variáveis de ambiente .bashrc. De qualquer forma esse tipo de informação não deveria estar lá em primeiro lugar.
    • Analise o nome que você deu para o arquivo gist. Eu vou chamar isso de GISTNAME . Escolha um nome que é improvável encontrar no diretório remoto. Não o chame de ".bashrc" por favor. =) Um bom nome seria mycustombashrc.sh
    • Depois de salvar a essência, obtenha o link da versão raw clicando no botão <> . Você precisará desse link, o link de essência ou RAWGISTLINK

Em seguida, no seu local .bashrc , coloque o seguinte no final:

function customssh(){
  ssh $@ -t 'cd $HOME ; 
  wget --quiet -N "RAWGISTLINK" ;
  cp GISTNAME .'$USER'bashrc  ; 
  bash --rcfile $HOME/.'$USER'bashrc'

}

Lembre-se para substituir GISTNAME e RAWGISTLINK

Agora corra

source ~/.bashrc

E, em seguida, use apenas customssh (você ainda terá o ssh normal)

customssh mylogin@remoteserver

Tente um dos seus alias agora!

Notas

  • Sim, isso provavelmente fará o download do arquivo gist em cada login, mas acredite, é muito rápido. Não se preocupe.
  • Para atualizar o .bashrc compartilhado
    • Vá para a URL da gist e faça as alterações (ou copie o local .bashrc para ele).
    • Em seguida, atualize a função customssh substituindo o RAWGISTLINK com o novo RAWGISTLINK (o link gist e GISTNAME é o mesmo, mas o link bruto do gist muda quando você faz alterações no arquivo).
    • Agora é só executar source ~/.bashrc . É isso! Não há necessidade de mudar nada em seus servidores remotos!
  • Minha solução é totalmente baseada no Ubuntu, talvez precise de alguns ajustes para funcionar com outras distros
  • Você provavelmente pode usar outros serviços como o gist em vez da essência do github. O Pastebin é um exemplo, mas existem outros. É totalmente possível, mas ainda não tentei.
  • Você também pode wget do seu custombashrc.sh de outros lugares. Um servidor web público, por exemplo.
  • Outra opção, se a sua máquina local estiver visível na Internet por meio do ssh, você poderá apenas scp do arquivo do servidor local (usando o endereço público) para o servidor remoto. Não usei essa solução porque é difícil supor que sua máquina local não ficará oculta atrás de um roteador ou firewall (no meu caso, estou atrás de um roteador)
  • Talvez você encontre problemas em diferentes versões do Ubuntu, mas ainda não consegui encontrá-los.

A melhor coisa sobre essa abordagem é que ela não muda nada nos servidores remotos e com pouco esforço na máquina local e com a essência você obtém toda a diversão do seu local .bashrc em qualquer servidor que você queira.

E você ainda pode facilmente "desativar" isso usando ssh em vez de customssh .

    
por 26.04.2013 / 19:08
2

Uma abordagem comum para isso é colocar seus dotfiles no github ou em outro sistema de controle de versão. Além de poder atualizá-los facilmente, você mantém um histórico das alterações feitas quando precisa reverter algo.

As pesquisas rápidas do Google para "dotfiles no github" e "dotfiles no controle de versão" me deram algumas páginas que parecem úteis:

Depois de configurá-lo, você pode automatizar as atualizações com um cronjob em cada servidor ou simplesmente adicionar um "git pull" em seu .bash_profile.

    
por 26.04.2013 / 17:57
1

Algo como o rsync provavelmente atende às suas necessidades. Se isso não for uma opção, use o Dropbox para sincronizar os arquivos em cada dispositivo e crie um link simbólico entre o arquivo sincronizado localmente e onde você precisaria.

    
por 26.04.2013 / 09:02
1

Você pode achar esta ferramenta útil, embora o github seja provavelmente o caminho a percorrer se todas essas máquinas forem máquinas e não máquinas compartilhadas:

sshrc works just like ssh, but it also sources ~/.sshrc after logging in remotely.

$ echo "echo welcome" > ~/.sshrc
$ sshrc me@myserver
welcome

$ echo "alias ..='cd ..'" > ~/.sshrc
$ sshrc me@myserver
$ type ..
.. is aliased to 'cd ..'

Você pode usar isso para definir variáveis de ambiente, definir funções e executar comandos de pós-login. É simples assim, e não afetará outros usuários no servidor - mesmo se eles usarem o sshrc também. Para uma configuração mais avançada, continue lendo. link

    
por 12.09.2014 / 09:46
1

Recentemente, deparei com essa pergunta e pensei em adicionar minha resposta sobre como eu transferi meu arquivo .bashrc para vários hosts.

Neste exemplo hipotético, existem 18 servidores "vcn" que precisavam do meu arquivo .bashrc. Se você tiver a sorte de ter uma convenção de nomenclatura padronizada, poderá tirar proveito das chaves no bash e usar um loop para iterar nomes de servidores acrescentados de maneira numérica. Então apenas scp o arquivo .bashrc local para eles.

for vcn in r1-vcn{1..9} r2-vcn{1..9}; do scp ~/.bashrc $vcn:/home/user/; done;
    
por 07.04.2016 / 19:53
1

Você pode usar seu bashrc sem ter que baixá-lo ou modificar qualquer coisa no servidor em que esteja, se fizer o seguinte. O arquivo fica enrolado na origem, o que significa que ele existe apenas na memória e apenas para essa sessão.

source <(curl -s -A '' https://somedomain.com/bashrc);
    
por 27.11.2017 / 16:56