Skip to content

Commit 529c79d

Browse files
cyrilgdngreut
andauthored
vault: Allow to provide extra statement for roles creation. (#8)
* vault: Allow to provide extra statement for roles creation. * Update vault.tf Co-authored-by: Yoan Blanc <yblanc@edgelab.ch> * fixup! docs: add license (#7) * fixup! fixup! docs: add license (#7) * Apply suggestions from code review Co-authored-by: Yoan Blanc <yblanc@edgelab.ch>
1 parent 99b7db8 commit 529c79d

File tree

4 files changed

+41
-11
lines changed

4 files changed

+41
-11
lines changed

README.md

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ In particular:
1717

1818
```hcl
1919
module "my_database" {
20-
source = "git@github.com:edgelaboratories/terraform-mysql-db?ref=v0.1.2"
20+
source = "git@github.com:edgelaboratories/terraform-mysql-db?ref=v0.2.0"
2121
2222
database = "my-database"
2323
@@ -37,3 +37,22 @@ module "my_database" {
3737
vault_role_default_ttl = 3600
3838
}
3939
```
40+
41+
You can provide extra permissions for `all-privileges` or `read-only` roles with `vault_roles_extra_statements`:
42+
43+
```hcl
44+
module "my_database" {
45+
source = "git@github.com:edgelaboratories/terraform-mysql-db?ref=v0.2.0"
46+
47+
database = "my-database"
48+
49+
# Optional
50+
vault_backend_path = "mysql/my-cluster"
51+
vault_db_connection_name = "my-cluster"
52+
vault_role_default_ttl = 3600
53+
54+
vault_roles_extra_statements = {
55+
all-privileges = ["GRANT XA_RECOVER_ADMIN ON *.* TO '{{name}}'@'%';"]
56+
}
57+
}
58+
```

provider.tf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
terraform {
2+
experiments = [module_variable_optional_attrs]
3+
24
required_providers {
35
mysql = {
46
source = "winebarrel/mysql"

variables.tf

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,10 @@ variable "vault_db_connection_name" {
3535
variable "vault_role_default_ttl" {
3636
default = 3600
3737
}
38+
39+
variable "vault_roles_extra_statements" {
40+
type = object({
41+
all-privileges = optional(list(string)),
42+
read-only = optional(list(string)),
43+
})
44+
}

vault.tf

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
11
locals {
22
roles = var.vault_backend_path == null ? {} : {
3-
"${var.database}-all-privileges" = "ALL PRIVILEGES"
4-
"${var.database}-read-only" = "SELECT"
3+
"all-privileges" = "ALL PRIVILEGES"
4+
"read-only" = "SELECT"
55
}
66
}
77

88
resource "vault_database_secret_backend_role" "this" {
99
for_each = local.roles
1010

11-
name = each.key
11+
name = "${var.database}-${each.key}"
1212
backend = var.vault_backend_path
1313
db_name = var.vault_db_connection_name
1414

15-
creation_statements = [
16-
"CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}';",
17-
"GRANT ${each.value} ON ${var.database}.* TO '{{name}}'@'%';",
18-
]
15+
creation_statements = concat(
16+
[
17+
"CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}';",
18+
"GRANT ${each.value} ON ${var.database}.* TO '{{name}}'@'%';",
19+
], coalesce(var.vault_roles_extra_statements[each.key], []),
20+
)
1921

2022
default_ttl = var.vault_role_default_ttl
2123
}
@@ -24,19 +26,19 @@ data "vault_policy_document" "this" {
2426
for_each = local.roles
2527

2628
rule {
27-
path = "${var.vault_backend_path}/creds/${each.key}"
29+
path = "${var.vault_backend_path}/creds/${var.database}-${each.key}"
2830
capabilities = ["read"]
2931
}
3032

3133
rule {
32-
path = "${var.vault_backend_path}/roles/${each.key}"
34+
path = "${var.vault_backend_path}/roles/${var.database}-${each.key}"
3335
capabilities = ["read"]
3436
}
3537
}
3638

3739
resource "vault_policy" "this" {
3840
for_each = local.roles
3941

40-
name = "${var.vault_backend_path}/${each.key}"
42+
name = "${var.vault_backend_path}/${var.database}-${each.key}"
4143
policy = data.vault_policy_document.this[each.key].hcl
4244
}

0 commit comments

Comments
 (0)