Skip to content
This repository was archived by the owner on Feb 26, 2024. It is now read-only.

Commit eb1a12c

Browse files
committed
feat: project-specific provider configurations
Setting provider_per_project=true in StackHead module configuration will generate a project-specific provider file instead of the general one.
1 parent 3662a6c commit eb1a12c

File tree

7 files changed

+61
-4
lines changed

7 files changed

+61
-4
lines changed

Documentation/stackhead-modules/development/module-configuration-file.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ Per default StackHead will initialize an empty provider. If you need to setup th
6868
Per default Ansible paths are resolved from playbook directory. Start your path with the variable `{{ role_path }}` to point to your role.
6969
{% endhint %}
7070

71+
You may set `provider_per_project` to true if your provider requires project-specific configurations.
72+
In this case, the provider will be created inside the project's Terraform directory.
73+
Make sure to set the "alias" in the provider configuration and the "provider" in your Terraform resource configurations.
74+
7175
{% code title="stackhead-module.yml" %}
7276
```yaml
7377
---
@@ -78,6 +82,7 @@ terraform:
7882
version: 1.0.1
7983
init: "{{ role_path }}/templates/terraform/provider_init.tf.j2"
8084
resource_name: caddy_server_block
85+
provider_per_project: true
8186
```
8287
{% endcode %}
8388

ansible/plugins/filter/string.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
def endswith(string, suffix):
2+
return string.endswith(suffix)
3+
4+
class FilterModule(object):
5+
"""
6+
Jinja2 filters for string related stuff
7+
"""
8+
9+
def filters(self):
10+
return {"endswith": endswith}

ansible/roles/config_terraform/tasks/remove-project-symlinks.yml

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,23 @@
77
file_type: link
88
use_regex: yes
99
register: project_tf_symlinks
10-
- name: "StackHead::Project || Remove project symlinks | Project: {{ project_name }}"
10+
11+
- set_fact:
12+
project_tf_symlinks_providers: "{{ project_tf_symlinks_providers|d([]) + [item] }}"
13+
when: item.path | getstackhead.stackhead.endswith('.provider.tf')
14+
with_items: "{{ project_tf_symlinks.files }}"
15+
16+
- block:
17+
- name: "Remove project symlinks (non-providers) | Project: {{ project_name }}"
18+
file:
19+
path: "{{ item.path }}"
20+
state: absent
21+
with_items: "{{ project_tf_symlinks | difference(project_tf_symlinks_providers) }}"
22+
- include_tasks: "../roles/config_terraform/tasks/execute.yml"
23+
when: project_tf_symlinks_providers|d([]) | length > 0
24+
25+
- name: "StackHead::Project || Remove all project symlinks | Project: {{ project_name }}"
1126
file:
1227
path: "{{ item.path }}"
1328
state: absent
14-
with_items: "{{ project_tf_symlinks.files }}"
29+
with_items: "{{ project_tf_symlinks.files }}"

ansible/roles/stackhead_module_api/tasks_internal/deployment.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,13 @@
1212
- { name: "{{ stackhead_config.container }}", group: 'container management', optional: false, config: "{{ stackhead_config.deployment[stackhead_config.container]|default([]) }}" }
1313
- { name: '{{ stackhead_config.webserver }}', group: 'webserver', optional: false, config: "{{ stackhead_config.deployment[stackhead_config.webserver]|default([]) }}" }
1414
- "{{ plugin_list|default([]) }}"
15+
16+
# Create Terraform provider file if exists
17+
- include_tasks: "../roles/stackhead_module_api/tasks_internal/terraform/create-perproject-provider.yml"
18+
loop_control:
19+
loop_var: module
20+
when: module != ''
21+
with_items:
22+
- "{{ stackhead_config.container }}"
23+
- "{{ stackhead_config.webserver }}"
24+
- "{{ stackhead_config.plugins }}"
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
---
2+
- name: "Load config for module"
3+
getstackhead.stackhead.module.load_config:
4+
name: "{{ module }}"
5+
register: module_config
6+
7+
- template:
8+
src: "{{ tf_provider.init }}"
9+
dest: "{{ stackhead__tf_root_folder }}/{{ module }}.provider.tf"
10+
when: tf_provider.init is defined and tf_provider.provider_per_project|d(false)
11+
vars:
12+
tf_provider: "{{ module_config.config.terraform.provider|default({}) }}"

ansible/roles/stackhead_module_api/tasks_internal/terraform/module.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,7 @@
33
- set_fact:
44
loaded_config: "{{ ansible_facts[module.name | getstackhead.stackhead.module_vars_name] }}"
55
- set_fact:
6-
loaded_terraform_providers: "{{ loaded_terraform_providers|default([]) + [loaded_config.terraform.provider] }}"
7-
when: loaded_config.terraform is defined and loaded_config.terraform.provider is defined and loaded_config.terraform.provider.name and loaded_config.terraform.provider.vendor is defined and loaded_config.terraform.provider.version is defined
6+
loaded_terraform_providers: "{{ loaded_terraform_providers|default([]) + [tf_provider] }}"
7+
when: tf_provider.name is defined and tf_provider.vendor is defined and tf_provider.version is defined and not tf_provider.provider_per_project|d(false)
8+
vars:
9+
tf_provider: "{{ loaded_config.terraform.provider|default({}) }}"

ansible/schemas/module-config.schema.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@
2828
},
2929
"resource_name": {
3030
"type": "string"
31+
},
32+
"provider_per_project": {
33+
"type": "boolean"
3134
}
3235
}
3336
}

0 commit comments

Comments
 (0)