diff --git a/changelogs/fragments/4281-terraform-complex-variables.yml b/changelogs/fragments/4281-terraform-complex-variables.yml
new file mode 100644
index 0000000000..92538791f0
--- /dev/null
+++ b/changelogs/fragments/4281-terraform-complex-variables.yml
@@ -0,0 +1,2 @@
+bugfixes:
+  - terraform - fix ``variable`` handling to allow complex values (https://github.com/ansible-collections/community.general/pull/4281).
\ No newline at end of file
diff --git a/plugins/modules/cloud/misc/terraform.py b/plugins/modules/cloud/misc/terraform.py
index 8eca14e712..310dd77c8e 100644
--- a/plugins/modules/cloud/misc/terraform.py
+++ b/plugins/modules/cloud/misc/terraform.py
@@ -443,7 +443,7 @@ def main():
     for k, v in variables.items():
         variables_args.extend([
             '-var',
-            '{0}={1}'.format(k, v)
+            '{0}={1}'.format(k, json.dumps(v))
         ])
     if variables_files:
         for f in variables_files: