updated terraform examples
This commit is contained in:
parent
48fc259af9
commit
d82c5b6447
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
clouds.yaml
|
||||||
|
**/clouds.yaml
|
@ -1,3 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
wget https://releases.hashicorp.com/terraform/0.14.10/terraform_0.14.10_linux_amd64.zip -O terraform_0.14.10_linux_amd64.zip
|
|
||||||
unzip -o terraform_0.14.10_linux_amd64.zip
|
|
3
terraform/lab1/get-terraform.sh
Normal file
3
terraform/lab1/get-terraform.sh
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
wget https://releases.hashicorp.com/terraform/1.1.3/terraform_1.1.3_linux_amd64.zip -O terraform_1.1.3_linux_amd64.zip
|
||||||
|
unzip -o terraform_1.1.3_linux_amd64.zip
|
178
terraform/lab1/lab1.tf
Normal file
178
terraform/lab1/lab1.tf
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
# Define CloudComp group number
|
||||||
|
variable "group_number" {
|
||||||
|
type = string
|
||||||
|
default = "20"
|
||||||
|
}
|
||||||
|
|
||||||
|
## OpenStack credentials can be used in a more secure way by using
|
||||||
|
## cloud.yaml from https://private-cloud.informatik.hs-fulda.de/project/api_access/clouds.yaml/
|
||||||
|
|
||||||
|
# or by using env vars exported from openrc here,
|
||||||
|
# e.g., using 'export TF_VAR_os_password=$OS_PASSWORD'
|
||||||
|
|
||||||
|
# Define OpenStack credentials, project config etc.
|
||||||
|
locals {
|
||||||
|
auth_url = "https://private-cloud.informatik.hs-fulda.de:5000/v3"
|
||||||
|
user_name = "CloudComp${var.group_number}"
|
||||||
|
user_password = "<password of your group here, private-cloud is only reachable via vpn>"
|
||||||
|
tenant_name = "CloudComp${var.group_number}"
|
||||||
|
#network_name = "CloudComp${var.group_number}-net"
|
||||||
|
router_name = "CloudComp${var.group_number}-router"
|
||||||
|
image_name = "Ubuntu 20.04 - Focal Fossa - 64-bit - Cloud Based Image"
|
||||||
|
flavor_name = "m1.small"
|
||||||
|
region_name = "RegionOne"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Define OpenStack provider
|
||||||
|
terraform {
|
||||||
|
required_version = ">= 0.14.0"
|
||||||
|
required_providers {
|
||||||
|
openstack = {
|
||||||
|
source = "terraform-provider-openstack/openstack"
|
||||||
|
version = ">= 1.46.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Configure the OpenStack Provider
|
||||||
|
provider "openstack" {
|
||||||
|
user_name = local.user_name
|
||||||
|
tenant_name = local.tenant_name
|
||||||
|
password = local.user_password
|
||||||
|
auth_url = local.auth_url
|
||||||
|
region = local.region_name
|
||||||
|
use_octavia = true
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# create keypair
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
# import keypair, if public_key is not specified, create new keypair to use
|
||||||
|
resource "openstack_compute_keypair_v2" "terraform-keypair" {
|
||||||
|
name = "my-terraform-pubkey"
|
||||||
|
#public_key = file("~/.ssh/id_rsa.pub")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# create security group
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
resource "openstack_networking_secgroup_v2" "terraform-secgroup" {
|
||||||
|
name = "my-terraform-secgroup"
|
||||||
|
description = "for terraform instances"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-rule-http" {
|
||||||
|
direction = "ingress"
|
||||||
|
ethertype = "IPv4"
|
||||||
|
protocol = "tcp"
|
||||||
|
port_range_min = 80
|
||||||
|
port_range_max = 80
|
||||||
|
#remote_ip_prefix = "0.0.0.0/0"
|
||||||
|
security_group_id = openstack_networking_secgroup_v2.terraform-secgroup.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-rule-ssh" {
|
||||||
|
direction = "ingress"
|
||||||
|
ethertype = "IPv4"
|
||||||
|
protocol = "tcp"
|
||||||
|
port_range_min = 22
|
||||||
|
port_range_max = 22
|
||||||
|
#remote_ip_prefix = "0.0.0.0/0"
|
||||||
|
security_group_id = openstack_networking_secgroup_v2.terraform-secgroup.id
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# create network
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
resource "openstack_networking_network_v2" "terraform-network-1" {
|
||||||
|
name = "my-terraform-network-1"
|
||||||
|
admin_state_up = "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_networking_subnet_v2" "terraform-subnet-1" {
|
||||||
|
name = "my-terraform-subnet-1"
|
||||||
|
network_id = openstack_networking_network_v2.terraform-network-1.id
|
||||||
|
cidr = "192.168.255.0/24"
|
||||||
|
ip_version = 4
|
||||||
|
}
|
||||||
|
|
||||||
|
data "openstack_networking_router_v2" "router-1" {
|
||||||
|
name = local.router_name
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_networking_router_interface_v2" "router_interface_1" {
|
||||||
|
router_id = data.openstack_networking_router_v2.router-1.id
|
||||||
|
subnet_id = openstack_networking_subnet_v2.terraform-subnet-1.id
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# create instances
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
resource "openstack_compute_instance_v2" "terraform-instance-1" {
|
||||||
|
name = "my-terraform-instance-1"
|
||||||
|
image_name = local.image_name
|
||||||
|
flavor_name = local.flavor_name
|
||||||
|
key_pair = openstack_compute_keypair_v2.terraform-keypair.name
|
||||||
|
security_groups = [openstack_networking_secgroup_v2.terraform-secgroup.name]
|
||||||
|
|
||||||
|
depends_on = [openstack_networking_subnet_v2.terraform-subnet-1]
|
||||||
|
|
||||||
|
network {
|
||||||
|
uuid = openstack_networking_network_v2.terraform-network-1.id
|
||||||
|
}
|
||||||
|
|
||||||
|
user_data = <<-EOF
|
||||||
|
#!/bin/bash
|
||||||
|
apt-get update
|
||||||
|
apt-get -y install apache2
|
||||||
|
rm /var/www/html/index.html
|
||||||
|
cat > /var/www/html/index.html << INNEREOF
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
<h1>It works!</h1>
|
||||||
|
<p>hostname</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
INNEREOF
|
||||||
|
sed -i "s/hostname/terraform-instance-1/" /var/www/html/index.html
|
||||||
|
sed -i "1s/$/ terraform-instance-1/" /etc/hosts
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# assign floating ip to instance
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
resource "openstack_networking_floatingip_v2" "fip_1" {
|
||||||
|
pool = "public1"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_compute_floatingip_associate_v2" "fip_1_assoc" {
|
||||||
|
floating_ip = openstack_networking_floatingip_v2.fip_1.address
|
||||||
|
instance_id = openstack_compute_instance_v2.terraform-instance-1.id
|
||||||
|
}
|
||||||
|
|
||||||
|
output "vip_addr" {
|
||||||
|
value = openstack_networking_floatingip_v2.fip_1
|
||||||
|
}
|
3
terraform/lab4-scale-out-lb/get-terraform.sh
Normal file
3
terraform/lab4-scale-out-lb/get-terraform.sh
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
wget https://releases.hashicorp.com/terraform/1.1.3/terraform_1.1.3_linux_amd64.zip -O terraform_1.1.3_linux_amd64.zip
|
||||||
|
unzip -o terraform_1.1.3_linux_amd64.zip
|
259
terraform/lab4-scale-out-lb/lab4.tf
Normal file
259
terraform/lab4-scale-out-lb/lab4.tf
Normal file
@ -0,0 +1,259 @@
|
|||||||
|
# Define CloudComp group number
|
||||||
|
variable "group_number" {
|
||||||
|
type = string
|
||||||
|
default = "20"
|
||||||
|
}
|
||||||
|
|
||||||
|
## OpenStack credentials can be used in a more secure way by using
|
||||||
|
## cloud.yaml from https://private-cloud.informatik.hs-fulda.de/project/api_access/clouds.yaml/
|
||||||
|
|
||||||
|
# or by using env vars exported from openrc here,
|
||||||
|
# e.g., using 'export TF_VAR_os_password=$OS_PASSWORD'
|
||||||
|
|
||||||
|
# Define OpenStack credentials, project config etc.
|
||||||
|
locals {
|
||||||
|
auth_url = "https://private-cloud.informatik.hs-fulda.de:5000/v3"
|
||||||
|
user_name = "CloudComp${var.group_number}"
|
||||||
|
user_password = "<password of your group here, private-cloud is only reachable via vpn>"
|
||||||
|
tenant_name = "CloudComp${var.group_number}"
|
||||||
|
#network_name = "CloudComp${var.group_number}-net"
|
||||||
|
router_name = "CloudComp${var.group_number}-router"
|
||||||
|
image_name = "Ubuntu 20.04 - Focal Fossa - 64-bit - Cloud Based Image"
|
||||||
|
flavor_name = "m1.small"
|
||||||
|
region_name = "RegionOne"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Define OpenStack provider
|
||||||
|
terraform {
|
||||||
|
required_version = ">= 0.14.0"
|
||||||
|
required_providers {
|
||||||
|
openstack = {
|
||||||
|
source = "terraform-provider-openstack/openstack"
|
||||||
|
version = ">= 1.46.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Configure the OpenStack Provider
|
||||||
|
provider "openstack" {
|
||||||
|
user_name = local.user_name
|
||||||
|
tenant_name = local.tenant_name
|
||||||
|
password = local.user_password
|
||||||
|
auth_url = local.auth_url
|
||||||
|
region = local.region_name
|
||||||
|
use_octavia = true
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# create keypair
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
# import keypair, if public_key is not specified, create new keypair to use
|
||||||
|
resource "openstack_compute_keypair_v2" "terraform-keypair" {
|
||||||
|
name = "my-terraform-pubkey"
|
||||||
|
#public_key = file("~/.ssh/id_rsa.pub")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# create security group
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
resource "openstack_networking_secgroup_v2" "terraform-secgroup" {
|
||||||
|
name = "my-terraform-secgroup"
|
||||||
|
description = "for terraform instances"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-rule-http" {
|
||||||
|
direction = "ingress"
|
||||||
|
ethertype = "IPv4"
|
||||||
|
protocol = "tcp"
|
||||||
|
port_range_min = 80
|
||||||
|
port_range_max = 80
|
||||||
|
#remote_ip_prefix = "0.0.0.0/0"
|
||||||
|
security_group_id = openstack_networking_secgroup_v2.terraform-secgroup.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-rule-ssh" {
|
||||||
|
direction = "ingress"
|
||||||
|
ethertype = "IPv4"
|
||||||
|
protocol = "tcp"
|
||||||
|
port_range_min = 22
|
||||||
|
port_range_max = 22
|
||||||
|
#remote_ip_prefix = "0.0.0.0/0"
|
||||||
|
security_group_id = openstack_networking_secgroup_v2.terraform-secgroup.id
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# create network
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
resource "openstack_networking_network_v2" "terraform-network-1" {
|
||||||
|
name = "my-terraform-network-1"
|
||||||
|
admin_state_up = "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_networking_subnet_v2" "terraform-subnet-1" {
|
||||||
|
name = "my-terraform-subnet-1"
|
||||||
|
network_id = openstack_networking_network_v2.terraform-network-1.id
|
||||||
|
cidr = "192.168.255.0/24"
|
||||||
|
ip_version = 4
|
||||||
|
}
|
||||||
|
|
||||||
|
data "openstack_networking_router_v2" "router-1" {
|
||||||
|
name = local.router_name
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_networking_router_interface_v2" "router_interface_1" {
|
||||||
|
router_id = data.openstack_networking_router_v2.router-1.id
|
||||||
|
subnet_id = openstack_networking_subnet_v2.terraform-subnet-1.id
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# create instances
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
resource "openstack_compute_instance_v2" "terraform-instance-1" {
|
||||||
|
name = "my-terraform-instance-1"
|
||||||
|
image_name = local.image_name
|
||||||
|
flavor_name = local.flavor_name
|
||||||
|
key_pair = openstack_compute_keypair_v2.terraform-keypair.name
|
||||||
|
security_groups = [openstack_networking_secgroup_v2.terraform-secgroup.name]
|
||||||
|
|
||||||
|
depends_on = [openstack_networking_subnet_v2.terraform-subnet-1]
|
||||||
|
|
||||||
|
network {
|
||||||
|
uuid = openstack_networking_network_v2.terraform-network-1.id
|
||||||
|
}
|
||||||
|
|
||||||
|
user_data = <<-EOF
|
||||||
|
#!/bin/bash
|
||||||
|
apt-get update
|
||||||
|
apt-get -y install apache2
|
||||||
|
rm /var/www/html/index.html
|
||||||
|
cat > /var/www/html/index.html << INNEREOF
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
<h1>It works!</h1>
|
||||||
|
<p>hostname</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
INNEREOF
|
||||||
|
sed -i "s/hostname/terraform-instance-1/" /var/www/html/index.html
|
||||||
|
sed -i "1s/$/ terraform-instance-1/" /etc/hosts
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_compute_instance_v2" "terraform-instance-2" {
|
||||||
|
name = "my-terraform-instance-2"
|
||||||
|
image_name = local.image_name
|
||||||
|
flavor_name = local.flavor_name
|
||||||
|
key_pair = openstack_compute_keypair_v2.terraform-keypair.name
|
||||||
|
security_groups = [openstack_networking_secgroup_v2.terraform-secgroup.id]
|
||||||
|
|
||||||
|
depends_on = [openstack_networking_subnet_v2.terraform-subnet-1]
|
||||||
|
|
||||||
|
network {
|
||||||
|
uuid = openstack_networking_network_v2.terraform-network-1.id
|
||||||
|
}
|
||||||
|
|
||||||
|
user_data = <<-EOF
|
||||||
|
#!/bin/bash
|
||||||
|
apt-get update
|
||||||
|
apt-get -y install apache2
|
||||||
|
rm /var/www/html/index.html
|
||||||
|
cat > /var/www/html/index.html << INNEREOF
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
<h1>It works!</h1>
|
||||||
|
<p>hostname</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
INNEREOF
|
||||||
|
sed -i "s/hostname/terraform-instance-2/" /var/www/html/index.html
|
||||||
|
sed -i "1s/$/ terraform-instance-2/" /etc/hosts
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# create load balancer
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
resource "openstack_lb_loadbalancer_v2" "lb_1" {
|
||||||
|
vip_subnet_id = openstack_networking_subnet_v2.terraform-subnet-1.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_lb_listener_v2" "listener_1" {
|
||||||
|
protocol = "HTTP"
|
||||||
|
protocol_port = 80
|
||||||
|
loadbalancer_id = openstack_lb_loadbalancer_v2.lb_1.id
|
||||||
|
connection_limit = 1024
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_lb_pool_v2" "pool_1" {
|
||||||
|
protocol = "HTTP"
|
||||||
|
lb_method = "ROUND_ROBIN"
|
||||||
|
listener_id = openstack_lb_listener_v2.listener_1.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_lb_members_v2" "members_1" {
|
||||||
|
pool_id = openstack_lb_pool_v2.pool_1.id
|
||||||
|
|
||||||
|
member {
|
||||||
|
address = openstack_compute_instance_v2.terraform-instance-1.access_ip_v4
|
||||||
|
protocol_port = 80
|
||||||
|
}
|
||||||
|
|
||||||
|
member {
|
||||||
|
address = openstack_compute_instance_v2.terraform-instance-2.access_ip_v4
|
||||||
|
protocol_port = 80
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_lb_monitor_v2" "monitor_1" {
|
||||||
|
pool_id = openstack_lb_pool_v2.pool_1.id
|
||||||
|
type = "HTTP"
|
||||||
|
delay = 5
|
||||||
|
timeout = 5
|
||||||
|
max_retries = 3
|
||||||
|
http_method = "GET"
|
||||||
|
url_path = "/"
|
||||||
|
expected_codes = 200
|
||||||
|
|
||||||
|
depends_on = [openstack_lb_loadbalancer_v2.lb_1, openstack_lb_listener_v2.listener_1, openstack_lb_pool_v2.pool_1, openstack_lb_members_v2.members_1 ]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# assign floating ip to load balancer
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
resource "openstack_networking_floatingip_v2" "fip_1" {
|
||||||
|
pool = "public1"
|
||||||
|
port_id = openstack_lb_loadbalancer_v2.lb_1.vip_port_id
|
||||||
|
}
|
||||||
|
|
||||||
|
output "loadbalancer_vip_addr" {
|
||||||
|
value = openstack_networking_floatingip_v2.fip_1
|
||||||
|
}
|
23
terraform/lab4-scale-out-lb/run-terraform.sh
Normal file
23
terraform/lab4-scale-out-lb/run-terraform.sh
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# initialization of terraform state and download openstack plugin/dependencies
|
||||||
|
./terraform init
|
||||||
|
|
||||||
|
# show what will done
|
||||||
|
./terraform plan
|
||||||
|
|
||||||
|
# let terraform create the resources specified in .tf file in same directory
|
||||||
|
./terraform apply
|
||||||
|
|
||||||
|
# you can also use "terraform apply -auto-approve" to prevent terraform from asking back whether it should proceed
|
||||||
|
|
||||||
|
# among the benefits of terraform, is that is deploys the resources rather quick. It identifies dependencies and
|
||||||
|
# deploys independent resources in parallel.
|
||||||
|
# "terraform graph" creates a dependency graph of the resource specified in the .tf file
|
||||||
|
# another benefit of terraform is, that it does the heavy lifting to support the APIs of multiple cloud
|
||||||
|
# providers and supports way more features and cloud services than, e.g., libcloud, hence it's quite popular
|
||||||
|
#
|
||||||
|
# among the drawbacks however is, that it comes with its own definition language and does not offer the full
|
||||||
|
# flexibility of a programming language. In this regard, libcloud, boto3, openstack-sdk etc. are way more flexible
|
||||||
|
#
|
||||||
|
# we discuss different cloud service deployment solutions and their pros/cons in the course
|
6
terraform/lab4-scale-out-lb/stop-terraform.sh
Normal file
6
terraform/lab4-scale-out-lb/stop-terraform.sh
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# let terraform remove the resources specified in .tf file in same directory
|
||||||
|
./terraform destroy
|
||||||
|
|
||||||
|
# you can also use "terraform destroy -auto-approve" to prevent terraform from asking back whether it should proceed
|
@ -0,0 +1,179 @@
|
|||||||
|
#
|
||||||
|
# Cluster Config
|
||||||
|
#
|
||||||
|
docker_root_dir: /var/lib/docker
|
||||||
|
enable_cluster_alerting: false
|
||||||
|
enable_cluster_monitoring: false
|
||||||
|
enable_network_policy: false
|
||||||
|
local_cluster_auth_endpoint:
|
||||||
|
enabled: true
|
||||||
|
name: openstack-rke
|
||||||
|
#
|
||||||
|
# Rancher Config
|
||||||
|
#
|
||||||
|
rancher_kubernetes_engine_config:
|
||||||
|
#####################################################################
|
||||||
|
#
|
||||||
|
# Config for OpenStack @ NetLab Hochschule Fulda Start
|
||||||
|
#
|
||||||
|
# Paste the following section into rancher_kubernetes_engine_config
|
||||||
|
# be sure to use correct indention, if in doubt, use YAML syntax
|
||||||
|
# checker
|
||||||
|
#
|
||||||
|
# You need to replace tenant-id with your project id, you can see
|
||||||
|
# the id, e.g., in the OpenStack Web Interface (Horizon) here:
|
||||||
|
# - https://private-cloud.informatik.hs-fulda.de/project/api_access/view_credentials/
|
||||||
|
#
|
||||||
|
# Replace floating-network-id with the id of the network "public1".
|
||||||
|
# Click in network "public1" here:
|
||||||
|
# - https://private-cloud.informatik.hs-fulda.de/project/networks/
|
||||||
|
# and use the value shown for ID.
|
||||||
|
#
|
||||||
|
# Replace subnet-id with the id of the subnet (not network!) that you
|
||||||
|
# use for your RKE node instances. If you use network
|
||||||
|
# "my-terraform-rancher-network-1" you can got to:
|
||||||
|
# - https://private-cloud.informatik.hs-fulda.de/project/networks/
|
||||||
|
# click on my-terraform-rancher-network-1, then click on its subnet
|
||||||
|
# my-terraform-rancher-subnet-1, and use the shown ID of the subnet.
|
||||||
|
#
|
||||||
|
# Replace the router-id with the id of your router. Go to:
|
||||||
|
# - https://private-cloud.informatik.hs-fulda.de/project/routers/
|
||||||
|
# click on the router you use for the network of your RKE instances
|
||||||
|
# and use the shown ID of this router.
|
||||||
|
#
|
||||||
|
# Replace password with the password of your groups' OpenStack
|
||||||
|
# account
|
||||||
|
#
|
||||||
|
# You can also see other config options in RKE docu here:
|
||||||
|
# https://rancher.com/docs/rke/latest/en/config-options/cloud-providers/openstack/
|
||||||
|
#
|
||||||
|
#####################################################################
|
||||||
|
cloud_provider:
|
||||||
|
name: openstack
|
||||||
|
openstackCloudProvider:
|
||||||
|
block_storage:
|
||||||
|
ignore-volume-az: true
|
||||||
|
trust-device-path: false
|
||||||
|
global:
|
||||||
|
auth-url: 'https://private-cloud.informatik.hs-fulda.de:5000'
|
||||||
|
domain-name: Default
|
||||||
|
tenant-id: <id of your project here>
|
||||||
|
username: IntServ19
|
||||||
|
password: <your password here>
|
||||||
|
load_balancer:
|
||||||
|
create-monitor: false
|
||||||
|
floating-network-id: <id of network public1>
|
||||||
|
lb-version: v2
|
||||||
|
manage-security-groups: true
|
||||||
|
monitor-max-retries: 0
|
||||||
|
subnet-id: <id of the subnet your use for rke instances>
|
||||||
|
use-octavia: true
|
||||||
|
metadata:
|
||||||
|
request-timeout: 0
|
||||||
|
route:
|
||||||
|
router-id: <id of the router you use for the rke instances>
|
||||||
|
#####################################################################
|
||||||
|
#
|
||||||
|
# Config for OpenStack @ NetLab Hochschule Fulda End
|
||||||
|
#
|
||||||
|
#####################################################################
|
||||||
|
addon_job_timeout: 45
|
||||||
|
authentication:
|
||||||
|
strategy: x509
|
||||||
|
dns:
|
||||||
|
nodelocal:
|
||||||
|
ip_address: ''
|
||||||
|
node_selector: null
|
||||||
|
update_strategy: {}
|
||||||
|
enable_cri_dockerd: false
|
||||||
|
ignore_docker_version: true
|
||||||
|
#
|
||||||
|
# # Currently only nginx ingress provider is supported.
|
||||||
|
# # To disable ingress controller, set `provider: none`
|
||||||
|
# # To enable ingress on specific nodes, use the node_selector, eg:
|
||||||
|
# provider: nginx
|
||||||
|
# node_selector:
|
||||||
|
# app: ingress
|
||||||
|
#
|
||||||
|
ingress:
|
||||||
|
default_backend: false
|
||||||
|
default_ingress_class: true
|
||||||
|
http_port: 0
|
||||||
|
https_port: 0
|
||||||
|
provider: nginx
|
||||||
|
kubernetes_version: v1.21.8-rancher1-1
|
||||||
|
monitoring:
|
||||||
|
provider: metrics-server
|
||||||
|
replicas: 1
|
||||||
|
#
|
||||||
|
# If you are using calico on AWS
|
||||||
|
#
|
||||||
|
# network:
|
||||||
|
# plugin: calico
|
||||||
|
# calico_network_provider:
|
||||||
|
# cloud_provider: aws
|
||||||
|
#
|
||||||
|
# # To specify flannel interface
|
||||||
|
#
|
||||||
|
# network:
|
||||||
|
# plugin: flannel
|
||||||
|
# flannel_network_provider:
|
||||||
|
# iface: eth1
|
||||||
|
#
|
||||||
|
# # To specify flannel interface for canal plugin
|
||||||
|
#
|
||||||
|
# network:
|
||||||
|
# plugin: canal
|
||||||
|
# canal_network_provider:
|
||||||
|
# iface: eth1
|
||||||
|
#
|
||||||
|
network:
|
||||||
|
mtu: 0
|
||||||
|
options:
|
||||||
|
flannel_backend_type: vxlan
|
||||||
|
plugin: canal
|
||||||
|
rotate_encryption_key: false
|
||||||
|
#
|
||||||
|
# services:
|
||||||
|
# kube-api:
|
||||||
|
# service_cluster_ip_range: 10.43.0.0/16
|
||||||
|
# kube-controller:
|
||||||
|
# cluster_cidr: 10.42.0.0/16
|
||||||
|
# service_cluster_ip_range: 10.43.0.0/16
|
||||||
|
# kubelet:
|
||||||
|
# cluster_domain: cluster.local
|
||||||
|
# cluster_dns_server: 10.43.0.10
|
||||||
|
#
|
||||||
|
services:
|
||||||
|
etcd:
|
||||||
|
backup_config:
|
||||||
|
enabled: true
|
||||||
|
interval_hours: 12
|
||||||
|
retention: 6
|
||||||
|
safe_timestamp: false
|
||||||
|
timeout: 300
|
||||||
|
creation: 12h
|
||||||
|
extra_args:
|
||||||
|
election-timeout: 5000
|
||||||
|
heartbeat-interval: 500
|
||||||
|
gid: 0
|
||||||
|
retention: 72h
|
||||||
|
snapshot: false
|
||||||
|
uid: 0
|
||||||
|
kube_api:
|
||||||
|
always_pull_images: false
|
||||||
|
pod_security_policy: false
|
||||||
|
secrets_encryption_config:
|
||||||
|
enabled: false
|
||||||
|
service_node_port_range: 30000-32767
|
||||||
|
ssh_agent_auth: false
|
||||||
|
upgrade_strategy:
|
||||||
|
max_unavailable_controlplane: '1'
|
||||||
|
max_unavailable_worker: 10%
|
||||||
|
node_drain_input:
|
||||||
|
delete_local_data: false
|
||||||
|
force: false
|
||||||
|
grace_period: -1
|
||||||
|
ignore_daemon_sets: true
|
||||||
|
timeout: 120
|
||||||
|
windows_prefered_cluster: false
|
@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"driver": "openstack",
|
||||||
|
"name": "openstack-template",
|
||||||
|
"openstackConfig": {
|
||||||
|
"activeTimeout": "200",
|
||||||
|
"applicationCredentialId": "",
|
||||||
|
"applicationCredentialName": "",
|
||||||
|
"applicationCredentialSecret": "",
|
||||||
|
"authUrl": "https://private-cloud.informatik.hs-fulda.de:5000",
|
||||||
|
"availabilityZone": "nova",
|
||||||
|
"bootFromVolume": false,
|
||||||
|
"cacert": "",
|
||||||
|
"configDrive": false,
|
||||||
|
"domainId": "",
|
||||||
|
"domainName": "Default",
|
||||||
|
"endpointType": "",
|
||||||
|
"flavorId": "",
|
||||||
|
"flavorName": "m1.medium",
|
||||||
|
"floatingipPool": "public1",
|
||||||
|
"imageId": "",
|
||||||
|
"imageName": "Ubuntu 20.04 - Focal Fossa - 64-bit - Cloud Based Image",
|
||||||
|
"insecure": false,
|
||||||
|
"ipVersion": "4",
|
||||||
|
"keypairName": "rancher-key",
|
||||||
|
"netId": "",
|
||||||
|
"netName": "my-terraform-rancher-network-1",
|
||||||
|
"novaNetwork": false,
|
||||||
|
"region": "RegionOne",
|
||||||
|
"secGroups": "my-terraform-rancher-secgroup",
|
||||||
|
"sshPort": "22",
|
||||||
|
"sshUser": "ubuntu",
|
||||||
|
"tenantDomainId": "",
|
||||||
|
"tenantDomainName": "Default",
|
||||||
|
"tenantId": "",
|
||||||
|
"tenantName": "IntServ19",
|
||||||
|
"userDataFile": "",
|
||||||
|
"userDomainId": "",
|
||||||
|
"userDomainName": "Default",
|
||||||
|
"userId": "",
|
||||||
|
"username": "IntServ19",
|
||||||
|
"password": "<your password here>",
|
||||||
|
"volumeDevicePath": "",
|
||||||
|
"volumeId": "",
|
||||||
|
"volumeName": "",
|
||||||
|
"volumeSize": "0",
|
||||||
|
"volumeType": ""
|
||||||
|
},
|
||||||
|
"type": "nodeTemplate",
|
||||||
|
}
|
500
terraform/rancher-terraform/main.tf
Normal file
500
terraform/rancher-terraform/main.tf
Normal file
@ -0,0 +1,500 @@
|
|||||||
|
# Define IntServ group number
|
||||||
|
# TODO: change to use OS env vars etc.
|
||||||
|
variable "group_number" {
|
||||||
|
type = string
|
||||||
|
default = "19"
|
||||||
|
}
|
||||||
|
|
||||||
|
## OpenStack credentials can be used in a more secure way by using
|
||||||
|
## cloud.yaml from https://private-cloud.informatik.hs-fulda.de/project/api_access/clouds.yaml/
|
||||||
|
|
||||||
|
# Define OpenStack credentials, project config etc.
|
||||||
|
locals {
|
||||||
|
auth_url = "https://private-cloud.informatik.hs-fulda.de:5000/v3"
|
||||||
|
user_name = "IntServ${var.group_number}"
|
||||||
|
user_password = "<password of your group here, private-cloud is only reachable via vpn>"
|
||||||
|
tenant_name = "IntServ${var.group_number}"
|
||||||
|
#network_name = "IntServ${var.group_number}-net"
|
||||||
|
router_name = "IntServ${var.group_number}-router"
|
||||||
|
image_name = "Ubuntu 20.04 - Focal Fossa - 64-bit - Cloud Based Image"
|
||||||
|
flavor_name = "m1.medium"
|
||||||
|
region_name = "RegionOne"
|
||||||
|
rke_flavor_name = "m1.medium"
|
||||||
|
availability_zone = "nova"
|
||||||
|
domain_name = "Default"
|
||||||
|
# possibly set floating_ip_pool = "" to avoid assigning floating ips to
|
||||||
|
# every created node and use only load balancer as frontend, however needed
|
||||||
|
# for node port forwarding etc. using kube proxy
|
||||||
|
floating_ip_pool = "public1"
|
||||||
|
ssh_user = "ubuntu"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Define OpenStack provider
|
||||||
|
terraform {
|
||||||
|
required_version = ">= 0.14.0"
|
||||||
|
required_providers {
|
||||||
|
openstack = {
|
||||||
|
source = "terraform-provider-openstack/openstack"
|
||||||
|
version = ">= 1.46.0"
|
||||||
|
}
|
||||||
|
rancher2 = {
|
||||||
|
source = "rancher/rancher2"
|
||||||
|
version = ">= 1.22.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Configure the OpenStack Provider
|
||||||
|
provider "openstack" {
|
||||||
|
user_name = local.user_name
|
||||||
|
tenant_name = local.tenant_name
|
||||||
|
password = local.user_password
|
||||||
|
auth_url = local.auth_url
|
||||||
|
region = local.region_name
|
||||||
|
use_octavia = true
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# create keypair
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
# import keypair, if public_key is not specified, create new keypair to use
|
||||||
|
resource "openstack_compute_keypair_v2" "terraform-rancher-keypair" {
|
||||||
|
name = "my-terraform-rancher-pubkey"
|
||||||
|
# public_key = file("~/srieger_rsa.pub")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# create security group
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
resource "openstack_networking_secgroup_v2" "terraform-rancher-secgroup" {
|
||||||
|
name = "my-terraform-rancher-secgroup"
|
||||||
|
description = "for terraform rancher instances"
|
||||||
|
}
|
||||||
|
|
||||||
|
# TODO: possibly cleanup unnecessary ports?
|
||||||
|
|
||||||
|
resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-rule-ssh" {
|
||||||
|
direction = "ingress"
|
||||||
|
ethertype = "IPv4"
|
||||||
|
protocol = "tcp"
|
||||||
|
port_range_min = 22
|
||||||
|
port_range_max = 22
|
||||||
|
#remote_ip_prefix = "0.0.0.0/0"
|
||||||
|
security_group_id = openstack_networking_secgroup_v2.terraform-rancher-secgroup.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-rule-http" {
|
||||||
|
direction = "ingress"
|
||||||
|
ethertype = "IPv4"
|
||||||
|
protocol = "tcp"
|
||||||
|
port_range_min = 80
|
||||||
|
port_range_max = 80
|
||||||
|
#remote_ip_prefix = "0.0.0.0/0"
|
||||||
|
security_group_id = openstack_networking_secgroup_v2.terraform-rancher-secgroup.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-rule-https" {
|
||||||
|
direction = "ingress"
|
||||||
|
ethertype = "IPv4"
|
||||||
|
protocol = "tcp"
|
||||||
|
port_range_min = 443
|
||||||
|
port_range_max = 443
|
||||||
|
#remote_ip_prefix = "0.0.0.0/0"
|
||||||
|
security_group_id = openstack_networking_secgroup_v2.terraform-rancher-secgroup.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-rule-2376" {
|
||||||
|
direction = "ingress"
|
||||||
|
ethertype = "IPv4"
|
||||||
|
protocol = "tcp"
|
||||||
|
port_range_min = 2376
|
||||||
|
port_range_max = 2376
|
||||||
|
#remote_ip_prefix = "0.0.0.0/0"
|
||||||
|
security_group_id = openstack_networking_secgroup_v2.terraform-rancher-secgroup.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-rule-2379" {
|
||||||
|
direction = "ingress"
|
||||||
|
ethertype = "IPv4"
|
||||||
|
protocol = "tcp"
|
||||||
|
port_range_min = 2379
|
||||||
|
port_range_max = 2379
|
||||||
|
#remote_ip_prefix = "0.0.0.0/0"
|
||||||
|
security_group_id = openstack_networking_secgroup_v2.terraform-rancher-secgroup.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-rule-2380" {
|
||||||
|
direction = "ingress"
|
||||||
|
ethertype = "IPv4"
|
||||||
|
protocol = "tcp"
|
||||||
|
port_range_min = 2380
|
||||||
|
port_range_max = 2380
|
||||||
|
#remote_ip_prefix = "0.0.0.0/0"
|
||||||
|
security_group_id = openstack_networking_secgroup_v2.terraform-rancher-secgroup.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-rule-6443" {
|
||||||
|
direction = "ingress"
|
||||||
|
ethertype = "IPv4"
|
||||||
|
protocol = "tcp"
|
||||||
|
port_range_min = 6443
|
||||||
|
port_range_max = 6443
|
||||||
|
#remote_ip_prefix = "0.0.0.0/0"
|
||||||
|
security_group_id = openstack_networking_secgroup_v2.terraform-rancher-secgroup.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-rule-9099" {
|
||||||
|
direction = "ingress"
|
||||||
|
ethertype = "IPv4"
|
||||||
|
protocol = "tcp"
|
||||||
|
port_range_min = 9099
|
||||||
|
port_range_max = 9099
|
||||||
|
#remote_ip_prefix = "0.0.0.0/0"
|
||||||
|
security_group_id = openstack_networking_secgroup_v2.terraform-rancher-secgroup.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-rule-10250" {
|
||||||
|
direction = "ingress"
|
||||||
|
ethertype = "IPv4"
|
||||||
|
protocol = "tcp"
|
||||||
|
port_range_min = 10250
|
||||||
|
port_range_max = 10250
|
||||||
|
#remote_ip_prefix = "0.0.0.0/0"
|
||||||
|
security_group_id = openstack_networking_secgroup_v2.terraform-rancher-secgroup.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-rule-10254" {
|
||||||
|
direction = "ingress"
|
||||||
|
ethertype = "IPv4"
|
||||||
|
protocol = "tcp"
|
||||||
|
port_range_min = 10254
|
||||||
|
port_range_max = 10254
|
||||||
|
#remote_ip_prefix = "0.0.0.0/0"
|
||||||
|
security_group_id = openstack_networking_secgroup_v2.terraform-rancher-secgroup.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-rule-8472" {
|
||||||
|
direction = "ingress"
|
||||||
|
ethertype = "IPv4"
|
||||||
|
protocol = "udp"
|
||||||
|
port_range_min = 8472
|
||||||
|
port_range_max = 8472
|
||||||
|
#remote_ip_prefix = "0.0.0.0/0"
|
||||||
|
security_group_id = openstack_networking_secgroup_v2.terraform-rancher-secgroup.id
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# create network
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
resource "openstack_networking_network_v2" "terraform-rancher-network-1" {
|
||||||
|
name = "my-terraform-rancher-network-1"
|
||||||
|
admin_state_up = "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_networking_subnet_v2" "terraform-rancher-subnet-1" {
|
||||||
|
name = "my-terraform-rancher-subnet-1"
|
||||||
|
network_id = openstack_networking_network_v2.terraform-rancher-network-1.id
|
||||||
|
cidr = "192.168.254.0/24"
|
||||||
|
dns_nameservers = [ "192.168.76.253" ]
|
||||||
|
ip_version = 4
|
||||||
|
}
|
||||||
|
|
||||||
|
data "openstack_networking_router_v2" "router-1" {
|
||||||
|
name = local.router_name
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_networking_router_interface_v2" "router_interface_1" {
|
||||||
|
router_id = data.openstack_networking_router_v2.router-1.id
|
||||||
|
subnet_id = openstack_networking_subnet_v2.terraform-rancher-subnet-1.id
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# create instances
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
resource "openstack_compute_instance_v2" "terraform-rancher-instance-1" {
|
||||||
|
name = "my-terraform-rancher-instance-1"
|
||||||
|
image_name = local.image_name
|
||||||
|
flavor_name = local.flavor_name
|
||||||
|
key_pair = openstack_compute_keypair_v2.terraform-rancher-keypair.name
|
||||||
|
security_groups = [openstack_networking_secgroup_v2.terraform-rancher-secgroup.name]
|
||||||
|
|
||||||
|
network {
|
||||||
|
uuid = openstack_networking_network_v2.terraform-rancher-network-1.id
|
||||||
|
}
|
||||||
|
|
||||||
|
user_data = <<-EOF
|
||||||
|
#!/bin/bash
|
||||||
|
apt-get update
|
||||||
|
apt-get -y upgrade
|
||||||
|
curl https://releases.rancher.com/install-docker/20.10.sh | sh
|
||||||
|
sudo docker run --privileged -d --restart=unless-stopped -p 80:80 -p 443:443 --env CATTLE_BOOTSTRAP_PASSWORD=this-is-not-a-secure-bootstrap-pw rancher/rancher
|
||||||
|
#sudo docker ps
|
||||||
|
#sudo docker logs $(sudo docker ps | grep rancher | cut -d " " -f 1) 2>&1 | grep "Bootstrap Password:"
|
||||||
|
EOF
|
||||||
|
|
||||||
|
depends_on = [
|
||||||
|
openstack_networking_subnet_v2.terraform-rancher-subnet-1
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# assign floating ip to rancher instance
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
resource "openstack_networking_floatingip_v2" "fip_1" {
|
||||||
|
pool = "public1"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "openstack_compute_floatingip_associate_v2" "fip_1" {
|
||||||
|
floating_ip = "${openstack_networking_floatingip_v2.fip_1.address}"
|
||||||
|
instance_id = "${openstack_compute_instance_v2.terraform-rancher-instance-1.id}"
|
||||||
|
}
|
||||||
|
|
||||||
|
output "floating_ip" {
|
||||||
|
value = openstack_networking_floatingip_v2.fip_1
|
||||||
|
}
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# bootstrap rancher
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
# Provider bootstrap config
|
||||||
|
provider "rancher2" {
|
||||||
|
alias = "bootstrap"
|
||||||
|
|
||||||
|
api_url = "https://${openstack_networking_floatingip_v2.fip_1.address}"
|
||||||
|
bootstrap = true
|
||||||
|
insecure = true
|
||||||
|
# takes roughly ~7 minutes currently
|
||||||
|
timeout = "600s"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create a new rancher2_bootstrap for Rancher v2.6.0 and above
|
||||||
|
resource "rancher2_bootstrap" "admin" {
|
||||||
|
provider = rancher2.bootstrap
|
||||||
|
initial_password = "this-is-not-a-secure-bootstrap-pw"
|
||||||
|
password = "this-is-not-a-secure-admin-pw"
|
||||||
|
telemetry = true
|
||||||
|
token_update=true
|
||||||
|
}
|
||||||
|
|
||||||
|
# Rancher2 administration provider
|
||||||
|
provider "rancher2" {
|
||||||
|
alias = "admin"
|
||||||
|
|
||||||
|
api_url = "https://${openstack_networking_floatingip_v2.fip_1.address}"
|
||||||
|
insecure = true
|
||||||
|
# ca_certs = data.kubernetes_secret.rancher_cert.data["ca.crt"]
|
||||||
|
token_key = rancher2_bootstrap.admin.token
|
||||||
|
}
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# enable rancher node driver openstack
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
#data "rancher2_node_driver" "OpenStack" {
|
||||||
|
# provider = rancher2.admin
|
||||||
|
# name = "openstack"
|
||||||
|
#}
|
||||||
|
|
||||||
|
# Create a new rancher2 Node Driver
|
||||||
|
# TODO: creates a new builtin driver, maybe better to change existing one
|
||||||
|
resource "rancher2_node_driver" "OpenStack" {
|
||||||
|
provider = rancher2.admin
|
||||||
|
name = "openstack"
|
||||||
|
active = true
|
||||||
|
builtin = true
|
||||||
|
url = "local://"
|
||||||
|
# external_id = data.rancher2_node_driver.OpenStack
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# create rancher node template for hsfd openstack
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
resource "rancher2_node_template" "hsfd-rancher-openstack" {
|
||||||
|
provider = rancher2.admin
|
||||||
|
name = "hsfd-rancher-openstack"
|
||||||
|
driver_id = rancher2_node_driver.OpenStack.id
|
||||||
|
openstack_config {
|
||||||
|
auth_url = local.auth_url
|
||||||
|
availability_zone = local.availability_zone
|
||||||
|
region = local.region_name
|
||||||
|
username = local.user_name
|
||||||
|
# TODO: (Optional/Sensitive) OpenStack password. Mandatory on Rancher v2.0.x and v2.1.x. Use rancher2_cloud_credential from Rancher v2.2.x (string)
|
||||||
|
password = local.user_password
|
||||||
|
active_timeout = "200"
|
||||||
|
domain_name = local.domain_name
|
||||||
|
boot_from_volume = false
|
||||||
|
flavor_name = local.rke_flavor_name
|
||||||
|
floating_ip_pool = local.floating_ip_pool
|
||||||
|
image_name = local.image_name
|
||||||
|
ip_version = "4"
|
||||||
|
keypair_name = openstack_compute_keypair_v2.terraform-rancher-keypair.name
|
||||||
|
net_id = openstack_networking_network_v2.terraform-rancher-network-1.id
|
||||||
|
sec_groups = openstack_networking_secgroup_v2.terraform-rancher-secgroup.name
|
||||||
|
ssh_user = local.ssh_user
|
||||||
|
private_key_file = openstack_compute_keypair_v2.terraform-rancher-keypair.private_key
|
||||||
|
tenant_name = local.tenant_name
|
||||||
|
}
|
||||||
|
# TODO: get latest recommended string possible?
|
||||||
|
engine_install_url = "https://releases.rancher.com/install-docker/20.10.sh"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# create rke template for hsfd openstack
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
data "openstack_identity_project_v3" "my-project" {
|
||||||
|
name = local.tenant_name
|
||||||
|
}
|
||||||
|
|
||||||
|
data "openstack_networking_network_v2" "public1" {
|
||||||
|
name = local.floating_ip_pool
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create a new rancher2 Cluster Template
|
||||||
|
resource "rancher2_cluster_template" "hsfd-rke-openstack" {
|
||||||
|
provider = rancher2.admin
|
||||||
|
name = "hsfd-rke-openstack"
|
||||||
|
template_revisions {
|
||||||
|
name = "V1"
|
||||||
|
cluster_config {
|
||||||
|
rke_config {
|
||||||
|
cloud_provider {
|
||||||
|
name = "openstack"
|
||||||
|
openstack_cloud_provider {
|
||||||
|
block_storage {
|
||||||
|
ignore_volume_az = true
|
||||||
|
trust_device_path = false
|
||||||
|
}
|
||||||
|
global {
|
||||||
|
auth_url = local.auth_url
|
||||||
|
domain_name = local.domain_name
|
||||||
|
tenant_id = data.openstack_identity_project_v3.my-project.id
|
||||||
|
username = local.user_name
|
||||||
|
password = local.user_password
|
||||||
|
}
|
||||||
|
load_balancer {
|
||||||
|
create_monitor = false
|
||||||
|
floating_network_id = data.openstack_networking_network_v2.public1.id
|
||||||
|
lb_version = "v2"
|
||||||
|
manage_security_groups = true
|
||||||
|
monitor_max_retries = 0
|
||||||
|
subnet_id = openstack_networking_subnet_v2.terraform-rancher-subnet-1.id
|
||||||
|
use_octavia = true
|
||||||
|
}
|
||||||
|
metadata {
|
||||||
|
request_timeout = 0
|
||||||
|
}
|
||||||
|
route {
|
||||||
|
router_id = data.openstack_networking_router_v2.router-1.id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default = true
|
||||||
|
}
|
||||||
|
description = "Terraform RKE template for HSFD OpenStack"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###########################################################################
|
||||||
|
#
|
||||||
|
# create rke demo cluster
|
||||||
|
#
|
||||||
|
###########################################################################
|
||||||
|
|
||||||
|
resource "rancher2_cluster" "hsfd-rke-demo" {
|
||||||
|
provider = rancher2.admin
|
||||||
|
name = "hsfd-rke-demo"
|
||||||
|
cluster_template_id = rancher2_cluster_template.hsfd-rke-openstack.id
|
||||||
|
cluster_template_revision_id = rancher2_cluster_template.hsfd-rke-openstack.template_revisions.0.id
|
||||||
|
|
||||||
|
# if instance is gone before deleting the cluster, we'll not be able to
|
||||||
|
# reach rke anymore
|
||||||
|
depends_on = [
|
||||||
|
openstack_compute_instance_v2.terraform-rancher-instance-1,
|
||||||
|
openstack_networking_secgroup_rule_v2.terraform-secgroup-rule-ssh,
|
||||||
|
openstack_networking_secgroup_rule_v2.terraform-secgroup-rule-http,
|
||||||
|
openstack_networking_secgroup_rule_v2.terraform-secgroup-rule-https,
|
||||||
|
openstack_networking_secgroup_rule_v2.terraform-secgroup-rule-2376,
|
||||||
|
openstack_networking_secgroup_rule_v2.terraform-secgroup-rule-2379,
|
||||||
|
openstack_networking_secgroup_rule_v2.terraform-secgroup-rule-2380,
|
||||||
|
openstack_networking_secgroup_rule_v2.terraform-secgroup-rule-6443,
|
||||||
|
openstack_networking_secgroup_rule_v2.terraform-secgroup-rule-9099,
|
||||||
|
openstack_networking_secgroup_rule_v2.terraform-secgroup-rule-10250,
|
||||||
|
openstack_networking_secgroup_rule_v2.terraform-secgroup-rule-10254,
|
||||||
|
openstack_networking_secgroup_rule_v2.terraform-secgroup-rule-8472,
|
||||||
|
openstack_compute_floatingip_associate_v2.fip_1
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create a new rancher2 Node Pool
|
||||||
|
resource "rancher2_node_pool" "pool1" {
|
||||||
|
provider = rancher2.admin
|
||||||
|
cluster_id = rancher2_cluster.hsfd-rke-demo.id
|
||||||
|
name = "ctrl-etcd-work"
|
||||||
|
hostname_prefix = "ctrl-etcd-work"
|
||||||
|
node_template_id = rancher2_node_template.hsfd-rancher-openstack.id
|
||||||
|
quantity = 1
|
||||||
|
control_plane = true
|
||||||
|
etcd = true
|
||||||
|
worker = true
|
||||||
|
|
||||||
|
# if instance is gone before deleting the cluster, we'll not be able to
|
||||||
|
# reach rke anymore
|
||||||
|
depends_on = [
|
||||||
|
openstack_compute_instance_v2.terraform-rancher-instance-1,
|
||||||
|
openstack_networking_secgroup_rule_v2.terraform-secgroup-rule-ssh,
|
||||||
|
openstack_networking_secgroup_rule_v2.terraform-secgroup-rule-http,
|
||||||
|
openstack_networking_secgroup_rule_v2.terraform-secgroup-rule-https,
|
||||||
|
openstack_networking_secgroup_rule_v2.terraform-secgroup-rule-2376,
|
||||||
|
openstack_networking_secgroup_rule_v2.terraform-secgroup-rule-2379,
|
||||||
|
openstack_networking_secgroup_rule_v2.terraform-secgroup-rule-2380,
|
||||||
|
openstack_networking_secgroup_rule_v2.terraform-secgroup-rule-6443,
|
||||||
|
openstack_networking_secgroup_rule_v2.terraform-secgroup-rule-9099,
|
||||||
|
openstack_networking_secgroup_rule_v2.terraform-secgroup-rule-10250,
|
||||||
|
openstack_networking_secgroup_rule_v2.terraform-secgroup-rule-10254,
|
||||||
|
openstack_networking_secgroup_rule_v2.terraform-secgroup-rule-8472,
|
||||||
|
openstack_compute_floatingip_associate_v2.fip_1
|
||||||
|
]
|
||||||
|
}
|
20
terraform/rke-terraform/main.tf
Normal file
20
terraform/rke-terraform/main.tf
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# Consider using 'export TF_VAR_os_auth_url=$OS_AUTH_URL'
|
||||||
|
variable "os_auth_url"{}
|
||||||
|
# Consider using 'export TF_VAR_os_password=$OS_PASSWORD'
|
||||||
|
variable "os_password"{}
|
||||||
|
|
||||||
|
module "rke" {
|
||||||
|
source = "remche/rke/openstack"
|
||||||
|
image_name = "Ubuntu 20.04 - Focal Fossa - 64-bit - Cloud Based Image"
|
||||||
|
public_net_name = "public1"
|
||||||
|
master_flavor_name = "m1.small"
|
||||||
|
worker_flavor_name = "m1.small"
|
||||||
|
os_auth_url = var.os_auth_url
|
||||||
|
os_password = var.os_password
|
||||||
|
#use_ssh_agent = false
|
||||||
|
#enable_loadbalancer = true
|
||||||
|
#use_octavia = true
|
||||||
|
wait_for_commands = ["while docker info ; [ $? -ne 0 ]; do echo wait for docker; sudo newgrp - docker ; sleep 30 ; done"]
|
||||||
|
user_data_file = "user-data.sh"
|
||||||
|
dns_servers = [ "192.168.76.253" ]
|
||||||
|
}
|
6
terraform/rke-terraform/user-data.sh
Normal file
6
terraform/rke-terraform/user-data.sh
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#apt-get update
|
||||||
|
#apt-get -y upgrade
|
||||||
|
curl https://releases.rancher.com/install-docker/20.10.sh | sh
|
||||||
|
groupadd docker
|
||||||
|
usermod -aG docker ubuntu
|
11
terraform/rke2-terraform/main.tf
Normal file
11
terraform/rke2-terraform/main.tf
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
module "controlplane" {
|
||||||
|
source = "remche/rke2/openstack"
|
||||||
|
cluster_name = var.cluster_name
|
||||||
|
dns_servers = var.dns_servers
|
||||||
|
write_kubeconfig = true
|
||||||
|
image_name = "Ubuntu 20.04 - Focal Fossa - 64-bit - Cloud Based Image"
|
||||||
|
flavor_name = "m1.medium"
|
||||||
|
public_net_name = "public1"
|
||||||
|
use_ssh_agent = false
|
||||||
|
ssh_key_file = "/root/.ssh/id_rsa"
|
||||||
|
}
|
5
terraform/rke2-terraform/outputs.tf
Normal file
5
terraform/rke2-terraform/outputs.tf
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
output "server_ip" {
|
||||||
|
description = "Server floating IP"
|
||||||
|
value = module.controlplane.floating_ip[0]
|
||||||
|
sensitive = true
|
||||||
|
}
|
9
terraform/rke2-terraform/variables.tf
Normal file
9
terraform/rke2-terraform/variables.tf
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
variable "cluster_name" {
|
||||||
|
type = string
|
||||||
|
default = "minimal"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "dns_servers" {
|
||||||
|
type = list(string)
|
||||||
|
default = ["192.168.76.253"]
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user