Open Dock
Covers Provision and Configuration Operations for complex server clouds:
- PROVISION: Create hosts from all possible cloud providers (i.e.: DigitalOcean, GCloud, Rackspace, Linode ...).
- WIRING: Ship those hosts with Docker containers.
- CONFIGURATION: Build Chef cookbooks and configure/re-configure your servers.
Installation
Add this line to your application's Gemfile:
gem 'open-dock'
And then execute:
$ bundle
Or install it yourself as:
$ gem install open-dock
Initialize project
TODO: ops init
to create folder structure and example files
Structure:
providers
digital_ocean.yml
google_cloud.yml
hosts
example.com.yml
containers
example.com.yml
Configure PROVIDER
ops list
command will list all providers suported by this gem.
TODO: Create more providers (aws, linode, gcloud, ...)
Digital Ocean
Pre-requisites:
- Create DigitalOcean account
- Activate Read/Write token at: DigitalOcean console > Apps & API > Generate new token. Be sure to give write permissions.
For a Digital Ocean provider create a file (ops/providers/digital_ocean.yml) with your account API key:
token: a206ae60dda6bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcf0cbf41
Google Cloud
Pre-requisites:
- Create GoogleCloud account
- Create a Project at the console
- Create a service account in the project console:
- Here the instructions
- Download the .p12 file (for the ‘google_key_location’ parameter) and annotate ‘google_client_email’
- Create a firewall rule to connect properly the servers (i.e. Allow tcp:1-65535): Project console > Compute > Compute Engine > Networks > default> Firewall rules > Create New
To configure Google Cloud provider create a file (ops/providers/digital_ocean.yml) with these params:
google_client_email: "850xxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxtauvbl@developer.gserviceaccount.com"
google_project: "project_name"
google_key_location: "path_to_your_p12_file"
You can see how to create at https://developers.google.com/accounts/docs/OAuth2ServiceAccount#creatinganaccount
Configure HOST
With these files you can configure your instances/servers/droplets/ships on every provider you have configured in the last point.
Helpful commands:
ops list digital_ocean
list all possible parameter values to use in the yml fileops create example.com
will create your host
Digital Ocean Host
For a Digital Ocean host we can make the following file (ops/hosts/example.com.yml):
provider: digital_ocean
user: core # User to connect the host
# Values to configure DigitalOcean machine
size: 1gb
region: ams3
image: coreos-stable
ssh_keys:
- e7:51:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:88:57
Google Cloud Host
For a Google Cloud host we can make the following file (ops/hosts/example.com.yml):
provider: google_cloud
user: core # User to connect the host
# Values to configure GoogleCloud machine
machine_type: g1-small
zone_name: europe-west1-b
public_key_path: ~/.ssh/id_rsa.pub
source_image: coreos-stable-444-5-0-v20141016
disk_size_gb: 10
Configure hosted CONTAINERS (Docker)
In this file we can configure all containers to run in the host provided in the name:
www:
image: jlebrijo/prun
ports:
- '2222:22'
- '80:80'
# command: /bin/bash
# OPTIONS: use the long name of the options, 'detach' instead of '-d'
detach: true
# interactive: true
# memory: 8g
# cpuset: 0-7
# POST-CONDITIONS: execute after build the container:
post-conditions:
- sshpass -p 'J3mw?$_6' ssh-copy-id -o 'StrictHostKeyChecking no' -i ~/.ssh/id_rsa.pub [email protected] -p 2222
- ssh [email protected] -p 2222 "echo 'root:K8rt$_?1' | chpasswd"
# here you can create other containers
# db:
# image: ubuntu/postgresql
ops ship example.com
will create all containers configured on 'containers/example.com.yml' file
TODO: Configure Containers (are nodes, with Chef)
Configuration with chef commands
ops configure CONTAINER_NAME HOST_NAME
: configure with chef a container in host. Here you need to install knife-solo gem.- knife solo cook [container_user]@[HOST_NAME] -p [container_ssh_port]
Commands
Create/delete domain names, create/delete hosts and ship/unship hosts:
- TODO:
ops init
initialize needed folders and example files ops create HOST_NAME
create the host defined by the name of the file in the 'ops/hosts' folder.ops delete HOST_NAME
- TODO:
ops recreate HOST_NAME
delete/create the host. ops exec HOST_NAME "COMMAND"
execute any command on a host remotely (i.e. ops exec example.com 'docker ps -a')ops ship HOST_NAME
run the containers in the host.ops unship HOST_NAME
- TODO:
ops reship HOST_NAME
unship/ship all containers from host. - TODO:
ops configure CONTAINER_NAME HOST_NAME
configure container with chef.
Create your infrastructure project (/ops)
OPS command is focused to cover first Provision configurations for a the Operations of your infrastructure.
You can create an infrastructure project (like me /ops)
mkdir ops && cd ops
rbenv local 2.1.2
git init
Create a Gemfile:
source 'https://rubygems.org'
gem 'open-dock'
# OPTIONAL: Add next gems if you want to integrate with Chef as Configuration management tecnology
gem 'knife-solo'
gem 'librarian-chef'
gem 'foodcritic'
And: bundle install
To avoid bundle exec
repfix: bundle install --binstubs .bundle/bin
Or integrate it within your Chef infrastructure project. Just add the gem to your Gemfile.
Contributing
- Fork it ( https://github.com/[my-github-username]/open-dock/fork )
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create a new Pull Request
License
MIT License. Made by Lebrijo.com
Release notes
v0.0.10
- First publication: split 'open-dock' gem from 'prun-ops' gem
v0.0.11
- Remove create/delete domain commands
- Remove "host" word from all commands
- Remove /ops folder from providers, hosts and containers subfolders
v0.0.13
- Added Google Cloud as provider
- Now providers files are called underscored: digital_ocean, google_cloud ....
- In hosts YAML files we should include which provider will be built (i.e. provider: digital_ocean)