8 votos

¿Propagación automática de la configuración de bash en muchas máquinas?

Necesito consolar a muchas máquinas a través de SSH. Incluyendo Linux, Mac, dispositivos móviles, máquinas virtuales. A veces necesito iniciar sesión en más de 10 máquinas en un día.

Disfruto de mis configuraciones personales .bashrc o .bash_profile, como el prompt (PS1), el control del historial, los alias y otras configuraciones útiles. Pero mantener estas configuraciones a través de muchas máquinas no es más que un dolor.

Así que si alguien tiene idea de cómo automatizar esto? Lo mejor sería 'llevar' la configuración conmigo desde mi 'motherworld-PC'.

7voto

Onilton Maciel Puntos 236

Puede utilizar el enfoque descrito en https://serverfault.com/a/400782

Tendrá que utilizar PermitLocalCommand y LocalCommand para lograrlo.

Creo que esa solución está bien, pero no me gustó ya que reemplazará el .bashrc de la máquina remota por scp mi .bashrc local al .bashrc remoto. Además no pude hacer que funcionara exactamente como esperaba.

Otra solución es utilizar git para gestionar todos sus archivos dot, como se describe en

http://blog.smalleycreative.com/tutorials/using-git-and-github-to-manage-your-dotfiles/

Pero un gran problema para mí es que tendría que configurar cada servidor con mis archivos dot. Incluso si tuviera el tiempo (y la paciencia) para desplegar mis archivos dot en cada servidor, todavía tendría un problema.

Imaginando un contexto en el que más de un usuario se conecta al mismo servidor utilizando el mismo login, sería injusto cambiar los valores por defecto del servidor a mi por defecto.

Entonces...


Así que desarrollé mi propia solución para eso, espero que te guste y te sea útil:

Tendrás que hacerlo:

  • Crear un gist (privado) en https://gist.github.com/ de su .bashrc
    • Necesitarás un login en github para crear un gist
    • Preste atención a la información sensible como las contraseñas en las variables de entorno .bashrc. De todos modos ese tipo de información no debería estar allí en primer lugar.
    • No tome por el nombre que dio para el archivo gist. Lo llamaré GISTNAME . Elija un nombre que sea difícil de encontrar en el directorio remoto. No lo llames ".bashrc" por favor. =) Un buen nombre sería mycustombashrc.sh
    • Después de guardar el gist, obtenga el enlace de la versión cruda del mismo haciendo clic en el botón <> botón. Necesitará este enlace, el enlace gist en bruto o RAWGISTLINK

Entonces, en su local .bashrc pon lo siguiente al final:

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

}

Recuerde para sustituir a GISTNAME y RAWGISTLINK

Ahora corre

source ~/.bashrc

Y luego sólo hay que usar customssh (seguirá teniendo el ssh )

customssh mylogin@remoteserver

Pruebe ahora uno de sus alias.

Notas

  • Sí, esto probablemente descargará el archivo gist en cada inicio de sesión, pero créeme, es REALMENTE rápido. No te preocupes.
  • Para actualizar el .bashrc compartido
    • Vaya a la url del gist, y haga sus cambios (o copie su .bashrc local).
    • A continuación, actualice la función customssh sustituyendo RAWGISTLINK por el nuevo RAWGISTLINK (el enlace gist y GISTNAME es el mismo, pero el enlace gist crudo cambia cuando se hacen cambios en el archivo).
    • Ahora sólo tiene que ejecutar source ~/.bashrc . Ya está. No es necesario cambiar nada ¡en sus servidores remotos!
  • Mi solución está totalmente basada en Ubuntu, quizás necesite algunos ajustes para que funcione con otras distros
  • Probablemente puedas utilizar otros servicios como gist en lugar del gist de github. Pastebin es un ejemplo, pero hay otros. Es totalmente posible, pero aún no lo he probado.
  • También podría wget su custombashrc.sh desde otros lugares. Un servidor web público, por ejemplo.
  • Otra opción, si tu máquina local es visible en internet a través de ssh, podrías simplemente scp el archivo desde el servidor local (utilizando la dirección pública) al servidor remoto. No utilicé esta solución porque es difícil asumir que tu máquina local no estará escondida detrás de un router o firewall (En mi caso, estoy detrás de un router)
  • Tal vez se puedan encontrar problemas en diferentes versiones de ubuntu, pero yo no he podido encontrarlos todavía.

Lo mejor de este enfoque es que no cambia nada en los servidores remotos y con poco esfuerzo en la máquina local y con gist consigues toda la diversión de tu .bashrc local en cualquier servidor que quieras.

Y todavía puede "desactivar" esto fácilmente utilizando ssh en lugar de customssh .

3voto

Keith Sirmons Puntos 2558

Un enfoque común para esto es poner sus dotfiles en github u otro sistema de control de versiones. No solo puedes actualizarlos fácilmente, sino que mantienes un historial de los cambios que has hecho para cuando necesites revertir algo.

Las búsquedas rápidas en Google de "dotfiles en github" y "dotfiles en el control de versiones" me dieron un par de páginas que parecen útiles:

Después de configurar esto, podrías automatizar las actualizaciones con un cronjob en cada servidor o simplemente añadiendo un "git pull" en tu .bash_profile.

1voto

int_541 Puntos 300

Algo así como rsync probablemente se ajuste a tus necesidades. Si eso no es una opción, utiliza Dropbox para sincronizar los archivos en cada dispositivo y crea un enlace simbólico entre el archivo sincronizado localmente y el lugar donde lo necesitarías.

1voto

singular Puntos 121

Puede encontrar esta herramienta útil, aunque github es probablemente el camino a seguir si estas son todas sus máquinas y no máquinas compartidas:

sshrc funciona igual que ssh, pero también origina ~/.sshrc después de iniciar la sesión de forma remota.

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

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

Puede utilizarlo para establecer variables de entorno, definir funciones y ejecutar comandos posteriores al inicio de sesión. Es así de simple, y no afectará a otros usuarios en el servidor - incluso si ellos usan sshrc también. Para una configuración más avanzada, continúe leyendo. https://github.com/Russell91/sshrc

1voto

user2624744 Puntos 111

Recientemente me encontré con esta pregunta y pensé en añadir mi respuesta sobre cómo empujó mi archivo .bashrc alrededor de múltiples hosts.

En este ejemplo hipotético hay 18 servidores "vcn" que necesitaban mi archivo .bashrc. Si tienes la suerte de tener una convención de nomenclatura estandarizada, puedes aprovechar las llaves en bash y utilizar un bucle para iterar los nombres de los servidores anexados de forma numérica. Entonces simplemente scp el archivo local .bashrc a ellos.

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

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: