# Grid provider for terraform - A resource, and a data source (`internal/provider/`), - Examples (`examples/`) ## Requirements - [Terraform](https://www.terraform.io/downloads.html) >= 0.13.x - [Go](https://golang.org/doc/install) >= 1.15 ## Building The Provider Note: please clone all of the following repos in the same directory - clone github.com/threefoldtech/zos (switch to master-3 branch) - Clone github.com/threefoldtech/tf_terraform_provider (deployment_resource branch) - Enter the repository directory ```bash go get mkdir -p ~/.terraform.d/plugins/threefoldtech.com/providers/grid/0.1/linux_amd64 go build -o terraform-provider-grid mv terraform-provider-grid ~/.terraform.d/plugins/threefoldtech.com/providers/grid/0.1/linux_amd64 ``` ## example deployment ``` terraform { required_providers { grid = { source = "threefoldtech/grid" } } } provider "grid" {} resource "grid_deployment" "d1" { node = 2 disks { name = "mydisk1" size = 2 description = "this is my disk description1" } disks { name = "mydisk2" size=2 description = "this is my disk2" } vms { name = "vm1" flist = "https://hub.grid.tf/tf-official-apps/base:latest.flist" cpu = 1 memory = 2048 entrypoint = "/sbin/zinit init" mounts { disk_name = "mydisk1" mount_point = "/opt" } mounts { disk_name = "mydisk2" mount_point = "/test" } env_vars = { SSH_KEY = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDTwULSsUubOq3VPWL6cdrDvexDmjfznGydFPyaNcn7gAL9lRxwFbCDPMj7MbhNSpxxHV2+/iJPQOTVJu4oc1N7bPP3gBCnF51rPrhTpGCt5pBbTzeyNweanhedkKDsCO2mIEh/92Od5Hg512dX4j7Zw6ipRWYSaepapfyoRnNSriW/s3DH/uewezVtL5EuypMdfNngV/u2KZYWoeiwhrY/yEUykQVUwDysW/xUJNP5o+KSTAvNSJatr3FbuCFuCjBSvageOLHePTeUwu6qjqe+Xs4piF1ByO/6cOJ8bt5Vcx0bAtI8/MPApplUU/JWevsPNApvnA/ntffI+u8DCwgP" } } } ``` ## Using the provider to create your twin please check [grid substrate getting started](grid_substrate_getting_started) ```bash ./msgbusd --twin #run message bus with your twin id cd examples/resources export MNEMONICS="" terraform init && terraform apply ``` ## Destroying deployment ```bash terraform destroy ``` ## More examples a two machine deployment with the first using a public ip ``` terraform { required_providers { grid = { source = "threefoldtech/grid" } } } provider "grid" { } resource "grid_network" "net1" { nodes = [2] ip_range = "10.1.0.0/16" name = "network" description = "newer network" add_wg_access = true } resource "grid_deployment" "d1" { node = 2 network_name = grid_network.net1.name ip_range = grid_network.net1.nodes_ip_range["2"] vms { name = "vm1" flist = "https://hub.grid.tf/tf-official-apps/base:latest.flist" cpu = 1 publicip = true memory = 1024 entrypoint = "/sbin/zinit init" env_vars = { SSH_KEY = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCtCuUUCZGLZ4NoihAiUK8K0kSoTR1WgIaLQKqMdQ/99eocMLqJgQMRIp8lueFG7SpcgXVRzln8KNKZX1Hm8lcrXICr3dnTW/0bpEnF4QOGLYZ/qTLF5WmoCgKyJ6WO96GjWJBsZPads+RD0WeiijV7jj29lALsMAI8CuOH0pcYUwWsRX/I1z2goMPNRY+PBjknMYFXEqizfUXqUnpzF3w/bKe8f3gcrmOm/Dxh1nHceJDW52TJL/sPcl6oWnHZ3fY4meTiAS5NZglyBF5oKD463GJnMt/rQ1gDNl8E4jSJUArN7GBJntTYxFoFo6zxB1OsSPr/7zLfPG420+9saBu9yN1O9DlSwn1ZX+Jg0k7VFbUpKObaCKRmkKfLiXJdxkKFH/+qBoCCnM5hfYxAKAyQ3YCCP/j9wJMBkbvE1QJMuuoeptNIvSQW6WgwBfKIK0shsmhK2TDdk0AHEnzxPSkVGV92jygSLeZ4ur/MZqWDx/b+gACj65M3Y7tzSpsR76M= omar@omar-Predator-PT315-52" } } vms { name = "anothervm" flist = "https://hub.grid.tf/tf-official-apps/base:latest.flist" cpu = 1 memory = 1024 entrypoint = "/sbin/zinit init" env_vars = { SSH_KEY = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCtCuUUCZGLZ4NoihAiUK8K0kSoTR1WgIaLQKqMdQ/99eocMLqJgQMRIp8lueFG7SpcgXVRzln8KNKZX1Hm8lcrXICr3dnTW/0bpEnF4QOGLYZ/qTLF5WmoCgKyJ6WO96GjWJBsZPads+RD0WeiijV7jj29lALsMAI8CuOH0pcYUwWsRX/I1z2goMPNRY+PBjknMYFXEqizfUXqUnpzF3w/bKe8f3gcrmOm/Dxh1nHceJDW52TJL/sPcl6oWnHZ3fY4meTiAS5NZglyBF5oKD463GJnMt/rQ1gDNl8E4jSJUArN7GBJntTYxFoFo6zxB1OsSPr/7zLfPG420+9saBu9yN1O9DlSwn1ZX+Jg0k7VFbUpKObaCKRmkKfLiXJdxkKFH/+qBoCCnM5hfYxAKAyQ3YCCP/j9wJMBkbvE1QJMuuoeptNIvSQW6WgwBfKIK0shsmhK2TDdk0AHEnzxPSkVGV92jygSLeZ4ur/MZqWDx/b+gACj65M3Y7tzSpsR76M= omar@omar-Predator-PT315-52" } } } output "wg_config" { value = grid_network.net1.access_wg_config } output "node1_vm1_ip" { value = grid_deployment.d1.vms[0].ip } output "node1_vm2_ip" { value = grid_deployment.d1.vms[1].ip } output "public_ip" { value = grid_deployment.d1.vms[0].computedip } ``` multinode deployments ``` terraform { required_providers { grid = { source = "threefoldtech/grid" } } } provider "grid" { } resource "grid_network" "net1" { nodes = [4, 2] ip_range = "172.20.0.0/16" name = "net1" description = "new network" } resource "grid_deployment" "d1" { node = 4 network_name = grid_network.net1.name ip_range = grid_network.net1.deployment_info[0].ip_range vms { name = "vm1" flist = "https://hub.grid.tf/tf-official-apps/base:latest.flist" cpu = 1 memory = 1024 entrypoint = "/sbin/zinit init" env_vars = { SSH_KEY = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCtCuUUCZGLZ4NoihAiUK8K0kSoTR1WgIaLQKqMdQ/99eocMLqJgQMRIp8lueFG7SpcgXVRzln8KNKZX1Hm8lcrXICr3dnTW/0bpEnF4QOGLYZ/qTLF5WmoCgKyJ6WO96GjWJBsZPads+RD0WeiijV7jj29lALsMAI8CuOH0pcYUwWsRX/I1z2goMPNRY+PBjknMYFXEqizfUXqUnpzF3w/bKe8f3gcrmOm/Dxh1nHceJDW52TJL/sPcl6oWnHZ3fY4meTiAS5NZglyBF5oKD463GJnMt/rQ1gDNl8E4jSJUArN7GBJntTYxFoFo6zxB1OsSPr/7zLfPG420+9saBu9yN1O9DlSwn1ZX+Jg0k7VFbUpKObaCKRmkKfLiXJdxkKFH/+qBoCCnM5hfYxAKAyQ3YCCP/j9wJMBkbvE1QJMuuoeptNIvSQW6WgwBfKIK0shsmhK2TDdk0AHEnzxPSkVGV92jygSLeZ4ur/MZqWDx/b+gACj65M3Y7tzSpsR76M= omar@omar-Predator-PT315-52" } } } resource "grid_deployment" "d2" { node = 2 network_name = grid_network.net1.name ip_range = grid_network.net1.nodes_ip_range["2"] vms { name = "vm3" flist = "https://hub.grid.tf/tf-official-apps/base:latest.flist" cpu = 1 memory = 1024 entrypoint = "/sbin/zinit init" env_vars = { SSH_KEY = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCtCuUUCZGLZ4NoihAiUK8K0kSoTR1WgIaLQKqMdQ/99eocMLqJgQMRIp8lueFG7SpcgXVRzln8KNKZX1Hm8lcrXICr3dnTW/0bpEnF4QOGLYZ/qTLF5WmoCgKyJ6WO96GjWJBsZPads+RD0WeiijV7jj29lALsMAI8CuOH0pcYUwWsRX/I1z2goMPNRY+PBjknMYFXEqizfUXqUnpzF3w/bKe8f3gcrmOm/Dxh1nHceJDW52TJL/sPcl6oWnHZ3fY4meTiAS5NZglyBF5oKD463GJnMt/rQ1gDNl8E4jSJUArN7GBJntTYxFoFo6zxB1OsSPr/7zLfPG420+9saBu9yN1O9DlSwn1ZX+Jg0k7VFbUpKObaCKRmkKfLiXJdxkKFH/+qBoCCnM5hfYxAKAyQ3YCCP/j9wJMBkbvE1QJMuuoeptNIvSQW6WgwBfKIK0shsmhK2TDdk0AHEnzxPSkVGV92jygSLeZ4ur/MZqWDx/b+gACj65M3Y7tzSpsR76M= omar@omar-Predator-PT315-52" } } } output "wg_config" { value = grid_network.net1.access_wg_config } output "node1_vm1_ip" { value = grid_deployment.d1.vms[0].ip } output "node2_vm1_ip" { value = grid_deployment.d2.vms[0].ip } ``` zds ``` terraform { required_providers { grid = { source = "threefoldtech/grid" } } } provider "grid" { } resource "grid_deployment" "d1" { node = 2 zdbs{ name = "zdb1" size = 1 description = "zdb1 description" password = "zdbpasswd1" mode = "user" } zdbs{ name = "zdb2"You can easily check using [explorer-ui](@explorer_home) , size = 2 description = "zdb2 description" password = "zdbpasswd2" mode = "seq" } } output "deployment_id" { value = grid_deployment.d1.id } ```