# Packer.Images [![Build Status](https://ci.spamasaurus.com/api/badges/djpbessems/Packer.Images/status.svg?ref=refs/heads/Server2019)](https://ci.spamasaurus.com/djpbessems/Packer.Images)

This OVA appliance allows deploying a Windows Server fully automated; either as a domain member or stand-alone server.  

The included `.ovf` file has the following XML contents (simplified for clarity) to facilitate the different `DeploymentOption`s:  
```xml
<Envelope [...]>
  [...]
  <DeploymentOptionSection>
    <Info>Deployment Type</Info>
    <Configuration ovf:id="domainmember">
      <Label>Domain member</Label>
      <Description>Windows Server joined to an Active Directory domain</Description>
    </Configuration>
    <Configuration ovf:id="standalone">
      <Label>Stand-alone</Label>
      <Description>Stand-alone Windows Server</Description>
    </Configuration>
  </DeploymentOptionSection>
  <VirtualSystem ovf:id="[...]">
    [...]
    <ProductSection>
      [...]
      <Category>1) Operating System</Category>
      <Property ovf:configuration="domainmember standalone" ovf:key="guestinfo.hostname" [...]>
        <Label>Hostname*</Label>
      </Property>
      <Property ovf:configuration="standalone" ovf:key="guestinfo.administratorpw" [...]>
        <Label>Local administrator password*</Label>
      </Property>
      [...]
      <Category>3) Active Directory membership</Category>
      <Property ovf:configuration="domainmember" ovf:key="addsconfig.domainname" [...]>
        <Label>Domain name*</Label>
      </Property>
      <Property ovf:configuration="domainmember" ovf:key="addsconfig.username" [...]>
        <Label>Domain account username*</Label>
      </Property>
      <Property ovf:configuration="domainmember" ovf:key="addsconfig.password" [...]>
        <Label>Domain account password*</Label>
      </Property>
    </ProductSection>
  </VirtualSystem>
</Envelope>
```

When **provisioning** the appliance through the vCenter 'Deploy OVF template...' wizard, or through vApp-compatible *Infrastructure as code* tooling (e.g. HashiCorp Terraform), it is possible to provide all relevant configuration through vApp properties.  

<table>
<tr>
<td><em>vSphere 'Deploy OVF template...' wizard</em></td> <td> <a href="https://registry.terraform.io/providers/hashicorp/vsphere/latest/docs/resources/virtual_machine#deploying-vm-from-an-ovfova-template">HashiCorp Terraform vSphere provider</a> </td>
</tr>
<tr>
<td><img src=".assets/vAppConfigurations-Server2019-example.png" alt="vApp properties" width="400" /><br/><img src=".assets/vAppProperties-Server2019-example.png" alt="vApp properties" width="400" /></td>
<td>

```hcl
  vapp {
    properties = {
      # "deployment.type"           = "domainmember"

      "guestinfo.hostname"        = "SRV01"
      # "guestinfo.administratorpw" = var.vm_adminpassword
      # "guestinfo.ntpserver"       = "0.pool.ntp.org,1.pool.ntp.org,2.pool.ntp.org"
      "guestinfo.ipaddress"       = "10.0.0.42"
      "guestinfo.prefixlength"    = "24"
      "guestinfo.dnsserver"       = "10.0.0.21"
      "guestinfo.gateway"         = "10.0.0.1"

      "addsconfig.domainname"     = "contoso.com"
      "addsconfig.username"       = "CONTOSO\\domainjoin"
      "addsconfig.password"       = var.adds_password
    }
  }
```

</td>
</tr>
</table>

On first boot, the appliance will start **configuring** itself without any further user-input, by performing the following steps:  
- Change hostname
- Configure network
- Join Active Directory domain **-OR-** Set password for local administrator
- Iterate through any payload scripts
