1
1
resource "tls_private_key" "ssh" {
2
- algorithm = " ED25519"
2
+ # For Windows instances, AWS enforces RSA, and disallows ed25519 ¯\_(ツ)_/¯
3
+ algorithm = " RSA"
4
+ rsa_bits = 4096
3
5
}
4
6
5
7
resource "aws_key_pair" "ssh" {
@@ -8,31 +10,52 @@ resource "aws_key_pair" "ssh" {
8
10
}
9
11
10
12
locals {
11
- default_node_config = {
13
+ default_node_config = merge ({
14
+ os_type = " linux"
15
+ volume = { size = 20 }
16
+ }, {
12
17
x86_64 = { instance_type = " t3a.small" }
13
18
arm64 = { instance_type = " t4g.small" }
14
- }[var . os . arch ]
19
+ }[var . os . arch ])
15
20
16
- node_roles = {
21
+ node_role_templates = {
17
22
controller = {
18
- count = var.controller_num_nodes
19
- is_controller = true , is_worker = false ,
20
- node_config = merge (local. default_node_config , var. os . node_configs . default , var. os . node_configs . controller )
23
+ data = {
24
+ count = var.controller_num_nodes
25
+ is_controller = true , is_worker = false ,
26
+ }
27
+ sources = [for s in [var . os . node_configs . controller , var . os . node_configs . default ]: s if s != null ]
21
28
}
22
29
23
30
" controller+worker" = {
24
- count = var.controller_worker_num_nodes
25
- is_controller = true , is_worker = true ,
26
- node_config = merge (local. default_node_config , var. os . node_configs . default , var. os . node_configs . worker , var. os . node_configs . controller_worker )
31
+ data = {
32
+ count = var.controller_worker_num_nodes
33
+ is_controller = true , is_worker = true ,
34
+ }
35
+ sources = [for s in [var . os . node_configs . controller_worker , var . os . node_configs . worker , var . os . node_configs . default ]: s if s != null ]
27
36
}
28
37
29
38
worker = {
30
- count = var.worker_num_nodes
31
- is_controller = false , is_worker = true ,
32
- node_config = merge (local. default_node_config , var. os . node_configs . default , var. os . node_configs . worker )
39
+ data = {
40
+ count = var.worker_num_nodes
41
+ is_controller = false , is_worker = true ,
42
+ }
43
+ sources = [for s in [var . os . node_configs . worker , var . os . node_configs . default ]: s if s != null ]
33
44
}
34
45
}
35
46
47
+ node_roles = { for role , tmpl in local . node_role_templates : role => merge (tmpl. data , {
48
+ node_config = {
49
+ ami_id = coalesce (tmpl. sources . * . ami_id ... )
50
+ instance_type = coalesce (concat (tmpl. sources , [local . default_node_config ]). * . instance_type ... )
51
+ os_type = coalesce (concat (tmpl. sources , [local . default_node_config ]). * . os_type ... )
52
+ volume = coalesce (concat (tmpl. sources , [local . default_node_config ]). * . volume ... )
53
+ user_data = try (coalesce (tmpl. sources . * . user_data ... ), null )
54
+ ready_script = try (coalesce (tmpl. sources . * . ready_script ... ), null )
55
+ connection = coalesce (tmpl. sources . * . connection ... )
56
+ }
57
+ })}
58
+
36
59
nodes = merge ([for role , params in local . node_roles : {
37
60
for idx in range (params. count ) : " ${ role } -${ idx + 1 } " => {
38
61
role = role
@@ -68,19 +91,20 @@ resource "aws_instance" "nodes" {
68
91
69
92
root_block_device {
70
93
volume_type = " gp2"
71
- volume_size = 20
94
+ volume_size = each . value . node_config . volume . size
72
95
}
73
96
}
74
97
75
98
resource "terraform_data" "ready_scripts" {
76
99
for_each = { for name , params in local . nodes : name => params if params . node_config . ready_script != null }
77
100
78
101
connection {
79
- type = each. value . node_config . connection . type
80
- user = each. value . node_config . connection . username
81
- private_key = tls_private_key. ssh . private_key_pem
82
- host = aws_instance. nodes [each . key ]. public_ip
83
- agent = false
102
+ type = each. value . node_config . connection . type
103
+ user = each. value . node_config . connection . username
104
+ target_platform = each. value . node_config . os_type == " windows" ? " windows" : " unix"
105
+ private_key = tls_private_key. ssh . private_key_pem
106
+ host = aws_instance. nodes [each . key ]. public_ip
107
+ agent = false
84
108
}
85
109
86
110
provisioner "remote-exec" {
@@ -93,10 +117,11 @@ resource "terraform_data" "provisioned_nodes" {
93
117
94
118
input = [for node in aws_instance . nodes : {
95
119
name = node.tags.Name,
96
- ipv4 = node.public_ip ,
120
+ os_type = local.nodes[ node.tags[ " ostests.k0sproject.io/node-name " ]].node_config.os_type ,
97
121
role = node.tags[" k0sctl.k0sproject.io/host-role" ]
98
122
is_controller = local.nodes[node.tags[" ostests.k0sproject.io/node-name" ]].is_controller
99
123
is_worker = local.nodes[node.tags[" ostests.k0sproject.io/node-name" ]].is_worker
124
+ ipv4 = node.public_ip,
100
125
connection = local.nodes[node.tags[" ostests.k0sproject.io/node-name" ]].node_config.connection
101
126
}]
102
127
}
0 commit comments