Browse Source

windows lab install

main
Nicolas Massé 5 years ago
parent
commit
181e227a6b
  1. 11
      windows/ansible/prepare.yaml
  2. 3
      windows/ansible/requirements.yml
  3. 51
      windows/main.tf
  4. 13
      windows/network.tf
  5. 46
      windows/packer/README.md
  6. 3
      windows/provider.tf
  7. 18
      windows/templates/inventory
  8. 0
      windows/terraform.tfvars
  9. 40
      windows/variables.tf
  10. 32
      windows/windows.tf

11
windows/ansible/prepare.yaml

@ -0,0 +1,11 @@
- name: Sample playbook
hosts: all
gather_facts: no
tasks:
- name: Wait for the WinRM port to open
wait_for:
port: '{{ ansible_port }}'
host: '{{ ansible_host }}'
delegate_to: localhost
- win_ping:

3
windows/ansible/requirements.yml

@ -0,0 +1,3 @@
collections: []
#- win.collection1
#- win.collection2

51
windows/main.tf

@ -0,0 +1,51 @@
terraform {
required_version = ">= 0.13"
required_providers {
libvirt = {
source = "dmacvicar/libvirt"
version = ">=0.6.3"
}
local = {
source = "hashicorp/local"
version = ">=2.0.0"
}
template = {
source = "hashicorp/template"
version = ">=2.2.0"
}
}
}
locals {
windows_machines = { for i in libvirt_domain.win_machine : i.name => i.network_interface.0.addresses[0] }
}
output "machines" {
value = local.windows_machines
}
resource "local_file" "ansible-inventory" {
content = templatefile("${path.module}/templates/inventory", { windows_machines = local.windows_machines, network_domain = var.network_domain })
filename = "ansible/inventory"
file_permission = "0644"
provisioner "local-exec" {
working_dir = "${path.module}/ansible"
command = <<EOT
set -e
ansible-galaxy install -r requirements.yml
ansible-playbook -i inventory prepare.yaml -e tf_action=start
EOT
}
provisioner "local-exec" {
working_dir = "${path.module}/ansible"
when = destroy
command = <<EOT
set -e
ansible-playbook -i inventory prepare.yaml -e tf_action=stop
EOT
}
}

13
windows/network.tf

@ -0,0 +1,13 @@
resource "libvirt_network" "lab_net" {
name = var.network_name
mode = "nat"
domain = var.network_domain
addresses = [var.network_ip_range]
autostart = true
dns {
enabled = true
}
dhcp {
enabled = true
}
}

46
windows/packer/README.md

@ -0,0 +1,46 @@
# Windows 10 unattended install with packer
## Prerequisites
* CentOS Stream 8
## Installation
Install packer.
```sh
cat > hashicorp.repo <<"EOF"
[hashicorp]
name=Hashicorp Stable - $basearch
baseurl=https://rpm.releases.hashicorp.com/RHEL/8/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://rpm.releases.hashicorp.com/gpg
EOF
sudo dnf config-manager --add-repo hashicorp.repo
sudo dnf -y install packer
```
Install Qemu / KVM.
```sh
sudo dnf install qemu-kvm
```
## Build
Fetch the Qemu Guest tools.
```sh
curl -Lo virtio-win.iso https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
```
```sh
sudo /usr/bin/packer build windows_10.json
```
Store the built image in the libvirt default pool.
```sh
sudo cp windows_10-qemu/windows_10 /var/lib/libvirt/images/windows-10.qcow2
```

3
windows/provider.tf

@ -0,0 +1,3 @@
provider "libvirt" {
uri = "qemu:///system"
}

18
windows/templates/inventory

@ -0,0 +1,18 @@
[windows]
%{for host, ip in windows_machines~}
${host}.${network_domain} ansible_host=${ip}
%{endfor~}
[windows:vars]
ansible_user=vagrant
ansible_password=vagrant
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore
# HTTP
ansible_winrm_scheme=http
ansible_port=5985
# HTTPS
#ansible_winrm_scheme=https
#ansible_port=5986

0
windows/terraform.tfvars

40
windows/variables.tf

@ -0,0 +1,40 @@
variable "windows_machine_count" {
type = number
default = 1
}
variable "pool_name" {
type = string
default = "default"
}
variable "volume_format" {
type = string
default = "qcow2"
}
variable "windows_hostname_format" {
type = string
default = "win-%02d"
}
variable "windows_image" {
type = string
default = "windows-10"
}
variable "network_name" {
type = string
default = "lab"
}
variable "network_domain" {
type = string
default = "sample.lab"
}
variable "network_ip_range" {
type = string
default = "10.10.0.0/24"
}

32
windows/windows.tf

@ -0,0 +1,32 @@
resource "libvirt_volume" "win_disk" {
name = "${format(var.windows_hostname_format, count.index + 1)}.${var.volume_format}"
count = var.windows_machine_count
format = var.volume_format
pool = var.pool_name
base_volume_name = "${var.windows_image}.${var.volume_format}"
}
resource "libvirt_domain" "win_machine" {
count = var.windows_machine_count
name = format(var.windows_hostname_format, count.index + 1)
vcpu = "2"
memory = "2048"
cpu = {
mode = "host-passthrough"
}
disk {
volume_id = element(libvirt_volume.win_disk.*.id, count.index)
}
network_interface {
network_id = libvirt_network.lab_net.id
hostname = format(var.windows_hostname_format, count.index + 1)
# When creating the domain resource, wait until the network interface gets
# a DHCP lease from libvirt, so that the computed IP addresses will be
# available when the domain is up and the plan applied.
wait_for_lease = true
}
}
Loading…
Cancel
Save