Anotación Un artículo sobre un script muy simple que forma una configuración para ssh Linux a partir de una lista de servidores. Probado en Ubuntu 18, utiliza Goodle Cloud SDK, Python 2.7, Bash.
Después de un fuerte aumento en la cantidad de servidores con los que tengo que trabajar, me di cuenta de que el almacenamiento de contraseñas y CMDB ya no proporcionan ese acceso operativo, como en aquellos días en que solo recordaba toda la ip y los detalles de memoria. Tal vez porque CMDB aún no hemos dominado. Sin embargo, de alguna manera es necesario resolver el problema del acceso rápido a través de SSH a una gran cantidad de servidores.
Siguiente: desde el punto de vista del terminal Linux (realizado en Ubuntu 18). Tal vez funciona en otras distribuciones y, probablemente, incluso hay un análogo en Windows: no busqué.
Los requisitos principales:
- Fácil de repetir Varios administradores
y necesita la capacidad de configurar lo mismo para todos. Además, permitimos el trabajo remoto: al menos cada computadora portátil tiene una situación, pero sucede que usted no trabaja en su computadora habitual "depurada y depurada". - Los servidores se agregan, eliminan, cambian las direcciones. Esto debe ser considerado.
Para hacer esto, decidí usar hosts alias en la configuración de ssh, obtener la lista de servidores a través del cliente gcloud cli GCP y automatizar todo esto usando Python 2.7 (porque estaba por defecto en Ubuntu y decidí estudiarlo para trabajar con datos). El guión en sí con una descripción debajo del corte.
Declaración del problema.
La idea era esta: mantener una lista de servidores de alias de comunicación y sus direcciones actuales de tal manera que solo se pudiera usar un nombre para establecer una conexión. Al mismo tiempo, la API actualiza periódicamente la lista en sí desde GCP.
Como resultado, hubo varias tareas:
- Conectarse al host escribiendo solo un nombre memorable (generalmente formamos los nombres de acuerdo con reglas estrictas, por lo que es suficiente conocer al cliente y al sistema para adivinar el nombre del servidor). Los nombres pueden ser reales (si el servidor está completamente creado por nosotros) o alias dentro de nuestro cmdb (si el servidor es creado por el cliente y el nombre se asigna de acuerdo con las reglas del cliente). En cualquier caso, recordar un nombre es más fácil que una dirección. La dirección también cambia.
- Obtener una lista de hosts actuales con direcciones válidas. Porque la plataforma principal es GCP y el 90% de los servidores están allí, entonces este problema se resolverá a través de su API y no mediante herramientas de monitoreo.
- Buscar por nombre de host. Aunque son más fáciles de recordar, el número está creciendo y la memoria no es ilimitada :) Sí, y los nuevos administradores son más fáciles.
- Actualizar paquete de alias: dirección solo cuando la dirección cambia. Esto es necesario para abandonar la reescritura completa de todos los paquetes. Esto permitirá el almacenamiento de paquetes no solo para servidores GCP. Hasta ahora, este problema no se ha resuelto :(
Descripción de la solución
Alias para conectar
Todo aquí es bastante simple y no lo he decidido yo. La utilidad ssh de Linux admite la configuración de alias en el archivo de configuración.
Ubicación del archivo: ~ / .ssh / config
El formato de archivo que utilizamos es muy banal, pero de hecho las posibilidades son mucho más amplias:
HOST alias_ HostName ip__-
Puede leer más sobre las opciones de configuración aquí , aquí o en la documentación oficial .
Pasos adicionales
- Use diferentes teclas para conectarse a diferentes grupos de hosts. Un poco de paranoia en términos de seguridad no hará daño.
- Proporcione una copia de seguridad de este archivo para protegerse contra cambios accidentales y actualice los errores de script.
Buscar nombres de host
Aquí la decisión no me pertenece en absoluto, sino a Ben Lobaugh y se describe en su artículo .
Dicho brevemente, usé sed, que, para facilitar el inicio (una regla muy larga en los parámetros) se abreviaba mediante un alias:
alias sshhosts="sed -rn 's/^\s*HOST\s+(.*)\s*/\1/ip' ~/.ssh/config"
Si necesita encontrar el host por la parte del nombre, este script se complementa perfectamente con la utilidad grep y, como resultado, resulta así:
sshhost | grep '---'
Hay otras opciones, por ejemplo, como se describe aquí .
Nombre de host autocompletado
Gracias por la solución onix74 !
Agregue la línea a ~ / .bash_completion:
complete -W "$(grep "^HOST " ~/.ssh/config | grep -v "\*" | sed 's/[^ ]* *\(.*\)/\1/')" ssh
Para el comando ssh, autocompletar funcionará de acuerdo con la lista de servidores de alias. Es decir Puede usar ssh para sustituir el nombre del servidor ssh. Funciona en bash.
Pasos adicionales
Planeo dividir los hosts en grupos para que pueda seleccionar todos los servidores de un cliente en particular o con una aplicación específica. Parece que esta característica será interesante para la ejecución masiva de scripts y la conexión Ansible; así como para crear diferentes detalles de conexión para diferentes grupos. Pero cuánto tiene sentido aún está por verse.
Obtenga una lista de hosts de GCP
En este paso, todo es bastante simple, excepto la configuración de parámetros (aunque aquí es una cuestión de experiencia). Decidí usar el SDK de GCloud para obtener datos, porque aunque rara vez lo uso, pero supongo que en algún momento esto me permitirá usar la interfaz gráfica cada vez menos y simplificar significativamente la rutina de administración. Por lo tanto, el argumento principal es ganar experiencia.
Probablemente, lo mismo podría hacerse usando curl y la API GCP REST, y luego la solución sería más universal (ya que los SDK de GCloud requieren una instalación e inicialización separadas, que no son tan complicadas, pero aún son necesarias).
Para obtener la información necesaria, tuve que usar el formato json. Aunque esto simplificó enormemente el procesamiento posterior de la respuesta recibida, le hizo pensar un poco sobre la configuración de los parámetros de formato en el SDK.
Como resultado, recibí el siguiente comando:
gcloud compute instances list --filter="status:running" --format="json(name, status, networkInterfaces[].accessConfigs[])"
Solo devuelve los servidores actualmente activos (no tiene sentido conectarse con el resto) con información sobre su nombre e interfaz de red. Hasta ahora, solo se usa una interfaz externa para cada servidor.
El resultado final llega a json:
[ ---...---- { "name": "-", "networkInterfaces": [ { "accessConfigs": [ { "kind": "compute#accessConfig", "name": "External NAT", "natIP": "ip-", "networkTier": "PREMIUM", "type": "ONE_TO_ONE_NAT" } ] } ], "status": "RUNNING" }, ----...--- ]
Pasos adicionales
Encuentre un formato cuya salida minimice o incluso elimine el procesamiento posterior.
Script para crear una lista de alias basada en datos de GCP
El script fue escrito en Python 2.7 por dos razones:
- Decidí estudiarlo para trabajar con datos;
- Python 2.7 es por defecto en la mayoría de los sistemas que ejecutan Linux; no habrá problemas para usarlo en otros lugares. Dado que incluso win ahora le permite poner un segundo sistema y usar Ubuntu como terminal.
El algoritmo es el siguiente:
- Obtenemos la lista de servidores de Google Cloud usando el SDK, iniciando la ejecución del comando en la consola desde python.
- Analizamos el JSON resultante en tipos compatibles con Python.
- Le damos la salida en el formato necesario para configurar ssh (si es necesario, la salida del script se redirige a ~ / .ssh / config o a algún archivo intermedio).
Actualizar solo datos modificados
Esta tarea aún está en progreso. Planeo leer el archivo ssh / config dentro del mismo script, compararlo con los valores recibidos y luego escribir todo el resultado. O genere un nuevo archivo por separado y realice una comparación utilizando algún tipo de diferencia; esto le permitirá confirmar manualmente todos los cambios.