Skip to main content

Primary links

  • Home
  • AI
  • Kubernetes
  • Incus
  • Ansible
  • Terraform
  • OpenStack
  • Virtualization
  • Linux
  • SmartHome
  • HowTo

Misc

  • Linux
  • Hardware
  • Programming
  • Databases
  • Multimedia
  • Windows

Cloud

  • OpenStack
  • cloud-config
  • nextcloud

Virtualization

  • Virtualization
  • Incus
  • Docker
  • KVM
  • Kubernetes
  • LXC
  • LXD
  • QEMU
  • VMware
  • VirtualBox
  • multipass
  • podman
  • vagrant
  • XEN

Network

  • DNS
  • Firewall
  • Linux
  • OpenvSwitch
  • SSL
  • VLAN
  • VPN
  • iPXE
  • namespaces
  • nmcli
  • tcpdump

Storage

  • CEPH
  • DRBD
  • LVM
  • S3
  • ZFS
  • btrfs

Automation / CI/CD

  • Install
  • Ansible
  • GitLab
  • LLM
  • Preseed
  • Puppet
  • Terraform
    • Incus Terraform
    • OpenStack
    • Run Ansible from Terraform
    • snippets
  • Ubuntu autoinstall

Monitoring / Visualisation

  • Grafana
  • Icinga
  • Prometheus
  • Monitoring
  • ELK
  • mermaid
  • provisioning
  • linux

Install
https://www.terraform.io/downloads.html

# sudo apt install -y jq

URL=$(wget https://checkpoint-api.hashicorp.com/v1/check/terraform -qO- | jq  -r '.current_download_url + "/" + .product + "_" + .current_version + "_linux_amd64.zip"')
wget ${URL} -qP /tmp
unzip -d /tmp /tmp/${URL##*/}
mv /tmp/terraform ~/.local/bin/

# or deploy global
# sudo mv /tmp/terraform /usr/local/bin/

terraform  version

Debug
https://www.terraform.io/internals/debugging

# enable
export TF_LOG=DEBUG
# disable
export TF_LOG=ERROR

TF_LOG=debug OS_DEBUG=1 terraform apply

CLI

# deploy
terraform init
terraform plan
terraform apply -auto-approve

# format the Terraform files
terraform fmt

# list workspaces
terraform workspace list

# destroy
terraform destroy -auto-approve

Install with Ansible
[embed_url: https://raw.githubusercontent.com/panticz/ansible/master/roles/terraform/tasks/main.yml]

# ~/.profile
...
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi


cat < /tmp/install-terraform.yml 
#!/usr/bin/env ansible-playbook

---
- hosts: localhost
  vars:
    debug: false
  tasks:
    - name: Get latest terraform version
      uri:
        url: https://checkpoint-api.hashicorp.com/v1/check/terraform
        method: GET
      register: uri_result

    - debug:
        msg: "{{ uri_result.json | to_nice_json }}"
      when: debug

    - set_fact:
        terraform_current_download_url: "{{ uri_result.json.current_download_url }}"
        terraform_current_version: "{{ uri_result.json.current_version }}"

    - name: Create "{{ lookup('env','HOME') }}/.local/bin" directory
      file:
        path: "{{ lookup('env','HOME') }}/.local/bin"
        state: directory

    - name: Install Terraform {{ terraform_current_version }} to ~/.local/bin/terraform
      unarchive:
        src: "{{ terraform_current_download_url }}/terraform_{{ terraform_current_version }}_{{ ansible_system | lower }}_amd64.zip"
        remote_src: yes
        dest: "{{ lookup('env','HOME') }}/.local/bin"
        mode: 0755
EOF
chmod +x /tmp/install-terraform.yml
/tmp/install-terraform.yml

Providers
https://www.terraform.io/docs/providers/index.html

ansible-playbook /tmp/install-terraform.yml

https://github.com/panticz/ansible/tree/master/roles/terraform
- hosts: localhost
  roles:
    - role: terraform
      tags: terraform

OpenStack module
https://registry.terraform.io/providers/terraform-provider-openstack/openstack/latest/docs

Output

output "fqdn" {
  value = "${var.environment}-${var.name}.${var.domain}"
}

output "vpc" {
  value = {
    vpc_id         = "${module.my_vpc.vpc_id}"
    public_subnet  = "${module.my_vpc.public_subnets_ids}"
    private_subnet = "${module.my_vpc.private_subnets_ids}"
  }  
}

OpenStack security groups
https://registry.terraform.io/providers/terraform-provider-openstack/openstack/latest/docs/resources/compute_secgroup_v2

rule {
    from_port   = 1
    to_port     = 65535
    ip_protocol = "tcp"
    self        = true
}

rule {
    from_port   = -1
    to_port     = -1
    ip_protocol = "icmp"
    cidr        = "0.0.0.0/0"
}

for_each
https://stackoverflow.com/questions/58343258/iterate-over-nested-data-with-for-for-each-at-resource-level

provider "openstack" {
  user_name     = var.os_user_name
  tenant_name   = var.os_tenant_name
  password      = var.os_password
  auth_url      = var.os_auth_url
  region        = var.os_region
  endpoint_type = var.os_endpoint_type
  use_octavia   = true
}

Terraform state
https://spacelift.io/blog/terraform-state

functions
https://www.terraform.io/docs/language/functions/toset.html

Zero Downtime Updates with Terraform
https://www.hashicorp.com/blog/zero-downtime-updates-with-terraform

cloud-config in Terraform
https://registry.terraform.io/providers/hashicorp/template/latest/docs/data-sources/cloudinit_config

Terraform/
https://www.terraform.io/
https://www.youtube.com/watch?v=TFLQcgZr0no#t=1318.264795
https://releases.hashicorp.com/index.json
https://releases.hashicorp.com/
https://github.com/diodonfrost/terraform-openstack-examples
https://blog.gruntwork.io/terraform-tips-tricks-loops-if-statements-and-gotchas-f739bbae55f9#1254
https://www.daveperrett.com/articles/2021/08/19/nested-for-each-with-terraform/
https://library.tf/providers/terraform-provider-openstack/openstack/latest/docs/guides/upgrade-guide-version-3
https://blog.gruntwork.io/how-to-create-reusable-infrastructure-with-terraform-modules-25526d65f73d

Profiles GitHub StackOverflow LinkedIn Xing
Contact Imprint
© panticz 2026

Cookie-Einstellungen

Diese Website nutzt eingebettete Inhalte von Drittanbietern (z.B. YouTube, SoundCloud). Beim Laden dieser Inhalte werden Daten an die jeweiligen Anbieter übermittelt. Datenverarbeitungserklärung