https://github.com/mewa/terrascript
Terrascript is wrapper around Terraform which adds the ability to script repetitive tasks as inline ruby code.
https://github.com/mewa/terrascript
inline-ruby ruby terraform terraform-scripts
Last synced: 4 months ago
JSON representation
Terrascript is wrapper around Terraform which adds the ability to script repetitive tasks as inline ruby code.
- Host: GitHub
- URL: https://github.com/mewa/terrascript
- Owner: mewa
- Created: 2018-04-05T15:02:25.000Z (about 8 years ago)
- Default Branch: master
- Last Pushed: 2018-11-14T16:22:56.000Z (over 7 years ago)
- Last Synced: 2025-12-27T19:56:54.226Z (6 months ago)
- Topics: inline-ruby, ruby, terraform, terraform-scripts
- Language: Ruby
- Homepage:
- Size: 11.7 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
[](https://travis-ci.org/mewa/terrascript) [](https://badge.fury.io/rb/terrascript)
# What is Terrascript
Terrascript is wrapper around Terraform which adds the ability to script repetitive tasks as inline ruby code.
Terrascript parses `.tfrb` files, executes ruby code and outputs `.tf` files.
Simply invoke `tfsc` with your usual Terraform arguments and enjoy the automation.
# Usage
The overall structure is as shown below:
```ruby
@inline
# ruby code
return
# plain text
@end
```
`@inline` directive marks the beginning of inline ruby code.
Code is evaluated until a `return` statement is found.
Text between `return` and `@end` statements is passed as an argument to the code.
By default it's accessible inside the inline code under `block` variable, but you can override the name by specifying your own name in `@inline` directive.
For example `@inline arg` declaration will pass text in `arg` variable.
Anything the inline ruby code prints (`puts`) is written to the destination `.tf` file.
# Examples
```hcl
@inline
["one", "two"].each do |fn|
puts block.gsub("", fn)
end
return
# alias
module "_alias" {
source = "mewa/lambda-alias/aws"
version = "1.0.0"
alias = "${local.environment}"
function_arn = "${aws_lambda_function..arn}"
function_name = "${aws_lambda_function..function_name}"
function_version = "${aws_lambda_function..version}"
invoke_arn = "${aws_lambda_function..invoke_arn}"
}
# permission
resource "aws_lambda_permission" "_lambda_permission" {
statement_id = "AllowAPIGatewayInvoke"
principal = "apigateway.amazonaws.com"
action = "lambda:InvokeFunction"
function_name = "${aws_lambda_function..function_name}"
qualifier = "${module._alias.alias}"
source_arn = "${aws_api_gateway_deployment.stage.execution_arn}/*/*"
}
@end
```
Will be rendered as
```hcl
# one alias
module "one_alias" {
source = "mewa/lambda-alias/aws"
version = "1.0.0"
alias = "${local.environment}"
function_arn = "${aws_lambda_function.one.arn}"
function_name = "${aws_lambda_function.one.function_name}"
function_version = "${aws_lambda_function.one.version}"
invoke_arn = "${aws_lambda_function.one.invoke_arn}"
}
# one permission
resource "aws_lambda_permission" "one_lambda_permission" {
statement_id = "AllowAPIGatewayInvoke"
principal = "apigateway.amazonaws.com"
action = "lambda:InvokeFunction"
function_name = "${aws_lambda_function.one.function_name}"
qualifier = "${module.one_alias.alias}"
source_arn = "${aws_api_gateway_deployment.stage.execution_arn}/*/*"
}
# two alias
module "two_alias" {
source = "mewa/lambda-alias/aws"
version = "1.0.0"
alias = "${local.environment}"
function_arn = "${aws_lambda_function.two.arn}"
function_name = "${aws_lambda_function.two.function_name}"
function_version = "${aws_lambda_function.two.version}"
invoke_arn = "${aws_lambda_function.two.invoke_arn}"
}
# two permission
resource "aws_lambda_permission" "two_lambda_permission" {
statement_id = "AllowAPIGatewayInvoke"
principal = "apigateway.amazonaws.com"
action = "lambda:InvokeFunction"
function_name = "${aws_lambda_function.two.function_name}"
qualifier = "${module.two_alias.alias}"
source_arn = "${aws_api_gateway_deployment.stage.execution_arn}/*/*"
}
```
# Future improvements
This project was written for my internal needs and serves its purpose.
However if it gains traction I could look into implementing a cleaner solution
that abstracts the code for some common tasks and leaves open door for extension (plugins, probably).
The code presented here as an example could then look like this:
```hcl
@replace "" with ["one", "two"]
# alias
module "_alias" {
some_attribute = "${some_resource..something}"
}
@end
```