510 lines
15 KiB
Markdown
510 lines
15 KiB
Markdown
# Hyper-V Automation Project - Handoff Document
|
|
|
|
**Date**: 2026-04-29
|
|
**Status**: Development - Core provisioning implemented
|
|
**Next Session**: Ready for Hyper-V host setup and VM testing
|
|
|
|
## Project Overview
|
|
|
|
Enterprise-grade automation for Windows Server VM lifecycle management on Hyper-V using Ansible Automation Platform. Demonstrates GitOps and Infrastructure as Code principles for demo/lab environments.
|
|
|
|
**Primary Use Case**: Automated VM provisioning with unattended Windows installation
|
|
|
|
**Target Environment**: Demo/Lab (not production-hardened)
|
|
|
|
## Current State
|
|
|
|
### ✅ Completed
|
|
|
|
1. **Project Structure**
|
|
- Integrated with toallab standard inventory (`/home/ptoal/Dev/inventories/toallab-inventory`)
|
|
- Group variables organized (hyperv, windows_servers, web_servers)
|
|
- Host variables configured for hyperv1.lan.toal.ca (192.168.1.182)
|
|
- Collections requirements defined
|
|
|
|
2. **Hyper-V Host Provisioning** ⭐ NEW
|
|
- Playbook: `playbooks/provision-hyperv-host.yml`
|
|
- Installs Hyper-V role and management tools
|
|
- Creates storage structure (D:\VMs, D:\ISOs, D:\Templates)
|
|
- Configures virtual switches (External-NAT, Internal-Lab)
|
|
- Sets up NAT networking (192.168.100.0/24)
|
|
- Hardens WinRM with HTTPS listener
|
|
- Demo-optimized settings (power, firewall, etc.)
|
|
|
|
3. **VM Provisioning Workflow**
|
|
- Playbook: `playbooks/provision-vm.yml`
|
|
- Creates VMs with configurable resources (CPU, RAM, disk)
|
|
- Generates autounattend.xml for unattended Windows installation
|
|
- Validates virtual switch availability
|
|
- Supports tags for selective execution (create/install/verify)
|
|
- Idempotent operations
|
|
- AAP-ready with survey support
|
|
|
|
4. **Templates**
|
|
- `templates/autounattend.xml.j2` - Complete Windows unattended install
|
|
- Configures: network, WinRM, RDP, computer name, timezone, admin password
|
|
- Static IP or DHCP support
|
|
- First-logon commands for Ansible readiness
|
|
|
|
5. **Helper Playbooks**
|
|
- `playbooks/list-hyperv-switches.yml` - Discover available switches
|
|
- `playbooks/create-autounattend-iso.yml` - Helper for ISO creation
|
|
- `playbooks/install-iis.yml` - IIS deployment demo (existing)
|
|
- `playbooks/patch-vms.yml` - Windows Update automation (existing)
|
|
|
|
6. **Documentation**
|
|
- `QUICKSTART.md` - Complete step-by-step guide from scratch
|
|
- `playbooks/README-provision.md` - Detailed VM provisioning guide
|
|
- `CLAUDE.md` - Architecture and development guidelines
|
|
- `README.md` - Project overview
|
|
|
|
### ⚠️ Known Issues / Limitations
|
|
|
|
1. **Virtual Switch Discovery**
|
|
- Fixed: Playbook now validates switches before VM creation
|
|
- Default switch changed from "Internal Switch" → "External-NAT"
|
|
- Run `list-hyperv-switches.yml` to see available switches
|
|
|
|
2. **AutoUnattend.xml Delivery**
|
|
- Currently requires manual intervention or helper playbook
|
|
- Windows Setup needs to find autounattend.xml (second DVD drive, floppy, or custom ISO)
|
|
- Helper playbook provided but requires Windows ADK on host
|
|
|
|
3. **Circular Variable References**
|
|
- Fixed: Moved variable defaults from `vars:` to `set_fact` in `pre_tasks`
|
|
- Variables now compute correctly with extra vars or group_vars fallbacks
|
|
|
|
4. **WinRM Configuration**
|
|
- Currently using NTLM over HTTP (port 5985) for hyperv1.lan.toal.ca
|
|
- Demo-appropriate but not production-ready
|
|
- Host provisioning playbook sets up HTTPS for new hosts
|
|
|
|
### 🔄 In Progress
|
|
|
|
- **Testing**: Hyper-V host provisioning playbook not yet tested on actual host
|
|
- **VM Provisioning**: Ready to test once host is configured
|
|
- **AutoUnattend ISO**: Helper playbook exists but untested
|
|
|
|
### ❌ Not Yet Implemented
|
|
|
|
1. **Windows Baseline Configuration** (future role)
|
|
- Security hardening
|
|
- Monitoring agent installation
|
|
- Compliance scanning
|
|
|
|
2. **ServiceNow CMDB Integration**
|
|
- Playbook exists (`sync-cmdb.yml`) but needs implementation
|
|
- Requires ServiceNow credentials and table configuration
|
|
|
|
3. **Custom Execution Environment**
|
|
- Currently using `aap.toal.ca/ee-demo`
|
|
- Could build project-specific EE with all dependencies
|
|
|
|
4. **Event-Driven Ansible**
|
|
- Phase 3 enhancement
|
|
- React to Hyper-V events, ServiceNow incidents, etc.
|
|
|
|
5. **VM Templates**
|
|
- Sysprep and convert base VM to reusable template
|
|
- Faster provisioning than full install
|
|
|
|
## Inventory Configuration
|
|
|
|
### Hypervisor
|
|
|
|
**Host**: `hyperv1.lan.toal.ca`
|
|
**IP**: `192.168.1.182`
|
|
**Connection**: WinRM over HTTP (NTLM auth, port 5985)
|
|
**Group**: `hyperv`
|
|
|
|
**Inventory Location**: `/home/ptoal/Dev/inventories/toallab-inventory/static.yml`
|
|
|
|
```yaml
|
|
hyperv:
|
|
hosts:
|
|
hyperv1.lan.toal.ca:
|
|
ansible_host: 192.168.1.182
|
|
```
|
|
|
|
### Group Variables
|
|
|
|
**Location**: `/home/ptoal/Dev/inventories/toallab-inventory/group_vars/`
|
|
|
|
**hyperv/vars.yml**:
|
|
```yaml
|
|
default_vm_cpu_count: 2
|
|
default_vm_memory_gb: 4
|
|
default_vm_disk_size_gb: 60
|
|
default_vm_switch: "External-NAT" # Changed from "Internal Switch"
|
|
vm_storage_path: "D:\\VMs"
|
|
iso_storage_path: "D:\\ISOs"
|
|
windows_server_iso: "D:\\ISOs\\Windows_Server_2022.iso"
|
|
```
|
|
|
|
**windows_servers/vars.yml**:
|
|
- Windows Update categories
|
|
- DNS servers
|
|
- Timezone settings
|
|
- Features to remove
|
|
|
|
**web_servers/vars.yml**:
|
|
- IIS features list
|
|
- Application pool settings
|
|
- Website configuration
|
|
|
|
### Host Variables
|
|
|
|
**hyperv1.lan.toal.ca/vars.yml**:
|
|
```yaml
|
|
ansible_connection: winrm
|
|
ansible_winrm_transport: ntlm
|
|
ansible_winrm_server_cert_validation: ignore
|
|
ansible_port: 5985
|
|
```
|
|
|
|
## Next Steps
|
|
|
|
### Immediate (Next Session)
|
|
|
|
1. **Configure Hyper-V Host** (if fresh install)
|
|
```bash
|
|
source ~/.venv/ansible/bin/activate
|
|
cd /home/ptoal/Dev/Projects/HyperV
|
|
|
|
# Test connectivity
|
|
ansible hyperv -m ansible.windows.win_ping
|
|
|
|
# Configure host
|
|
ansible-playbook playbooks/provision-hyperv-host.yml
|
|
|
|
# Verify switches
|
|
ansible-playbook playbooks/list-hyperv-switches.yml
|
|
```
|
|
|
|
2. **Upload Windows Server ISO**
|
|
- Copy ISO to D:\ISOs\Windows_Server_2022.iso on Hyper-V host
|
|
- Or download directly on host
|
|
- Verify path matches `windows_server_iso` in group_vars
|
|
|
|
3. **Test VM Provisioning**
|
|
```bash
|
|
# Provision first test VM
|
|
ansible-playbook playbooks/provision-vm.yml \
|
|
-e vm_name=TEST01 \
|
|
-e vm_ip_address=192.168.100.10
|
|
|
|
# Monitor installation via Hyper-V console
|
|
# Wait for WinRM to become available (~20-30 min)
|
|
|
|
# Test connectivity
|
|
ansible TEST01 -i "192.168.100.10," -m ansible.windows.win_ping
|
|
```
|
|
|
|
4. **Add VM to Inventory**
|
|
```bash
|
|
vi /home/ptoal/Dev/inventories/toallab-inventory/static.yml
|
|
# Add under web_servers or appropriate group
|
|
```
|
|
|
|
5. **Test Application Deployment**
|
|
```bash
|
|
# Deploy IIS
|
|
ansible-playbook playbooks/install-iis.yml --limit TEST01
|
|
|
|
# Verify
|
|
curl http://192.168.100.10
|
|
```
|
|
|
|
### Short Term (Next Few Sessions)
|
|
|
|
1. **Resolve AutoUnattend Delivery**
|
|
- Test `create-autounattend-iso.yml` helper
|
|
- OR: Create custom Windows ISO with embedded autounattend.xml
|
|
- OR: Document manual second-DVD-drive approach
|
|
- Update provisioning playbook with working method
|
|
|
|
2. **Create Windows Baseline Role**
|
|
```
|
|
roles/windows_baseline/
|
|
├── tasks/
|
|
│ ├── main.yml
|
|
│ ├── security.yml
|
|
│ ├── monitoring.yml
|
|
│ └── compliance.yml
|
|
├── templates/
|
|
└── defaults/
|
|
```
|
|
- Security hardening (CIS benchmarks subset)
|
|
- Time sync with domain/NTP
|
|
- Windows Update configuration
|
|
- Logging and auditing
|
|
- Monitoring agent (if available)
|
|
|
|
3. **Implement ServiceNow CMDB Sync**
|
|
- Test ServiceNow API connectivity
|
|
- Implement `sync-cmdb.yml` playbook
|
|
- Create/update CI records
|
|
- Sync on VM create/update/delete
|
|
|
|
4. **Test Workflow in AAP**
|
|
- Create job templates with surveys
|
|
- Test webhook integration
|
|
- Create workflow template (provision → baseline → deploy → CMDB)
|
|
|
|
### Medium Term
|
|
|
|
1. **VM Template Creation**
|
|
- Build golden image VM
|
|
- Sysprep and generalize
|
|
- Convert to template/library
|
|
- Create playbook to clone from template (faster than full install)
|
|
|
|
2. **Backup and Recovery**
|
|
- Hyper-V checkpoint management playbook
|
|
- Export/import VM playbooks
|
|
- Backup scheduling
|
|
|
|
3. **Network Configuration**
|
|
- VLAN tagging playbooks
|
|
- Multiple NIC configuration
|
|
- DNS/DHCP integration
|
|
|
|
4. **Application Deployment**
|
|
- Expand beyond IIS demo
|
|
- SQL Server installation role
|
|
- Custom application deployment patterns
|
|
|
|
### Long Term (Future Phases)
|
|
|
|
1. **Event-Driven Ansible**
|
|
- ServiceNow incident → remediation playbook
|
|
- Hyper-V event monitoring → capacity management
|
|
- Windows Event Log → security response
|
|
|
|
2. **Multi-Host Hyper-V**
|
|
- Cluster configuration
|
|
- Live migration support
|
|
- Shared storage
|
|
|
|
3. **Advanced Features**
|
|
- Nested virtualization
|
|
- Container deployment on Windows VMs
|
|
- Azure Arc integration
|
|
|
|
## Key Files Reference
|
|
|
|
### Playbooks
|
|
```
|
|
playbooks/
|
|
├── provision-hyperv-host.yml # Configure Hyper-V host (one-time)
|
|
├── provision-vm.yml # Create Windows VMs
|
|
├── list-hyperv-switches.yml # Discover switches
|
|
├── create-autounattend-iso.yml # AutoUnattend helper
|
|
├── install-iis.yml # IIS deployment
|
|
├── patch-vms.yml # Windows Updates
|
|
└── sync-cmdb.yml # ServiceNow (stub)
|
|
```
|
|
|
|
### Configuration
|
|
```
|
|
ansible.cfg # Points to toallab-inventory
|
|
collections/requirements.yml # Required collections
|
|
templates/autounattend.xml.j2 # Windows unattended install
|
|
```
|
|
|
|
### Documentation
|
|
```
|
|
README.md # Project overview
|
|
QUICKSTART.md # Step-by-step guide
|
|
HANDOFF.md # This file
|
|
CLAUDE.md # Architecture details
|
|
playbooks/README-provision.md # Provisioning deep-dive
|
|
```
|
|
|
|
### Inventory (External)
|
|
```
|
|
/home/ptoal/Dev/inventories/toallab-inventory/
|
|
├── static.yml # Hypervisor and VMs
|
|
├── group_vars/
|
|
│ ├── hyperv/vars.yml
|
|
│ ├── windows_servers/vars.yml
|
|
│ └── web_servers/vars.yml
|
|
└── host_vars/
|
|
└── hyperv1.lan.toal.ca/vars.yml
|
|
```
|
|
|
|
## Quick Reference Commands
|
|
|
|
### Setup
|
|
```bash
|
|
# Activate environment
|
|
source ~/.venv/ansible/bin/activate
|
|
cd /home/ptoal/Dev/Projects/HyperV
|
|
|
|
# Test connectivity
|
|
ansible hyperv -m ansible.windows.win_ping
|
|
|
|
# Configure host (one-time)
|
|
ansible-playbook playbooks/provision-hyperv-host.yml
|
|
```
|
|
|
|
### VM Operations
|
|
```bash
|
|
# List switches
|
|
ansible-playbook playbooks/list-hyperv-switches.yml
|
|
|
|
# Provision VM
|
|
ansible-playbook playbooks/provision-vm.yml \
|
|
-e vm_name=WEB01 \
|
|
-e vm_ip_address=192.168.100.10
|
|
|
|
# List all VMs
|
|
ansible hyperv -m ansible.windows.win_shell \
|
|
-a "Get-VM | Select-Object Name, State, CPUUsage | Format-Table"
|
|
|
|
# VM power operations
|
|
ansible hyperv -m ansible.windows.win_shell -a "Start-VM -Name WEB01"
|
|
ansible hyperv -m ansible.windows.win_shell -a "Stop-VM -Name WEB01 -Force"
|
|
ansible hyperv -m ansible.windows.win_shell -a "Remove-VM -Name WEB01 -Force"
|
|
```
|
|
|
|
### Application Deployment
|
|
```bash
|
|
# Deploy IIS
|
|
ansible-playbook playbooks/install-iis.yml --limit WEB01
|
|
|
|
# Patch VMs
|
|
ansible-playbook playbooks/patch-vms.yml --limit windows_servers
|
|
|
|
# Test connectivity to VM
|
|
ansible WEB01 -m ansible.windows.win_ping
|
|
```
|
|
|
|
### Troubleshooting
|
|
```bash
|
|
# Verbose output
|
|
ansible hyperv -m ansible.windows.win_ping -vvv
|
|
|
|
# Check WinRM
|
|
ansible hyperv -m ansible.windows.win_shell -a "Get-Service WinRM"
|
|
|
|
# Verify paths
|
|
ansible hyperv -m ansible.windows.win_stat -a "path=D:\\ISOs\\Windows_Server_2022.iso"
|
|
|
|
# Get Hyper-V info
|
|
ansible hyperv -m ansible.windows.win_shell -a "Get-VMHost | ConvertTo-Json"
|
|
```
|
|
|
|
## Important Notes
|
|
|
|
### Security Considerations
|
|
⚠️ **Current configuration is for DEMO/LAB only**
|
|
|
|
**Current State**:
|
|
- WinRM over HTTP (not HTTPS)
|
|
- NTLM authentication (not Kerberos)
|
|
- Certificate validation disabled
|
|
- Permissive firewall rules
|
|
- No backup/DR
|
|
- No monitoring
|
|
|
|
**For Production**:
|
|
- Enable HTTPS for WinRM (port 5986)
|
|
- Use Kerberos authentication
|
|
- Enable certificate validation
|
|
- Implement network segmentation
|
|
- Configure backup and DR
|
|
- Deploy monitoring/alerting
|
|
- Implement change management
|
|
- Regular security patching
|
|
- Compliance scanning
|
|
|
|
### AutoUnattend.xml Gotchas
|
|
|
|
1. **Delivery Methods** (in order of difficulty):
|
|
- Second DVD drive (easiest, use helper playbook)
|
|
- Rebuild ISO with autounattend in root (moderate)
|
|
- Floppy image (legacy, difficult)
|
|
|
|
2. **Common Issues**:
|
|
- File not found → wrong location
|
|
- Interactive prompts → XML syntax error
|
|
- Network not configured → check IP settings in template
|
|
- WinRM not available → first logon commands didn't run
|
|
|
|
3. **Debugging**:
|
|
- Check logs: `C:\Windows\Panther\setupact.log`
|
|
- Watch VM console during install
|
|
- Verify XML with validator before use
|
|
|
|
### Variable Precedence Reminder
|
|
|
|
```
|
|
1. Extra vars (-e on command line) [highest]
|
|
2. Task vars (in playbook)
|
|
3. Host vars (host_vars/)
|
|
4. Group vars (group_vars/)
|
|
5. Role defaults
|
|
6. Inventory vars [lowest]
|
|
```
|
|
|
|
## Testing Checklist
|
|
|
|
Before declaring completion:
|
|
|
|
- [ ] Hyper-V host provisioning successful
|
|
- [ ] Virtual switches created and accessible
|
|
- [ ] VM provisioning creates VM successfully
|
|
- [ ] AutoUnattend.xml performs unattended install
|
|
- [ ] WinRM available after installation
|
|
- [ ] VM pingable from Ansible
|
|
- [ ] IIS deployment works
|
|
- [ ] Windows Update playbook works
|
|
- [ ] AAP job template with survey works
|
|
- [ ] Documentation is accurate
|
|
|
|
## Questions for Next Session
|
|
|
|
1. **Hyper-V Host Status**:
|
|
- Is hyperv1.lan.toal.ca a fresh install or already configured?
|
|
- Are virtual switches already created?
|
|
- Is storage already set up?
|
|
|
|
2. **ISO Availability**:
|
|
- Is Windows Server 2022 ISO available?
|
|
- Where is it located?
|
|
|
|
3. **Network**:
|
|
- What network should VMs be on?
|
|
- Static IPs or DHCP?
|
|
- Internet access required?
|
|
|
|
4. **Scope**:
|
|
- How many VMs to provision initially?
|
|
- What applications to deploy?
|
|
- Integration with existing systems needed?
|
|
|
|
## Contact / References
|
|
|
|
**Project Location**: `/home/ptoal/Dev/Projects/HyperV`
|
|
**Inventory Location**: `/home/ptoal/Dev/inventories/toallab-inventory`
|
|
**Virtual Environment**: `~/.venv/ansible`
|
|
**Execution Environment**: `aap.toal.ca/ee-demo`
|
|
|
|
**Key Technologies**:
|
|
- Ansible Core 2.15+
|
|
- Ansible Automation Platform 2.x
|
|
- Microsoft Hyper-V (Windows Server 2019/2022)
|
|
- Windows Server 2019/2022
|
|
|
|
**Collections Used**:
|
|
- ansible.windows (>=2.0.0)
|
|
- community.windows (>=2.0.0)
|
|
- servicenow.itsm (>=2.0.0)
|
|
|
|
---
|
|
|
|
**Ready for next session**: Yes
|
|
**Blockers**: None - ready to test on actual Hyper-V host
|
|
**Recommended first task**: Run `provision-hyperv-host.yml` to set up the environment
|