Bad Daemons

Plugin de Oh My ZSH para mostrar contexto de kubernetes

Aldún día haré un articulo explicando que es kubernetes, por que no es algo simple de hacer. Pero aprovecharé este para explicar que es Oh My ZSH.

Yo antes usaba bash, más por costumbre que por ningún motivo en concreto. Me fuí haciendo funcioncillas, un prompt molón y demás, pero aunque es divertido trastear eso, no era lo que más queria hacer. Empecé a ver por ahí imágenes de prompts con un montón de información útil, como el estado de un repositorio git acompañado de iconos chulos. Empecé a mirar como hacer eso a manubrio y por casualidad me encontré con Oh My ZSH, un framework de gestión de configuraciones de la shell ZSH. Provee de muchos temas, plugins, funciones y demás que hacen que sea muy fácil y rápido gestionar todo lo que tenga que ver con la shell. Por poner un ejemplo, ahí va una captura de mi terminal en mi home:

ohmyzsh-prompt-0.png

No tiene mucho de especial de por si, pero si entramos en un directorio que sea un repositorio git…:

ohmyzsh-prompt.png

Si que vemos algo de información. Y si activamos un virtualenv de python…:

ohmyzsh-prompt-2.png

Vemos que aparece en una sección a parte el nombre calendar-cli, que es el nombre del virtualenv que he activado para el ejemplo.

Para aprender sobre los plugins, funciones y demás que se incluyen en este framework, recomiendo leer la wiki. Lo bueno que tiene es que se puede empezar a usar nada más instalarlo sin tener que leer mucho de golpe, de modo que no agobia demasiado el cambio.

El título del articulo, en cualquier caso, no va de Oh My ZSH solamente, sinó de un plugin que muestra en que contexto está kubernetes y la gestión de estos. Antes de ver como usarlo, voy a aclarar el concepto de "contexto" en kubernetes. Cuando usas kubectl, todas las credenciales se guardan por defecto en ~/.kube/config. Kubernetes usa estas credenciales para loguearse en los distintos clusters al hacer peticiones.

Esto tiene dos problemas: por un lado es muy incómodo, por que cada vez que tienes que añadir una credencial, tienes que ponerlo a mano. Pero la parte más importante para mi es que es muy peligroso. Cualquier orden que se ejecute con kubectl, se ejecutará en el último cluster de kubernetes en el que hayas estado operando. Cuando tienes más de uno, dos o tres contextos, puedes liarla muy gorda si no estás atento todo el rato. Y todos sabemos que es imposible estar atento todo el rato.

Por ello decidí crear un plugin de Oh My ZSH que permita tener los contextos partidos en más de un fichero, que por defecto no atacáse a ningún cluster y que me mostrase en que contexto estoy en el prompt:

ohmyzsh-prompt-3.png

Digo crear, pero es una copia flagrante del plugin de Oh My ZSH para gestionar perfiles de AWS, que por cierto es muy recomendable si soléis usar AWS por los mismos motivos que he mencionado.

Cuando terminé ese plugin, lo primero que hice fue crear un PR al repositorio oficial de Oh My ZSH, pero dado que tienen 876 PR pendientes, no cuento con que sea aceptado en mucho tiempo. Por ello veremos como instalarlo a lo cutre, tirando del fork que hice para hacer el PR:

mkdir -p ~/.oh-my-zsh/custom/plugins/kube/
wget https://raw.githubusercontent.com/drym3r/oh-my-zsh/7df05596467b635a476f85e7cda0f94a86e5685a/plugins/kube/kube.plugin.zsh -O ~/.oh-my-zsh/custom/plugins/kube/kube.plugin.zsh

Una vez hecho, hay que partir todas las credenciales que haya en ~/.kube/config en todos los contextos que se quiera tener, recordando siempre mantener la estructura ~/.kube/$nombre_contexto-config. Por último, solo quedará cargar el plugin en la configuración y hace que la información del contexto aparezca en el prompt.

Ambos procesos son estandar en lo que a Oh My ZSH se refiere. Para cargar la configuración hay que añadirlo en la variable plugins, que ya deberiais haber definido en el fichero ~/.zshrc. Algo parecido a esto:

plugins=(git colored-man-pages sprunge gpg-agent pip ssh-agent aws kube)

Por último, solo queda añadir la información del contexto al prompt. Yo uso un tema externo, que es powerlevel9k, por lo que mi método no vale para quien no use ese tema. Para quien no lo use, solo puedo decir que creo que tiene sentido que haya que tocar la variable ZSH_THEME_GIT_PROMPT_SUFFIX. Para añadirlo usando el tema que uso, se puede consultar mi configuración.