terrastorm 0.0.4
Use Terrastorm on Terraservices layout for terraform
License: MIT License

Terrastorm
----------

A simple cli to help you work with using terraservice layouts for terraform

Terraservice?

* https://www.youtube.com/watch?v=wgzgVm7Sqlk
* https://www.slideshare.net/opencredo/hashidays-london-2017-evolving-your-infrastructure-with-terraform-by-nicki-watt
* https://www.hibri.net/2017/11/13/terraform-for-grownups/

*NB* Whats important to note is that we have added a `layers` abstraction. This abstraction allows you to compose infra objects that can then be used by your environments, instead of referencing modules directly.

**Example layout**

1. *modules* are standard terraform modules
2. *layers* implement *modules* - they dont store secrets, just compose object representations that can be used by the environments
3. *environments* implement any number of *layers* - here you configure secrets and variables for the individual environments


### Environment - Services

`Environments` allow us to implement `services` which are `instances` of `layers` with `environment specific configuration`

* can take secrets
* compose layers
* maintain the remote encrypted s3 state

### Layers

`Layers` allow us to combine a number of `modules` 

* no secrets
* compose modules

### Modules

`Modules` act as normal terraform modules and provide access to the standard concept.

* stnadrad terraform modules


*But now you have to go to the `production` environment and run `terraform plan` and `terraform apply` for each of your `services` this gets repetative*

``` bash
├── environments
│   ├── dev
│   │   ├── iam
│   │   │   ├── README.md
│   │   │   ├── main.tf
│   │   │   ├── secrets.auto.tfvars
│   │   │   └── terraform.tfvars
│   │   └── network
│   │       ├── README.md
│   │       ├── main.tf
│   │       ├── secrets.auto.tfvars
│   │       └── terraform.tfvars
│   └── prod
│       ├── iam
│       │   ├── README.md
│       │   ├── main.tf
│       │   ├── secrets.auto.tfvars
│       │   └── terraform.tfvars
│       └── network
│           ├── README.md
│           ├── main.tf
│           ├── secrets.auto.tfvars
│           └── terraform.tfvars
├── layers
│   ├── iam
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   └── network
│       ├── README.md
│       ├── main.tf
│       ├── outputs.tf
│       └── variables.tf
└── modules
    ├── subnets
    │   ├── README.md
    │   ├── main.tf
    │   ├── outputs.tf
    │   └── variables.tf
    └── vpc
        ├── README.md
        ├── main.tf
        ├── outputs.tf
        └── variables.tf
```

## Usage

Modify the makefile so your aws and ti-landscape are mounted to the right places

```sh
1. make shell
2. `terrastorm run nonprod init` <-- will init on all the services in nonprod
```

### Story 1 - Setup a new Project

As an infra-op
I need to create a new project based on the terraservices pattern
So that I can inject **sparkles** into the lives of our clients

`terrastorm setup /path/to/project`

* will create a new project based on the template defined in the `.terrastorm.yaml` templates.project=https://github.com/williamtsoi1/terraservices-example.git


### Story 2 - See my settings

As an infra-op
I want to see my current config settings
So that I can check all is well

`terrastorm show_config`

* will output the current config settings loaded from `~/.terrastorm.yaml` and the default `.terrastorm.yaml`


### Story 3 - Create a new Terraform Module

As an infra-op
I need to create a new segment of infrastructure
So that I can inject **sparkles** into the lives of our clients

`terrastorm create module :new_module_name`

* will create a new "module" with the appropriate `:name.tf`, `input.tf`, `output.tf` files


### Story 4 - Create a new Layer

As an infra-op
I need to create a new `layer` of infrastructure
So that I can compose an infrastructure represenation for use in my environments.

`terrastorm create layer :new_module_name`

* will create a new "module" with the appropriate `:name.tf`, `input.tf`, `output.tf` files


### Story 5 - Create a new Environment

As an infra-op
I need to create a new environment, optionally excluding or including certain modules
So that I can inject goodness into the lives of our clients

`terrastorm create environment :new_environment_name`

* will create a new environment


### Story 6 - Add a new service to an Environment

As an infra-op
I need to be able to add a module interface to an environment
So that I can **make magic happe**

`terrastorm add service :environment :new_service_name`

* will create a new service instance in the environment specified


### Story 7 - Run a terraform command in an environment service

As an infra-op
I need to run terraform commands on the appropriate environment
So that I can **make magic happe**

`terrastorm run :environment :cmd :service_name|all`

* environment - staging|production|...
* cmd - fmt|init|plan|apply
* service None|all|:name_of_your_service


### Story 8 - Exec and shell command in an environment

As an infra-op
I need to run shell commands in the appropriate environment
So that I can **make magic happe**

`terrastorm cmd :environment ':cmd'`

* environment - staging|production|...
* cmd - `ls -alh`|`tree . -L 3`
* service None|all|:name_of_your_service
cmd dev 'ls -alh'

## Development

``` bash
docker build -t terrastorm:latest .
docker run -it --rm \
       -v $PWD:/src \
       -v /Users/ross/p/ross.crawford/ti-landscape:/terraform \
       terrastorm:latest sh

docker run -it --rm \
       -v $PWD:/src \
       terrastorm:latest sh
```

## Using

``` bash
docker run -it --rm \
       -v $PWD:/src \
       -v /path/to/project:/terraform \
       rosscdh/terrastorm:latest sh

>> terrastorm setup /terraform
>> ls /tearraform
```