89 lines
3.0 KiB
Markdown
89 lines
3.0 KiB
Markdown
# Deploying Infra
|
|
|
|
## Intro
|
|
|
|
This repository can create a tusd server from scratch, following this flow:
|
|
|
|
```yaml
|
|
- prepare: Install prerequisites
|
|
- init : Refreshes current infra state and saves to terraform.tfstate
|
|
- plan : Shows infra changes and saves in an executable plan
|
|
- backup : Backs up server state
|
|
- launch : Launches virtual machines at a provider (if needed) using Terraform's ./infra.tf
|
|
- install: Runs Ansible to install software packages & configuration templates
|
|
- upload : Upload the application
|
|
- setup : Runs the ./playbook/setup.sh remotely, installing app dependencies and starting it
|
|
- show : Displays active platform
|
|
```
|
|
|
|
## Important files
|
|
|
|
- [envs/production/infra.tf](envs/production/infra.tf) responsible for creating server/ram/cpu/dns
|
|
- [playbook/playbook.yml](playbook/playbook.yml) responsible for installing APT packages
|
|
- [control.sh](control.sh) executes each step of the flow in a logical order. Relies on Terraform and Ansible.
|
|
- [Makefile](Makefile) provides convenience shortcuts such as `make deploy`. [Bash autocomplete](http://blog.jeffterrace.com/2012/09/bash-completion-for-mac-os-x.html) makes this sweet.
|
|
- [env.example.sh](env.example.sh) should be copied to `env.sh` and contains the secret keys to the infra provider (amazon, google, digitalocean, etc). These keys are necessary to change infra, but not packers & config, as the SSH keys are included in this repo
|
|
|
|
|
|
Not included with this repo:
|
|
|
|
- `envs/production/infra-tusd.pem`
|
|
- `env.sh`
|
|
|
|
As these contain the keys to create new infra and ssh into the created servers.
|
|
|
|
|
|
## Demo
|
|
|
|
In this 2 minute demo:
|
|
|
|
- first a server is provisioned
|
|
- the machine-type is changed from `c3.large` (2 cores) to `c3.xlarge` (4 cores)
|
|
- `make deploy-infra`
|
|
- it detects a change, replaces the server, and provisions it
|
|
|
|
![terrible](https://cloud.githubusercontent.com/assets/26752/9314635/64b6be5c-452a-11e5-8d00-74e0b023077e.gif)
|
|
|
|
as you see this is a very powerful way to set up many more servers, or deal with calamities. Since everything is in Git, changes can be reviewed, reverted, etc. `make deploy-infra`, done.
|
|
|
|
## Prerequisites
|
|
|
|
### Terraform
|
|
|
|
> Terraform can set up machines & other resources at nearly all cloud providers
|
|
|
|
Installed automatically by `control.sh prepare` if missing.
|
|
|
|
### terraform-inventory
|
|
|
|
> Passes the hosts that Terraform created to Ansible.
|
|
> Parses state file, converts that to Ansible inventory.
|
|
|
|
**On OSX**
|
|
|
|
brew install https://raw.github.com/adammck/terraform-inventory/master/homebrew/terraform-inventory.rb
|
|
|
|
**On Linux**
|
|
|
|
Either compile the Go build, or use https://github.com/Homebrew/linuxbrew and `brew install` as well.
|
|
|
|
### Ansible
|
|
|
|
> A pragmatic, standardized way of provisioning servers with software & configuration.
|
|
|
|
**On OSX**
|
|
|
|
```bash
|
|
sudo -HE easy_install pip
|
|
sudo -HE pip install --upgrade pip
|
|
sudo -HE CFLAGS=-Qunused-arguments CPPFLAGS=-Qunused-arguments pip install --upgrade ansible
|
|
```
|
|
|
|
**On Linux**
|
|
|
|
```bash
|
|
sudo -HE easy_install pip
|
|
sudo -HE pip install --upgrade pip
|
|
sudo -HE pip install --upgrade ansible
|
|
```
|