Use Terrastorm on Terraservices layout for terraform
Project description
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
- modules are standard terraform modules
- layers implement modules - they dont store secrets, just compose object representations that can be used by the environments
- 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
├── 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
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
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
docker run -it --rm \
-v $PWD:/src \
-v /path/to/project:/terraform \
rosscdh/terrastorm:latest sh
>> terrastorm setup /terraform
>> ls /tearraform
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for terrastorm-0.0.4-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b65373e0dd0665b4fdc5f3c963c1b6f33fdfa50cb08bbbba14e1f52e69f67586 |
|
MD5 | 25ba25b7a1ca0c41f46307423f03eff2 |
|
BLAKE2b-256 | 95366269ceab3179e284202cf763fa9c69b8171db1f472081d3648eb680bfcd7 |