# 作問用
```
provider "proxmox" {
pm_tls_insecure = true
pm_api_url = "https://172.16.11.2:8006/api2/json"
pm_password = "aWPBBh6i2"
pm_user = "root@pam"
}
resource "proxmox_vm_qemu" "base-code-abc-1" {
# 問題VMごとに名前を修正してください
name = "base-code-abc-1"
# ベースイメージ(ubuntu-bionic, centos7, vyos)
clone = "centos7"
# コア数、メモリ
cores = 2
memory = 2048
# cloud-init周り
ciuser = "ictsc"
cipassword = "aWPBBh6i2"
ipconfig0 = "ip=192.168.11.1/24,gw=192.168.11.254"
# 問題ごとに割り当てられたVLANタグを使用してください
network {
id = 0
model = "virtio"
bridge = "vmbr1"
tag = "11"
}
# クローンの時は使用されないけどバリデーションの都合上書かないといけないやつ
disk {
id = 0
size = 32
type = "virtio"
storage = "local-lvm"
}
target_node = "pve-dev"
full_clone = "true"
}
# 2台目(必要な場合)
resource "proxmox_vm_qemu" "base-code-abc-2" {
# 問題VMごとに名前を修正してください
name = "base-code-abc-2"
# ベースイメージ(ubuntu-bionic, centos7, vyos)
clone = "ubuntu-bionic"
# コア数、メモリ
cores = 2
memory = 2048
# cloud-init周り
ciuser = "ictsc"
cipassword = "aWPBBh6i2"
ipconfig0 = "ip=192.168.11.2/24,gw=192.168.11.254"
ipconfig1 = "ip=192.168.12.1/24,gw=192.168.11.254"
# 問題ごとに割り当てられたVLANタグを使用してください
network {
id = 0
model = "virtio"
bridge = "vmbr1"
tag = "11"
}
# NICを追加したいときはidをインクリメントしてください
network {
id = 1
model = "virtio"
bridge = "vmbr1"
tag = "12"
}
# クローンの時は使用されないけどバリデーションの都合上書かないといけないやつ
disk {
id = 0
size = 32
type = "virtio"
storage = "local-lvm"
}
target_node = "pve-dev"
full_clone = "true"
}
```
# 展開用
```
provider "proxmox" {
pm_tls_insecure = true
pm_api_url = "https://172.16.11.2:8006/api2/json"
pm_password = "aWPBBh6i2"
pm_user = "root@pam"
}
# Team20は運営テスト用
variable "team" {
default = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 20]
}
resource "proxmox_vm_qemu" "problem1-1" {
count = "${length(var.team)}"
name = "team${format("%02.0f", element(var.team, count.index))}-problem1-1"
target_node = "pve-dev"
full_clone = "false"
clone = "base-code-abc-1"
disk {
id = 0
size = 32
type = "scsi"
storage = "local"
}
network {
id = 0
model = "virtio"
bridge = "vmbr1"
tag = "${11 + element(var.team, count.index) * 100}"
}
}
resource "proxmox_vm_qemu" "problem1-2" {
count = "${length(var.team)}"
name = "team${format("%02.0f", element(var.team, count.index))}-problem1-2"
target_node = "pve-dev"
full_clone = "false"
clone = "base-code-abc-2"
disk {
id = 0
size = 32
type = "scsi"
storage = "local"
}
network {
id = 0
model = "virtio"
bridge = "vmbr1"
tag = "${11 + element(var.team, count.index) * 100}"
}
network {
id = 1
model = "virtio"
bridge = "vmbr1"
tag = "${12 + element(var.team, count.index) * 100}"
}
}
```
---
https://blog.mosuke.tech/entry/2018/06/16/terraform-workspaces/
```terraform {
required_version = ">= 0.12.5"
}
# ubuntu archive
data sakuracloud_archive "ubuntu-archive" {
os_type = "ubuntu"
}
// # VPCルータ本体の定義(スタンダードプランの場合)
// resource sakuracloud_vpc_router "k8s-external-vpc" {
// name = "k8s-external-vpc"
// plan = "standard"
// }
# pub key
resource sakuracloud_ssh_key_gen "key"{
name = "k8s_pubkey"
provisioner "local-exec" {
command = "echo \"${self.private_key}\" > id_rsa; chmod 0600 id_rsa"
}
provisioner "local-exec" {
when = "destroy"
command = "rm -f id_rsa"
}
}
# switch
# global switch
resource sakuracloud_internet "k8s-external-switch" {
name = "k8s-external-switch"
nw_mask_len="${lookup(var.external_subnet, terraform.workspace)}"
}
resource sakuracloud_switch "k8s-internal-switch" {
name = "k8s-internal-switch"
}
// TODO
// resource sakuracloud_switch "nfs-internal-switch" {
// name = "nfs-internal-switch"
// }
# disks
resource sakuracloud_disk "k8s-master-disk" {
count = "${lookup(var.master, terraform.workspace)}"
name = "k8s-master-${count.index}-${terraform.workspace}"
source_archive_id = "${data.sakuracloud_archive.ubuntu-archive.id}"
size = tonumber("${lookup(var.master_disk, terraform.workspace)}")
tags = ["k8s"]
}
resource sakuracloud_disk "k8s-node-disk" {
count = "${lookup(var.node, terraform.workspace)}"
name = "k8s-node-${count.index}-${terraform.workspace}"
source_archive_id = "${data.sakuracloud_archive.ubuntu-archive.id}"
size = tonumber("${lookup(var.node_disk, terraform.workspace)}")
tags = ["k8s"]
}
resource sakuracloud_disk "k8s-lb-disk" {
count = "${lookup(var.lb, terraform.workspace)}"
name = "k8s-lb-${count.index}-${terraform.workspace}"
source_archive_id = "${data.sakuracloud_archive.ubuntu-archive.id}"
size = tonumber("${lookup(var.lb_disk, terraform.workspace)}")
tags = ["k8s"]
}
# servers
resource sakuracloud_server "k8s-master-server" {
count = "${lookup(var.master, terraform.workspace)}"
name = "k8s-master-${count.index + 1}-server-${terraform.workspace}"
hostname = "k8s-master-${count.index + 1}-server-${terraform.workspace}"
core = "${lookup(var.master_cpu, terraform.workspace)}"
memory = "${lookup(var.master_mem, terraform.workspace)}"
disks = ["${sakuracloud_disk.k8s-master-disk[count.index].id}"]
nic = "${sakuracloud_internet.k8s-external-switch.switch_id}"
additional_nics = ["${sakuracloud_switch.k8s-internal-switch.id}"]
additional_display_ipaddresses = ["192.168.100.1${count.index}"]
ssh_key_ids = ["${sakuracloud_ssh_key_gen.key.id}"]
password = "PUT_YOUR_PASSWORD_HERE"
tags = ["k8s"]
ipaddress = "${sakuracloud_internet.k8s-external-switch.ipaddresses[count.index]}"
gateway = "${sakuracloud_internet.k8s-external-switch.gateway}"
nw_mask_len = "${lookup(var.external_subnet, terraform.workspace)}"
connection {
type = "ssh"
user = "ubuntu"
host = "${self.ipaddress}"
private_key = "${sakuracloud_ssh_key_gen.key.private_key}"
}
provisioner "remote-exec" {
# write password mean for the sake of ansible used
# todo: must better use cloudinit or packer initialize.
inline = [
"echo ${self.password} |sudo -S sed -i 's/^#PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config",
"sudo systemctl restart sshd.service",
"echo Success",
"sudo ip link set eth1 up",
"sudo ip addr add ${self.additional_display_ipaddresses[0]}/24 dev eth1"
]
}
}
resource sakuracloud_server "k8s-node-server" {
count = "${lookup(var.node, terraform.workspace)}"
name = "k8s-node-${count.index + 1}-server-${terraform.workspace}"
hostname = "k8s-node-${count.index + 1}-server-${terraform.workspace}"
core = "${lookup(var.node_cpu, terraform.workspace)}"
memory = "${lookup(var.node_mem, terraform.workspace)}"
disks = ["${sakuracloud_disk.k8s-node-disk[count.index].id}"]
nic = "${sakuracloud_internet.k8s-external-switch.switch_id}"
additional_nics = ["${sakuracloud_switch.k8s-internal-switch.id}"]
additional_display_ipaddresses = ["192.168.100.2${count.index}"]
ssh_key_ids = ["${sakuracloud_ssh_key_gen.key.id}"]
password = "PUT_YOUR_PASSWORD_HERE"
tags = ["k8s"]
ipaddress = "${sakuracloud_internet.k8s-external-switch.ipaddresses[count.index + lookup(var.master, terraform.workspace)]}"
gateway = "${sakuracloud_internet.k8s-external-switch.gateway}"
nw_mask_len = "${lookup(var.external_subnet, terraform.workspace)}"
connection {
type = "ssh"
user = "ubuntu"
host = "${self.ipaddress}"
private_key = "${sakuracloud_ssh_key_gen.key.private_key}"
}
provisioner "remote-exec" {
# write password mean for the sake of ansible used
# todo: must better use cloudinit or packer initialize.
inline = [
"echo ${self.password} |sudo -S sed -i 's/^#PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config",
"sudo systemctl restart sshd.service",
"echo Success",
"sudo ip link set eth1 up",
"sudo ip addr add ${self.additional_display_ipaddresses[0]}/24 dev eth1"
]
}
}
resource sakuracloud_server "k8s-lb-server" {
count = "${lookup(var.lb, terraform.workspace)}"
name = "k8s-lb-${count.index + 1}-server-${terraform.workspace}"
hostname = "k8s-lb-${count.index + 1}-server-${terraform.workspace}"
core = "${lookup(var.lb_cpu, terraform.workspace)}"
memory = "${lookup(var.lb_mem, terraform.workspace)}"
disks = ["${sakuracloud_disk.k8s-lb-disk[count.index].id}"]
nic = "${sakuracloud_internet.k8s-external-switch.switch_id}"
additional_nics = ["${sakuracloud_switch.k8s-internal-switch.id}"]
additional_display_ipaddresses = ["192.168.100.3${count.index}"]
ssh_key_ids = ["${sakuracloud_ssh_key_gen.key.id}"]
password = "PUT_YOUR_PASSWORD_HERE"
tags = ["k8s"]
ipaddress = "${sakuracloud_internet.k8s-external-switch.ipaddresses[count.index+ lookup(var.master, terraform.workspace)+ lookup(var.node, terraform.workspace)]}"
gateway = "${sakuracloud_internet.k8s-external-switch.gateway}"
nw_mask_len = "${lookup(var.external_subnet, terraform.workspace)}"
connection {
type = "ssh"
user = "ubuntu"
host = "${self.ipaddress}"
private_key = "${sakuracloud_ssh_key_gen.key.private_key}"
}
provisioner "remote-exec" {
# write password mean for the sake of ansible used
# todo: must better use cloudinit or packer initialize.
inline = [
"echo ${self.password} |sudo -S sed -i 's/^#PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config",
"sudo systemctl restart sshd.service",
"echo Success",
"sudo ip link set eth1 up",
"sudo ip addr add ${self.additional_display_ipaddresses[0]}/24 dev eth1",
"sudo sysctl net.ipv4.ip_nonlocal_bind=1"
]
}
}
// # output
output "k8s_master_server_ipaddress"{
value = sakuracloud_server.k8s-master-server.*.ipaddress
}
output "k8s_lb_server_ipaddress"{
value = sakuracloud_server.k8s-lb-server.*.ipaddress
}
output "k8s_node_server_ipaddress"{
value = sakuracloud_server.k8s-node-server.*.ipaddress
}
output "public_address_list"{
value = "${sakuracloud_internet.k8s-external-switch.ipaddresses}"
}
```
terrform workspace select dev
```
variable "external_subnet" {
type = "map"
default = {
tmp = "28"
dev = "27"
prd = "27"
}
}
variable "master" {
type = "map"
default = {
tmp = "1"
dev = "3"
prd = "3"
}
}
variable "master_cpu" {
type = "map"
default = {
tmp = "2"
dev = "8"
prd = "8"
}
}
variable "master_mem" {
type = "map"
default = {
tmp = "2"
dev = "16"
prd = "16"
}
}
variable "master_disk" {
type = "map"
default = {
tmp = "20"
dev = "100"
prd = "100"
}
}
variable "node" {
type = "map"
default = {
tmp = "3"
dev = "3"
prd = "3"
}
}
variable "node_cpu" {
type = "map"
default = {
tmp = "2"
dev = "8"
prd = "8"
}
}
variable "node_mem" {
type = "map"
default = {
tmp = "2"
dev = "16"
prd = "16"
}
}
variable "node_disk" {
type = "map"
default = {
tmp = "20"
dev = "100"
prd = "100"
}
}
variable "lb" {
type = "map"
default = {
tmp = "0"
dev = "2"
prd = "2"
}
}
variable "lb_cpu" {
type = "map"
default = {
tmp = "0"
dev = "2"
prd = "4"
}
}
variable "lb_mem" {
type = "map"
default = {
tmp = "0"
dev = "2"
prd = "4"
}
}
variable "lb_disk" {
type = "map"
default = {
tmp = "0"
dev = "20"
prd = "20"
}
}
```