Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

Better Together: Managing Windows with Puppet, PowerShell and DSC

Slide 3

Slide 3 text

Introductions Bruce Payette Principal Software Engineer Microsoft @BrucePayette Ethan Brown Senior Software Engineer Puppet Labs Iristyle @ethanjbrown

Slide 4

Slide 4 text

v • Overview of PowerShell and DSC • Puppet + DSC • All The Way Live! • Feedback? AGENDA

Slide 5

Slide 5 text

PowerShell and DSC

Slide 6

Slide 6 text

v Prelude: A Touch of PowerShell • Modern Interactive object-oriented shell – Inspired by ksh, syntax from C#, blocks from Ruby, cmd syntax from DCL – Being a shell makes the syntax a bit weird • All the usual stuff: regex, first-class functions, array and hashtable literals, modules, classes (as of PowerShell V5) • Underlying type system is .NET – Can access any .NET API directly – Can inline code written C#, VB, F#, IronPython, IronRuby etc. • Built-in “remoting” • Type-preserving remote execution over HTTP using MS-PSRP • Hostable and embeddable (like TCL) – Can be loaded into multiple host (including Visual Studio thru PoshTools)

Slide 7

Slide 7 text

v 1. #requires -version 5 2. using namespace System.Net 3. using namespace System.Text 4. function Start-HTTPListener ( [int] $Port = 8888, $Url = "“ ) # supports named arguments e.g. Start-HttpListener –port 8080 5. { 6. [HttpListener] $listener = [HttpListener]::new() 7. $prefix = "http://*:$Port/$Url" # variable expansion in strings 8. $listener.Prefixes.Add($prefix) 9. $listener.AuthenticationSchemes = [AuthenticationSchemes]::IntegratedWindowsAuthentication # static member reference 10. $listener.Start() 11. while ($true) 12. { 13. $statusCode = 200 14. $context = $listener.GetContext() # block waiting for a connection 15. $request, $identity = $context.Request, $context.User.Identity # supports multiple assignment 16. $request | Format-List * | Out-String | Write-Verbose # display request object as a list 17. $command = $request.QueryString.Item("command"); $Format = $request.QueryString.Item("format") # ; separates statements 18. $sb = [ScriptBlock]::Create($command) 19. $commandOutput = switch (& $sb) {# expression oriented; statements are lvalues 20. TEXT { $commandOutput | Out-String ; break } 21. JSON { $commandOutput | ConvertTo-JSON; break } 22. XML { $commandOutput | ConvertTo-XML -As String; break } 23. default { "Invalid output format selected, valid choices are TEXT, JSON and XML"; $statusCode = 501; break } 24. } 25. $response, $response.StatusCode = $context.Response, $statusCode 26. $buffer = [Encoding]::UTF8.GetBytes($commandOutput) 27. $response.ContentLength64 = $buffer.Length 28. $response.OutputStream.Write($buffer, 0, $buffer.Length) 29. $response.OutputStream.Close() 30. } 31. } PowerShell Example: HttpListener

Slide 8

Slide 8 text

v • We take it as given that Configuration Management is a Good Thing. • BUT Unix/Linux management idioms don't work well on Windows – This is why we built PowerShell in the first place For Configuration Management SOLUTIONS to work well on Windows, we needed to change the Windows PLATFORM to work well with Configuration Management • Thus DSC exposes a set of language-independent API’s that management solutions can use to configure Windows • Three Main Pieces to DSC 1. Local Configuration Manager Service 2. Source Language 3. Resource Providers Why create DSC?

Slide 9

Slide 9 text

• The LCM is a built-in component on Windows supporting a declarative configuration management model – Runs on every node • Open Standards based (WSMAN, REST/ODATA, DMTF MOF for schema and instance data) • The LCM receives "configuration catalogs" expressed in MOF describing the desired final state of the system – Push (RPC-like invocation) – Pull (REST call to a pull server/config master) • The LCM consistency engine then processes the configuration catalog delegating the enactment of system changes to "providers" What is DSC Part 1 The Local Configuration Manager Service

Slide 10

Slide 10 text

v Example DSC MOF for a Node 1. instance of MSFT_FileDirectoryConfiguration as $MSFT_FileDirectoryConfiguration1ref 2. { 3. ResourceID = "[File]f1"; 4. Contents = "A file from brucepaypro3"; 5. DestinationPath = "c:\\temp\\zork.txt"; 6. ModuleName = "PSDesiredStateConfiguration"; 7. SourceInfo = "C:\\Users\\brucepay\\documents\\dsc\\server.ps1::6::9::File"; 8. ModuleVersion = "1.0"; 9. ConfigurationName = "Main"; 10.}; 11. 12.instance of OMI_ConfigurationDocument 13.{ 14. Version="2.0.0"; 15. MinimumCompatibleVersion = "1.0.0"; 16. CompatibleVersionAdditionalProperties= {"Omi_BaseResource:ConfigurationName"}; 17. Author="brucepay"; 18. GenerationDate="09/10/2015 17:06:23"; 19. GenerationHost="BRUCEPAYPRO3"; 20. Name="Main"; 21.};

Slide 11

Slide 11 text

• We added a set of extensions to the PowerShell language to express configuration in a (Windows) natural way – Statically typed, data declaration language – Deeply integrating into PowerShell allows for intellisense + parse- time validation of configurations • Configurations are reusable, composable, parameterized – Essentially equivalent to functions in PowerShell • We use a convention for separating configuration “templates” from bulk parameter data – called ConfigurationData expressed as JSON (or PowerShell hashtables) What is DSC Part 2 The Source Language

Slide 12

Slide 12 text

v Example PSDSC Configuration Script 1. configuration Main 2. { 3. param ($NodeList, $targetDir) 4. 5. node ($NodeList) 6. { 7. File f1 8. { 9. Contents = "A file from $(hostname) generated at $(Get-Date)" 10. DestinationPath = "$targetDir\file1.txt" 11. } 12. File f2 13. { 14. Contents = "My node name is $($node.Name)" 15. DestinationPath = Join-Path $targetDir file2.txt 16. } 17. } 18.} 19. 20.# generate the configuration MOF for each machine 21.Main -TargetDir "c:\temp" -NodeList '169.254.48.23', '169.254.48.24', '169.254.48.25' 22. 23.# configure all 3 machines concurrently, display status, wait until done 24.Start-DscConfiguration -Verbose -Wait

Slide 13

Slide 13 text

• Interface for a resource is defined by schema – DMTF MOF class in V1 – PowerShell Classes in V2 • All resources are Open Source on GitHub – Providers on Windows are written in C/C++ or PowerShell – Providers on Linux are (currently) written in Python • Nuget-based PowerShell Gallery to simplify installation of providers – Install manually or auto-installed via the “pull protocol” What is DSC Part 3 Implementing Resource Providers

Slide 14

Slide 14 text

v Example Resource Implementation 1. #requires -version 5 2. enum Ensure 3. { 4. Absent 5. Present 6. } 7. 8. [DscResource()] 9. class MyResource 10.{ 11. [DscProperty(Key)] [string]$P1 # must be set to a unique value for each instance 12. [DscProperty(Mandatory)] [Ensure] $P2 13. [DscProperty(NotConfigurable)] [Nullable[datetime]] $P3 14. [DscProperty()] [ValidateSet("val1", "val2")] [string] $P4 15. 16. [void] Set() { <# Sets the desired state of the resource. #> } 17. [bool] Test() { <# Tests if the resource is in the desired state. #> return $true } 18. [MyResource] Get() { <# Gets the resource's current state. #> return $this } 19.}

Slide 15

Slide 15 text

DSC End-to-End Configuration Staging Area (Contains catalog data) 3rd party languages and tools Authoring Phase (May include imperative as well as declarative code) Staging Phase - Fully declarative configuration representation using DMTF standard MOF instances - Configuration is calculated for all nodes PowerShell Parser and Dispatcher Resources When authoring in PowerShell: • Declarative syntax extensions • Schema-driven Intellisense • Schema validation (early- binding) Local Configuration Store “Make it So” Phase (Declarative configuration is reified through imperative providers.) Resources implement changes: • Monotonic • Imperative • Idempotent

Slide 16

Slide 16 text

v Using DSC in Other Solutions • Possible Approaches: – Generating MOF from other source languages (e.g. Puppet) then physically placing it on a machine – Implementing the PowerShell Pull Protocol • Very simple REST-based protocol • Documented under the Microsoft’s Open Protocols Initiative as MS-PSDSC – Using the PowerShell API to invoke configuration scripts • Generate ConfigurationData from a CMDB – ***** Direct invocation of providers: Invoke-DscResource -Name File -Method Get -Property @{ DestinationPath = "c:\temp\foo.txt“ } • The Big Challenge: – Honoring the semantics of the higher layer

Slide 17

Slide 17 text

v • Built in to Windows since Windows Server 2012 R2 – No install needed • Installable on older versions of Windows through the Windows Management Framework – WMF 4.0 – WMF 5.0 (Production Preview) • DSC on Linux • DSC is available as a resource extension in Azure • Resource development on GitHub • Resource sharing on Nuget-based PowerShell Gallery Where is DSC Available?

Slide 18

Slide 18 text

Puppet + DSC

Slide 19

Slide 19 text

v • Marc Sutter, community originated • Released 0.1.0 in Sept 2014 • Puppet adopted April 2015 • Puppet unsupported release 0.8.0 in Sept 2015 – Requires WMF5 – Speedier Invoke-DscResource vs XXX-DscConfiguration – Windows on DSC only • Fully supported Q4 Changelog

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

Batteries Included 180+ Resources

Slide 22

Slide 22 text

MOF -> PUPPET TYPE

Slide 23

Slide 23 text

v • dsc_ prefixes – i.e. dsc_ensure • Include validation from MOF schema primitive types – Can abort prior to calling DSC / PS • Special handling for MSFT_KeyValuePair, MSFT_Credentials • Understand EmbeddedInstance schemas • Propagate meaningful DSC errors to Puppet • Support on-demand reboots • Not supporting WaitForOne, WaitForSome, WaitForAll • Don’t need Internet access to PowerShell Gallery Puppet Types

Slide 24

Slide 24 text

v • WMF5 in-box resources resolved by PS ModuleName • Symlink vendored modules • Vendored matched on ModuleName / ModuleVersion – Ensures compatibility with codegen’d Puppet types Finding DSC Resources

Slide 25

Slide 25 text

Toward Supported – UNIT TestS

Slide 26

Slide 26 text

Toward Supported - CI

Slide 27

Slide 27 text

Toward Supported - Docs

Slide 28

Slide 28 text

Technet Docs

Slide 29

Slide 29 text

v • Support integration with DSC • LCM does heavy-lifting of resource application • xPrefix style resources included from “community” Good fences…

Slide 30

Slide 30 text

ALL THE WAY LIVE!

Slide 31

Slide 31 text

In The Year 3000 • Property Reporting / --noop * • MI APIs to improve perf • Generic resource support – Codegen tooling – Dsc_ wrapper for custom / class-based resources • Puppet resource support • DSC OS compat metadata ** * Needs Get-TargetResource ** Needs MS implementation

Slide 32

Slide 32 text

v • WMF 5.0 Download - http://bit.ly/1idWxvp • Puppet DSC module source - http://bit.ly/1Qm5ddR • Vendored PowerShell DSC_resources - http://bit.ly/1jbauua • Technet DSC Docs - http://bit.ly/1HoS4yp • James Pogran “Learning PowerShell DSC” - http://bit.ly/learndsc STILL HUNGRY?

Slide 33

Slide 33 text

Feedback?

Slide 34

Slide 34 text

Thanks!