/adept

Adept is a simple way to run commands & deploy apps on multiple servers using shell & SSH.

Primary LanguageShellGNU General Public License v2.0GPL-2.0

  █████╗ ██████╗ ███████╗██████╗ ████████╗
  ██╔══██╗██╔══██╗██╔════╝██╔══██╗╚══██╔══╝
  ███████║██║  ██║█████╗  ██████╔╝   ██║   
  ██╔══██║██║  ██║██╔══╝  ██╔═══╝    ██║   
  ██║  ██║██████╔╝███████╗██║        ██║   
  ╚═╝  ╚═╝╚═════╝ ╚══════╝╚═╝        ╚═╝   

Adept

Adept is a very simple way to run commands & deploy apps on multiple servers. It runs on Shell (Linux, Mac, etc), over SSH and without any agents. Adept was created by non-DevOps folks at @UnwiredLabs to quickly manage ~ 25 servers without learning ansible or chef.

###How it works

Adept uses SSH to login to one or more servers and execute a series of sh/bash commands. This can be done sequentially or parallely. Commands are executed from the entry script - deploy.sh and the structure of a typical command is as follows:

$ ./deploy.sh <Host-group file / SSH identity> <Task file> [Parallel or Sequential; default sequential]

Host group & Task files are stored in the ./hosts and ./tasks folders respectively. Hosts are read from the local SSH config file, usually located at ~/.ssh/config. These hosts need to be configured with SSH keys.

###Things you could do on multiple systems with Adept

  • Install a new stack
  • Add / remove users
  • Copy config files to multiple servers while also executing commands (using sFTP)
  • Deploy a script (git pulls, etc)
  • Deploy a new system by installing default tools
  • Just about anything else you do in Shell / Bash, but want replicated :-)

###Examples These examples are included in /tasks folder of the project

####Show current system date on all servers parallely:

$ ./deploy.sh all date 1

####Show available disk space on all servers sequentially:

$ ./deploy.sh all disk 0

####Deploy LAMP-server on a group of hosts:

$ ./deploy.sh webservers deploy-lamp

Adept can also use sFTP to copy files, such as config files, to servers. In-order to deploy the configuration files, we recommend you place them under ./configs folder

####Deploy a PHPMyAdmin instance on a single host:

$ ./deploy.sh host1 deploy-pma

###Adding servers / host-groups

####Create a host-group

  • Create a new <host-group-name>.txt file in ./hosts folder
  • Enter host names (as configured in your local ~/.ssh/config file) separated by |
  • The last host name should be followed by | for the file to work

####For a single server

  • You don't have to create a host file. Directly enter the SSH identity name in place of the hostgroup.

###Writing Adept scripts

####Create a task

  • Create a new <task-name>.sh file in ./tasks folder
  • A simple task file looks like this:
ssh -t -t "$line" \
'hostname &&
exit;'
  • This task can execute both parallely or in sequentially
  • If it's a parallel task, you should use the following style of code to ensure output for each host comes together:
out=$(printf "\n*SSH to $line*\n\n"
ssh -t -t "$line" \
  'hostname;
  echo -ne "Git pull \t";
  cd /var/www/ &&
  git pull -q && echo "Done";
  exit;
')

printf "%s\n\n" "$out"
  • To prevent parallel execution, use this snippet inside your task file:
if [ "$typeExec" = "1" ]; then
    echo "Cannot run parallely, please set parallel to 0"
    exit
fi
  • Error handling: Use && at the end of a line to exit if there's an error and ; to continue even if there are errors.

####Create a local-only task To create a task or host-group that's only accessible on your local machine and not visible to GIT, add @ to the task or host group and save it in the /local/ sub-directory.

####Road-map for new features

  • Conditions before deploying, like running the tests locally before deploying a project
  • Show only error output instead of everything, so it's easier to manage deployments for more servers
  • Auto-predict list of hosts & tasks
  • Stay simple :-)
  • Any other ideas, folks?

Logo credit: http://patorjk.com/software/taag/