My Profile Photo Title

Thoughts about DevOps and automation from a Windows guy


POSHOrigin - Examples feature image

POSHOrigin - Examples

This article is Part 8 in a 9-Part series about POSHOrigin, a PowerShell module that aims to assist you in managing your Infrastructure via custom PowerShell DSC resources.

POSHOrigin on GitHub→

Examples

Creating a VMware VM using the POSHOrigin_vSphere DSC module

This will create a VMware VM called serverxyz, join it to an Active Directory domain, install the Chef client on it, then assign and execute a Chef run list.

my_vm.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
resource 'POSHOrigin_vSphere:vm' 'serverxyz' @{
    ensure = 'present'
    description = 'Test VM'
    vCenter = 'vcenter01.mydomain.com'
    datacenter = 'datacenter01'
    cluster = 'cluster01'
    vmTemplate = 'W2K12_R2_Std'
    customizationSpec = 'W2K12_R2'
    powerOnAfterCreation = $true
    totalvCPU = 2
    coresPerSocket = 1
    vRAM = 4
    initialDatastore = 'datastore01'
    networks = @{
        portGroup = 'VLAN_500'
        ipAssignment = 'Static'
        ipAddress = '192.168.195.254'
        subnetMask = '255.255.255.0'
        defaultGateway = '192.168.195.1'
        dnsServers = @('192.168.50.50','192.168.50.60')
    }
    disks = @(
        @{
            name = 'Hard disk 1'
            sizeGB = 50
            type = 'flat'
            format = 'Thick'
            volumeName = 'C'
            volumeLabel = 'NOS'
            blockSize = 4096
        }
    )
    vCenterCredentials = Get-POSHOriginSecret 'pscredential' @{
        username = '[email protected]'
        password = '<your password here>'
    }
    guestCredentials = Get-POSHOriginSecret 'pscredential' @{
        username = 'administrator'
        password = '<your password here>'
    }
    domainJoinCredentials = Get-POSHOriginSecret 'pscredential' @{
        username = 'administrator'
        password = '<your password here>'
    }
    provisioners = @(
        @{
            name = 'DomainJoin'
            options = @{
               domain = 'mydomain.com'
               oupath = 'ou=servers, dc=mydomain, dc=com'
           }
        }
        @{
            name = 'Chef'
            options = @{
                nodeName = 'serverxyz.mydomain.com'
                url = 'https://chefsvr.mydomain.com/organizations/myorg'
                source = '<URL to Chef MSI file>'
                validatorKey = '<URL to organization validator .pem file>'
                cert = '<URL to issuing CA .crt file>'
                runList = @(
                    @{ role = 'base::setup_base' }
                    @{ recipe = 'myapp::default' }
                )
                environment = 'dev'
                attributes = @{
                    'myapp.prop1' = 42
                    'myapp.prop2' = 'something'
                }
            }
        }
    )
}

Creating a NetScaler VIP using the POSHOrigin_NetScaler DSC module

This will create a Citrix NetScaler load balancer server instance pointing to the IP of the VM we just created (192.168.195.254), as well as a VIP with an IP of 192.168.100.100.

my_ns_resources.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
resource 'POSHOrigin_NetScaler:LBServer' 'serverxyz' @{
    Ensure = 'Present'
    NetScalerFQDN = 'mynetscaler.mydomain.com'
    IPAddress = '192.168.195.254'
    Comments = 'This is a comment'
    TrafficDomainId = 1
    State = 'ENABLED'
    Credential = Get-POSHOriginSecret 'pscredential' @{
        username = 'administrator'
        password = '<your password here>'
    }
}

resource 'POSHOrigin_NetScaler:LBVirtualServer' 'lbserverxyz' @{
    Ensure = 'Present'
    NetScalerFQDN = 'mynetscaler.mydomain.com'
    Comments = 'This is a comment'
    IPAddress = '192.168.100.100'
    Port = 80
    ServiceType = 'HTTP'
    LBMethod = 'ROUNDROBIN'    
    State = 'ENABLED'
    Credential = Get-POSHOriginSecret 'pscredential' @{
        username = 'administrator'
        password = '[email protected]'
    }
}

Creating a DNS A record using the POSHOrigin_ActiveDirectoryDNS DSC module

This will create an A record in DNS called web01.mydomain.local that points to the IP of the VM we just created (10.45.195.254).

my_dns_record.ps1
1
2
3
4
5
6
7
8
9
10
resource 'ActiveDirectoryDNS:ARecord' 'web01' @{
    ZoneName = 'mydomain.local'
    IpAddress = '10.45.195.254'
    DnsServer = 'dc01.mydomain.com'
    CreatePtr = $true
    Credential = Get-POSHOriginSecret 'pscredential' @{
        username = 'mydomain\administrator'
        password = '[email protected]'
    }
}

Using all three resources in the same file

Here is an example of combined all resources into a single file as well as extracting some of the configurations into defaults files.

my_app_env.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
resource 'POSHOrigin_vSphere:VM' 'serverxyz' @{
    defaults = '.\my_vm_defaults.psd1'
    totalvCPU = 2
    coresPerSocket = 1
    vRAM = 4
    networks = @{
        portGroup = 'VLAN_500'
        ipAssignment = 'Static'
        ipAddress = '192.168.100.100'
        subnetMask = '255.255.255.0'
        defaultGateway = '192.168.100.1'
        dnsServers = @('192.168.50.50','192.168.50.60')
    }
    vCenterCredentials = Get-POSHOriginSecret 'pscredential' @{
        username = '[email protected]'
        password = '<your password here>'
    }
    guestCredentials = Get-POSHOriginSecret 'pscredential' @{
        username = 'administrator'
        password = '<your password here>'
    }
    domainJoinCredentials = Get-POSHOriginSecret 'pscredential' @{
        username = 'administrator'
        password = '<your password here>'
    }
    provisioners = @(
        @{
            name = 'DomainJoin'
            options = @{
               domain = 'mydomain.com'
               oupath = 'ou=servers, dc=mydomain, dc=com'
           }
        }
        @{
            name = 'Chef'
            options = @{
                nodeName = 'vm01.mydomain.com'
                url = 'https://chefsvr.mydomain.com/organizations/myorg'
                source = '<URL to Chef MSI file>'
                validatorKey = '<URL to organization validator .pem file>'
                cert = '<URL to issuing CA .crt file>'
                runList = @(
                    @{ role = 'base::setup_base' }
                    @{ recipe = 'myapp::default' }
                )
                environment = 'prod'
                attributes = @{
                    'myapp.prop1' = 42
                    'myapp.prop2' = 'something'
                }
            }
        }
    )
}

resource 'POSHOrigin_NetScaler:LBServer' 'serverxyz' @{
    defaults = '.\my_ns_defaults.psd1'
    ipAddress = '192.168.100.100'
    comments = 'This is a comment'
    trafficDomainId = 1
    state = 'ENABLED'
    credential = Get-POSHOriginSecret 'pscredential' @{
        username = 'administrator'
        password = '[email protected]'
    }
}

resource 'POSHOrigin_NetScaler:LBVirtualServer' 'lbserverxyz' @{
    defaults = '.\my_ns_defaults.psd1'
    comments = 'This is a comment'
    ipAddress = '192.168.100.101'
    port = 80
    serviceType = 'HTTP'
    lbMethod = 'ROUNDROBIN'    
    state = 'ENABLED'
    credential = Get-POSHOriginSecret 'pscredential' @{
        username = 'administrator'
        password = '[email protected]'
    }
}

resource 'POSHOrigin_ActiveDirectoryDNS:ARecord' 'web01' @{
    defaults = '.\my_vm_defaults.psd1'
    ipAddress = '10.45.195.254'
    credential = Get-POSHOriginSecret 'pscredential' @{
        username = 'mydomain\administrator'
        password = '[email protected]'
    }
}

Cheers

Sharing is caring