Cloud shell helpers

Wrapper around doctl, kubectl to build aliases for easier access to cloud server and services. Special mention to kubetail which does the multiple kubernetes containers tailing.

Features

  • DigitalOcean aliases for ssh-ing to droplets
  • DigitalOcean aliases for connecting to your databases (MySQL, Postgres, Redis)
  • Refreshes DigitalOcean certificate for kubernetes
  • Kubernetes aliases for tailing single or multiple pods and opening a shell inside a pod

Installation

Requirements

If you're using DigitalOcean's Databases you'll need some clients for the aliases to work.

  • A MySQL client (mysql - version 8 needed for TLS, mycli)
  • A Postgres client (psql, pgcli)
  • Redis client (you'll need redli as it needs TLS support)

Install

Install the cloud-sh gem

gem install cloud-sh

Usage

Login to your DigitalOcean account(s) using doctl auth init --context context-name.

Write a YAML file to ~/.config/cloud-sh.yml

- name: personal      # name of the account; will be used to prefix aliases
  kind: do            # cloud kind (do - digitalocean only support for now)
  default: true       # if true don't use the name to prefix aliases (default: false)
  context: default    # doctl context
  clusters:           # customize K8S clusters aliases
  - name: k8s-01      # name as it is at DigitalOcean
    alias: staging    # alias name to be used in aliases (defaults to name)
    default: true     # if true don't use the name / alias as prefix (default: false)
    ignore: true      # don't create aliases for this (default: false)
  databases:          # customize databases aliases
  - name: pg-01       # name as it is at DigitalOcean
    alias: staging    # alias name to be used in aliases (defaults to name)
    default: true     # if true don't use the name / alias as prfix (default: false)
    ignore: true      # don't create aliases for this (default: false)

After that you can run cloud-sh refresh you'll get the aliases written to ~/.cloud_sh_aliases.

Shell Integration

  1. Manual Integration

Run cloud-sh refresh to generate the aliases in ~/cloud_sh_aliases and load the aliases with source ~/cloud_sh_aliase.

  1. Automatic Integration

Setup a cron job to generate aliases:

*/5 * * * * . $HOME/.profile; cloud-sh refresh 2>&1 | logger -t cloud-sh

And load the aliases using for shell. For zsh I'm adding to .zshrc:

reload_cloud_sh() {
  source ~/.cloud_sh_aliases
}
add-zsh-hook precmd reload_cloud_sh

Digital Ocean aliases

do-[-name]-ssh-[dashed-droplet-name]

do-[-name]-psql-[db-cluster-name]-[db-name]
do-[-name]-pgcli-[db-cluster-name]-[db-name]
do-[-name]-pgdump-[db-cluster-name]-[db-name]

do-[-name]-mysql-[db-cluster-name]-[db-name]
do-[-name]-mycli-[db-cluster-name]-[db-name]
do-[-name]-mysqldump-[db-cluster-name]-[db-name]

do-[-name]-redis-[db-cluster-name]

K8S aliases

Cloud-sh will write a ~/.kube/cloud_sh_config with the clusters configuration for kubectl. If you don't have a different kubectl config you can make a symbolic link from ~/.kube/config to ~/.kube/cloud_sh_config or you pass --kubeconfig='~/.kube/cloud_sh_config' to kubectl.

Note: For K8S it will try to guess a pod name by removing the groups or random groups of chars from the end (5 random alpa numeric or 8-10 hexa)

# Switch current kubectl context
k8s-[-name]-switch-to-[cluster-name]
k8s-personal-switch-to-k8s-01 # switch to cluster k8s-01 of the personal account
k8s-switch-to-k8s-01 # switch to cluster k8s-01 of the default account

# Execute kubectl in a given cluster
k8s-[-name]-ctl-[cluster-name]
k8s-personal-ctl-k8s-01 get pod --all-namespaces

# Tail all pods in a namespace
k8s-[-name]-[cluster-name]-[namespace]-tail-all

# Tail by pod name (prefix). Supported arguments:
# --tail - number of initial lines (default: 10)
k8s-[-name]-[cluster-name]-[namespace]-tail-[pod-name]

# Exec a shell in a specific pod. Supported arguments:
# --cmd - command to be executed (default: bash)
k8s-[-name]-[cluster-name]-[namespace]-exec-[-pod-name]

# if there's a pod named console then it will run bundle exec rails console in that pod
k8s-[-name]-[cluster-name]-[namespace]-rails-console

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/cristianbica/cloud-sh.

License

The gem is available as open source under the terms of the MIT License.