diff --git a/VMsetup/vmtemplate.yaml b/VMsetup/vmtemplate.yaml new file mode 100644 index 0000000..763cc1b --- /dev/null +++ b/VMsetup/vmtemplate.yaml @@ -0,0 +1,211 @@ +heat_template_version: 2013-05-23 + +description: > + HOT template to create a new neutron network plus a router to the public + network, and for deploying two Windows 11 (hostname cl1 and mgr) and two Windows + Servers (hostnames dc1 and srv1) without any configuration (only cl1 has + a boot script to set correct hostname). + +parameters: + key_name: + type: string + description: Name of keypair to assign to servers + +resources: + private_net: + type: OS::Neutron::Net + + private_subnet: + type: OS::Neutron::Subnet + properties: + network_id: { get_resource: private_net } + cidr: 192.168.111.0/24 + gateway_ip: 192.168.111.1 + allocation_pools: + - start: 192.168.111.101 + end: 192.168.111.200 + + router: + type: OS::Neutron::Router + properties: + external_gateway_info: + network: ntnu-internal + + router_interface: + type: OS::Neutron::RouterInterface + properties: + router_id: { get_resource: router } + subnet_id: { get_resource: private_subnet } + + sec_core: + type: OS::Neutron::SecurityGroup + properties: + description: Security group rules for all + name: sec_core + rules: + - remote_ip_prefix: 0.0.0.0/0 + protocol: icmp + - remote_ip_prefix: 0.0.0.0/0 + protocol: tcp + port_range_min: 22 + port_range_max: 22 + - remote_ip_prefix: 0.0.0.0/0 + protocol: tcp + port_range_min: 80 + port_range_max: 80 + - remote_ip_prefix: 0.0.0.0/0 + protocol: tcp + port_range_min: 443 + port_range_max: 443 + - remote_ip_prefix: 0.0.0.0/0 + protocol: tcp + port_range_min: 3389 + port_range_max: 3389 + + mgr: + type: OS::Nova::Server + properties: + name: mgr + image: 'Windows 11 22H2 Enterprise [Evaluation]' + flavor: gx3.4c8r + key_name: { get_param: key_name } + networks: + - port: { get_resource: mgr_port } + user_data_format: RAW + user_data: | + #ps1_sysnative + # + # Windows 10 doesn't set hostname correctly + # + $name = (New-Object System.Net.WebClient).DownloadString("http://169.254.169.254/latest/meta-data/hostname") + $shortname = $name.split('.',2)[0] + if ( $env:computername -ne $shortname ) { + Rename-Computer $shortname + exit 1003 # 1003 - reboot and run the plugin again on next boot + # https://cloudbase-init.readthedocs.io/en/latest/tutorial.html#file-execution + } + mgr_port: + type: OS::Neutron::Port + properties: + network_id: { get_resource: private_net } + security_groups: + - default + - { get_resource: sec_core } + fixed_ips: + - subnet_id: { get_resource: private_subnet } + mgr_floating_ip: + type: OS::Neutron::FloatingIP + properties: + floating_network: ntnu-internal + port_id: { get_resource: mgr_port } + + cl1: + type: OS::Nova::Server + properties: + name: cl1 + image: 'Windows 11 22H2 Enterprise [Evaluation]' + flavor: gx1.2c6r + key_name: { get_param: key_name } + networks: + - port: { get_resource: cl1_port } + user_data_format: RAW + user_data: | + #ps1_sysnative + # + # Windows 10 doesn't set hostname correctly + # + $name = (New-Object System.Net.WebClient).DownloadString("http://169.254.169.254/latest/meta-data/hostname") + $shortname = $name.split('.',2)[0] + if ( $env:computername -ne $shortname ) { + Rename-Computer $shortname + exit 1003 # 1003 - reboot and run the plugin again on next boot + # https://cloudbase-init.readthedocs.io/en/latest/tutorial.html#file-execution + } + cl1_port: + type: OS::Neutron::Port + properties: + network_id: { get_resource: private_net } + security_groups: + - default + - { get_resource: sec_core } + fixed_ips: + - subnet_id: { get_resource: private_subnet } + cl1_floating_ip: + type: OS::Neutron::FloatingIP + properties: + floating_network: ntnu-internal + port_id: { get_resource: cl1_port } + + dc1: + type: OS::Nova::Server + properties: + name: dc1 + image: 'Windows Server 2025 Standard [Evaluation]' + flavor: gx1.2c6r + key_name: { get_param: key_name } + networks: + - port: { get_resource: dc1_port } + dc1_port: + type: OS::Neutron::Port + properties: + network_id: { get_resource: private_net } + security_groups: + - default + - { get_resource: sec_core } + fixed_ips: + - subnet_id: { get_resource: private_subnet } + dc1_floating_ip: + type: OS::Neutron::FloatingIP + properties: + floating_network: ntnu-internal + port_id: { get_resource: dc1_port } + + srv1: + type: OS::Nova::Server + properties: + name: srv1 + image: 'Windows Server 2025 Standard [Evaluation]' + flavor: gx1.2c4r + key_name: { get_param: key_name } + networks: + - port: { get_resource: srv1_port } + srv1_port: + type: OS::Neutron::Port + properties: + network_id: { get_resource: private_net } + security_groups: + - default + - { get_resource: sec_core } + fixed_ips: + - subnet_id: { get_resource: private_subnet } + srv1_floating_ip: + type: OS::Neutron::FloatingIP + properties: + floating_network: ntnu-internal + port_id: { get_resource: srv1_port } + +outputs: + srv1_private_ip: + description: IP address of srv1 in private network + value: { get_attr: [ srv1, first_address ] } + srv1_public_ip: + description: Floating IP address of srv1 in public network + value: { get_attr: [ srv1_floating_ip, floating_ip_address ] } + dc1_private_ip: + description: IP address of dc1 in private network + value: { get_attr: [ dc1, first_address ] } + dc1_public_ip: + description: Floating IP address of dc1 in public network + value: { get_attr: [ dc1_floating_ip, floating_ip_address ] } + cl1_private_ip: + description: IP address of cl1 in private network + value: { get_attr: [ cl1, first_address ] } + cl1_public_ip: + description: Floating IP address of cl1 in public network + value: { get_attr: [ cl1_floating_ip, floating_ip_address ] } + mgr_private_ip: + description: IP address of mgr in private network + value: { get_attr: [ mgr, first_address ] } + mgr_public_ip: + description: Floating IP address of mgr in public network + value: { get_attr: [ mgr_floating_ip, floating_ip_address ] } \ No newline at end of file