{"id":15022587,"url":"https://github.com/puppetlabs/puppetlabs-dsc_lite","last_synced_at":"2025-04-05T11:09:43.673Z","repository":{"id":26453745,"uuid":"108466189","full_name":"puppetlabs/puppetlabs-dsc_lite","owner":"puppetlabs","description":"DSC to Puppet runtime integration and module generation tasks","archived":false,"fork":false,"pushed_at":"2025-02-04T02:38:38.000Z","size":13754,"stargazers_count":8,"open_issues_count":1,"forks_count":26,"subscribers_count":95,"default_branch":"main","last_synced_at":"2025-03-29T10:08:07.833Z","etag":null,"topics":["module","supported"],"latest_commit_sha":null,"homepage":null,"language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/puppetlabs.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-10-26T21:13:38.000Z","updated_at":"2025-01-29T10:45:04.000Z","dependencies_parsed_at":"2024-04-29T09:43:21.511Z","dependency_job_id":"4266fab8-3897-4c4a-8985-1c3c51514406","html_url":"https://github.com/puppetlabs/puppetlabs-dsc_lite","commit_stats":{"total_commits":740,"total_committers":55,"mean_commits":"13.454545454545455","dds":0.7851351351351351,"last_synced_commit":"746fc17a7ff88c6176692d52b69de4b09a47d07a"},"previous_names":[],"tags_count":21,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/puppetlabs%2Fpuppetlabs-dsc_lite","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/puppetlabs%2Fpuppetlabs-dsc_lite/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/puppetlabs%2Fpuppetlabs-dsc_lite/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/puppetlabs%2Fpuppetlabs-dsc_lite/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/puppetlabs","download_url":"https://codeload.github.com/puppetlabs/puppetlabs-dsc_lite/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247325693,"owners_count":20920714,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["module","supported"],"created_at":"2024-09-24T19:58:08.996Z","updated_at":"2025-04-05T11:09:43.644Z","avatar_url":"https://github.com/puppetlabs.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# dsc_lite\n\n[wmf-5.0]: https://www.microsoft.com/en-us/download/details.aspx?id=50395\n[DSCResources]: https://github.com/powershell/DSCResources\n[wmf5-blog-post]: https://msdn.microsoft.com/en-us/powershell/wmf/5.1/release-notes\n[wmf5-blog-incompatibilites]: https://msdn.microsoft.com/en-us/powershell/wmf/5.1/productincompat\n\n#### Table of Contents\n\n1. [Module Description - What the module does and why it is useful](#module-description)\n2. [Setup - The basics of getting started with dsc_lite](#setup)\n3. [Usage - Configuring options and additional functionality](#usage)\n    * [Specifying a DSC Resource version](#specifying-a-dsc-resource-version)\n    * [Using PSCredential or MSFT_Credential](#using-pscredential-or-msft_credential)\n    * [Using EmbeddedInstance or CimInstance](#using-ciminstance)\n    * [Handling Reboots with DSC](#handling-reboots-with-dsc)\n5. [Reference - An under-the-hood peek at what the module is doing and how](#reference)\n6. [Limitations - OS compatibility, etc.](#limitations)\n    * [Known Issues](#known-issues)\n    * [Running Puppet and DSC without Administrative Privileges](#running-puppet-and-dsc-without-administrative-privileges)\n7. [Development - Guide for contributing to the module](#development)\n8. [Learn More About DSC](#learn-more-about-dsc)\n9. [License](#license)\n\n## Module description\n\nThe Puppet `dsc_lite` module allows you to manage target nodes using arbitrary Windows PowerShell DSC (Desired State Configuration) Resources.\n\n### Warning:\n\n***Using dsc_lite requires advanced experience with DSC and PowerShell, unlike our other modules that are far easier to use. It is an alternative approach to Puppet's family of [DSC modules](http://forge.puppet.com/dsc), providing more flexibility for certain niche use cases.***\n\nThe `dsc_lite` module contains a lightweight `dsc` type, which is a streamlined and minimal representation of a DSC Resource declaration in Puppet syntax. This type does not contain any DSC resources itself, but can invoke arbitrary DSC Resources that already exist on the managed node. Much like the `exec` type, it simply passes parameters through to the underlying DSC Resource without any validation.\n\nThis means that you are responsible for:\n\n1. Distributing the DSC Resources as needed to your managed nodes.\n1. Validating all configuration data for `dsc` declarations to prevent runtime errors.\n1. Troubleshooting all errors without property status reporting.\n\nThe existing family of [DSC modules](http://forge.puppet.com/dsc) will manage all the DSC administration for you, meaning that all you need to do is install the module and start writing code. These modules also do parameter validation, meaning that errors surface during development instead of at runtime. And the VS Code integration will show you usage documentation as you write the code. These modules are automatically imported from the PowerShell Gallery on a daily basis, so they're always up to date. Although these modules are approved for use, they *are not* officially supported.\n\nYou should use the `dsc_lite` module when any of these cases apply to you:\n\n* You want to use the officially supported Puppet DSC Integration\n* You need to use multiple versions of the same DSC resource\n* You need to use a DSC Resource that isn't published to the [Puppet Forge](http://forge.puppet.com/dsc).\n    * If you have custom DSC Resources, you can use the [Puppet.dsc module builder](https://github.com/puppetlabs/Puppet.Dsc) to build your own Puppet module from it.\n\n------\n\n### Windows system prerequisites\n\nAt least PowerShell 5.0, which is included in [Windows Management Framework 5.0][wmf-5.0].\n\n*Note: PowerShell version as obtained from `$PSVersionTable` must be 5.0.10586.117 or greater.*\n\n## Setup\n\n~~~bash\npuppet module install puppetlabs-dsc_lite\n~~~\n\nSee [known issues](#known-issues) for troubleshooting setup.\n\n## Usage\n\nThe generic `dsc` type is a streamlined and minimal representation of a DSC Resource declaration in Puppet syntax. You can use a DSC Resource by supplying the same properties you would set in a DSC Configuration script, inside the `properties` parameter. For most use cases, the `properties` parameter accepts the same structure as the PowerShell syntax, with the substitution of Puppet syntax for arrays, hashes, and other data structures. You can use PowerShell on the command-line to identify the available parameters.\n\n~~~powershell\nPS C:\\Users\\Administrator\u003e Get-DscResource WindowsFeature | Select-Object -ExpandProperty Properties\n\nName                 PropertyType   IsMandatory Values\n----                 ------------   ----------- ------\nName                 [string]              True {}\nCredential           [PSCredential]       False {}\nDependsOn            [string[]]           False {}\nEnsure               [string]             False {Absent, Present}\nIncludeAllSubFeature [bool]               False {}\nLogPath              [string]             False {}\nPsDscRunAsCredential [PSCredential]       False {}\nSource               [string]             False {}\n~~~\n\nAn example of that DSC resource specified in PowerShell:\n\n~~~powershell\nWindowsFeature IIS {\n  Ensure =\u003e 'present'\n  Name   =\u003e 'Web-Server'\n}\n~~~\n\nWould look like this in Puppet:\n\n~~~puppet\ndsc {'iis':\n  resource_name =\u003e 'WindowsFeature',\n  module        =\u003e 'PSDesiredStateConfiguration',\n  properties    =\u003e {\n    ensure =\u003e 'present',\n    name   =\u003e 'Web-Server',\n  }\n}\n~~~\n\nFor the simplest cases, the above example is enough. However there are more advanced use cases in DSC that require more custom syntax in the `dsc` Puppet type. Since the `dsc` Puppet type has no prior knowledge of the type for each property in a DSC Resource, it can't format the hash correctly without some hints.\n\nThe `properties` parameter recognizes any key with a hash value that contains two keys: `dsc_type` and `dsc_properties`, as a indication of how to format the data supplied. The `dsc_type` contains the CimInstance name to use, and the `dsc_properties` contains a hash or an array of hashes, representing the data for the CimInstances.\n\nA contrived, but simple example follows:\n\n~~~puppet\ndsc {'foo':\n  resource_name =\u003e 'xFoo',\n  module        =\u003e 'xFooBar',\n  properties    =\u003e {\n    ensure  =\u003e 'present',\n    fooinfo =\u003e {\n      'dsc_type'       =\u003e 'FooBarBaz',\n      'dsc_properties' =\u003e {\n        \"wakka\"  =\u003e \"woot\",\n        \"number\" =\u003e 8090\n      }\n    }\n  }\n}\n~~~\n\n### Specifying a DSC Resource version\n\nWhen there is more than one version installed for a given DSC Resource module, you must specify the version in your declaration. You can specify the version with similar syntax to a DSC configuration script, by using a hash containing the name and version of the DSC Resource module.\n\n~~~puppet\ndsc {'iis_server':\n  resource_name =\u003e 'WindowsFeature',\n  module        =\u003e {\n    name    =\u003e 'PSDesiredStateConfiguration',\n    version =\u003e '1.1'\n  },\n  properties =\u003e {\n    ensure =\u003e 'present',\n    name   =\u003e 'Web-Server',\n  }\n}\n~~~\n\n### Distributing DSC Resources\n\nThere are several methods to distribute DSC Resources to the target nodes for the `dsc_lite` module to use.\n\n#### PowerShell Gallery\n\nYou can choose to install DSC Resources using a mechanism that calls the builtin PowerShell package management system called `PackageManagement`. It uses the `PowerShellGet` module and pulls from the [PowerShell Gallery](https://www.powershellgallery.com). You are responsible for orchestrating this before Puppet is run on the host, or you can do so using `exec` in your Puppet manifest. This gives you control of the process, but requires you to manage the complexity yourself.\n\nThe following example shows how to install the `xPSDesiredStateConfiguration` DSC Resource, and can be extended to support different DSC Resource names. This example assumes a package repository has been configured.\n\n~~~puppet\nexec { 'xPSDesiredStateConfiguration-Install':\n  command   =\u003e 'Install-Module -Name xPSDesiredStateConfiguration -Force',\n  provider  =\u003e 'powershell',\n}\n~~~\n\n#### Puppet hbuckle/powershellmodule module\n\nThe community created module [hbuckle/powershellmodule](https://forge.puppet.com/hbuckle/powershellmodule) handles using `PackageMangement` and `PowerShellGet` to download and install DSC Resources on target nodes. It is another Puppet `package` provider, so it similar to how you install packages with Puppet for any other use case.\n\nInstalling a DSC Resource can be as simple as the following declaration:\n\n~~~puppet\npackage { 'xPSDesiredStateConfiguration':\n  ensure   =\u003e latest,\n  provider =\u003e 'windowspowershell',\n  source   =\u003e 'PSGallery',\n}\n~~~\n\nThe module supports configuring repository sources and other `PackageManagement` options, for example configuring trusted package repositories and private or on-premise package sources. For more information, please see the [forge page](https://forge.puppet.com/hbuckle/powershellmodule).\n\n#### Chocolatey\n\nPuppet already works well with [chocolatey](https://chocolatey.org/). You can create chocolatey packages that wrap the DSC Resources you need.\n\n~~~puppet\npackage { 'xPSDesiredStateConfiguration':\n  ensure   =\u003e latest,\n  provider =\u003e 'chocolatey',\n}\n~~~\n\nThis works well for users that already have a chocolatey source feed setup internally, as all you need to do is to push the DSC Resource chocolatey packages to the internal feed. If you use the community feed, you will have to check that the DSC Resource you use is present there.\n\n### Using PSCredential or MSFT_Credential\n\nSpecifying credentials in DSC Resources requires using a PSCredential object. The `dsc` type automatically creates a PSCredential if the `dsc_type` has `MSFT_Credential` as a value.\n\n~~~puppet\ndsc {'foouser':\n  resource_name =\u003e 'User',\n  module        =\u003e 'PSDesiredStateConfiguration',\n  properties    =\u003e {\n    'username'    =\u003e 'jane-doe',\n    'description' =\u003e 'Jane Doe user',\n    'ensure'      =\u003e 'present',\n    'password'    =\u003e {\n      'dsc_type'       =\u003e 'MSFT_Credential',\n      'dsc_properties' =\u003e {\n        'user'     =\u003e 'jane-doe',\n        'password' =\u003e Sensitive('StartFooo123\u0026^!')\n      }\n    },\n    'passwordneverexpires' =\u003e false,\n    'disabled'             =\u003e true,\n  }\n}\n~~~\n\nSome DSC Resources require a password or passphrase for a setting, but do not need a user name. All credentials in DSC must be a PSCredential, so these passwords still have to be specified in a PSCredential format, even if there is no `user` to specify. How you specify the PSCredential depends on how the DSC Resource implemented the password requirement. Some DSC Resources accept an empty or null string for `user`, others do not. If it does not accept an empty or null string, then specify a dummy value. Do not use `undef` as it will error out.\n\nYou can also use the Puppet [Sensitive type](https://puppet.com/docs/puppet/latest/lang_data_sensitive.html) to ensure logs and reports redact the password.\n\n~~~puppet\ndsc {'foouser':\n  resource_name =\u003e 'User',\n  module        =\u003e 'PSDesiredStateConfiguration',\n  properties    =\u003e {\n    'username'    =\u003e 'jane-doe',\n    'description' =\u003e 'Jane Doe user',\n    'ensure'      =\u003e 'present',\n    'password'    =\u003e {\n      'dsc_type'       =\u003e 'MSFT_Credential',\n      'dsc_properties' =\u003e {\n        'user'     =\u003e 'jane-doe',\n        'password' =\u003e Sensitive('StartFooo123\u0026^!')\n      }\n    },\n    'passwordneverexpires' =\u003e false,\n    'disabled'             =\u003e true,\n  }\n}\n~~~\n\n### Using CimInstance\n\nA DSC Resource may need a more complex type than a simple key value pair, for example, an EmbeddedInstance. An EmbeddedInstance is serialized as CimInstance over the wire. In order to represent a CimInstance in the `dsc` type, use the `dsc_type` key to specify which CimInstance to use. If the CimInstance is an array, append a `[]` to the end of the name.\n\nFor example, create a new IIS website using the xWebSite DSC Resource, bound to port 80. Use `dsc_type` to specify a `MSFT_xWebBindingInformation` CimInstance, and append `[]` to indicate that it is an array. Note that you do this even if you are only putting a single value in `dsc_properties`.\n\n~~~puppet\ndsc {'NewWebsite':\n  resource_name =\u003e 'xWebsite',\n  module        =\u003e 'xWebAdministration',\n  properties    =\u003e {\n    ensure       =\u003e 'Present',\n    state        =\u003e 'Started',\n    name         =\u003e 'TestSite',\n    physicalpath =\u003e 'C:\\testsite',\n    bindinginfo  =\u003e {\n      'dsc_type'       =\u003e 'MSFT_xWebBindingInformation[]',\n      'dsc_properties' =\u003e {\n        \"protocol\" =\u003e \"HTTP\",\n        \"port\"     =\u003e 80\n      }\n    }\n  }\n}\n~~~\n\nTo show using more than one value in `dsc_properties`, create the same site but bound to both port 80 and 443.\n\n~~~puppet\ndsc {'NewWebsite':\n  resource_name =\u003e 'xWebsite',\n  module        =\u003e 'xWebAdministration',\n  properties    =\u003e {\n    ensure       =\u003e 'Present',\n    state        =\u003e 'Started',\n    name         =\u003e 'TestSite',\n    physicalpath =\u003e 'C:\\testsite',\n    bindinginfo  =\u003e {\n      'dsc_type'       =\u003e 'MSFT_xWebBindingInformation[]',\n      'dsc_properties' =\u003e [\n        {\n          \"protocol\" =\u003e \"HTTP\",\n          \"port\"     =\u003e 80\n        },\n        {\n          'protocol'              =\u003e 'HTTPS',\n          'port'                  =\u003e 443,\n          'certificatethumbprint' =\u003e 'F94B4CC4C445703388E418F82D1BBAA6F3E9E512',\n          'certificatestorename'  =\u003e 'My',\n          'ipaddress'             =\u003e '*'\n        }\n      ]\n    }\n  }\n}\n~~~\n\n### Handling reboots with DSC\n\nAdd the following `reboot` resource to your manifest. It must have the name `dsc_reboot` for the `dsc` module to find and use it.\n\n~~~puppet\nreboot { 'dsc_reboot' :\n  message =\u003e 'DSC has requested a reboot',\n  when    =\u003e 'pending',\n  onlyif  =\u003e 'pending_dsc_reboot',\n}\n~~~\n\n## Reference\n\nFor information on the types, see [REFERENCE.md](https://github.com/puppetlabs/puppetlabs-dsc_lite/blob/master/REFERENCE.md).\n\n## Limitations\n\n* DSC Composite Resources are not supported.\n* DSC requires PowerShell `Execution Policy` for the `LocalMachine` scope to be set to a less restrictive setting than `Restricted`. Because of this, you may encounter the error below:\n\n  ~~~\n  Error: /Stage[main]/Main/Dsc_xgroup[testgroup]: Could not evaluate: Importing module MSFT_xGroupResource failed with\n  error - File C:\\Program\n  Files\\WindowsPowerShell\\Modules\\PuppetVendoredModules\\xPSDesiredStateConfiguration\\DscResources\\MSFT_xGroupR\n  esource\\MSFT_xGroupResource.psm1 cannot be loaded because running scripts is disabled on this system. For more\n  information, see about_Execution_Policies at http://go.microsoft.com/fwlink/?LinkID=135170.\n  ~~~\n\n* You cannot use forward slashes for the MSI `Path` property for the `Package` DSC Resource. The underlying implementation does not accept forward slashes instead of backward slashes in paths, and it throws a misleading error that it could not find a Package with the Name and ProductId provided.\n\n* When PowerShell [Script Block Logging](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_logging_windows?view=powershell-7.4#enabling-script-block-logging) is enabled, data marked as sensitive in your manifest may appear in these logs as plain text. It is **highly recommended**, by both Puppet and Microsoft, that you also enable [Protected Event Logging](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_logging_windows?view=powershell-7.4#protected-event-logging) alongside this to encrypt the logs to protect this information.\n\n### Known Issues\n\n`--noop` mode, `puppet resource` and property change notifications are currently not implemented.\n\n### Running Puppet and DSC without administrative privileges\n\nWhile there are options for using Puppet with a non-administrative account, DSC is limited to accounts with administrative privileges. The underlying CIM implementation DSC uses for DSC Resource invocation, and the Invoke-DscResource cmdlet, require administrative credentials.\n\nThe Puppet agent on a Windows node can run DSC with a normal default install. If the Puppet agent is configured to use an alternate user account, it must have administrative privileges on the system to run DSC.\n\n## Troubleshooting\n\nWhen Puppet runs, the dsc_lite module takes the code supplied in your Puppet manifest and converts it into PowerShell code that is sent directly to the DSC engine using `Invoke-DscResource`. You can see both the commands sent and the result of this by running Puppet interactively, for example, `puppet apply --debug`. It outputs the PowerShell code that is sent to DSC to execute and return data from DSC. For example:\n\n```puppet\nNotice: Compiled catalog for win2012r2 in environment production in 0.82 seconds\nDebug: Creating default schedules\nDebug: Loaded state in 0.03 seconds\nDebug: Loaded state in 0.05 seconds\nInfo: Applying configuration version '1475264065'\nDebug: Reloading posix reboot provider\nDebug: Facter: value for uses_win32console is still nil\nDebug: PowerShell Version: 5.0.10586.117\n$invokeParams = @{\nName          = 'ExampleDSCResource'\nMethod        = 'test'\nProperty      = @{\nproperty1 = 'value1'\nproperty2 = 'value2'\n}\nModuleName = 'ExampleDscResourceModule'\n}\n############### SNIP ################\nDebug: Waited 50 milliseconds...\n############### SNIP ################\nDebug: Waited 500 total milliseconds.\nDebug: Dsc Resource returned: {\"rebootrequired\":false,\"indesiredstate\":false,\"errormessage\":\"\"}\nDebug: Dsc Resource Exists?: false\nDebug: ensure: present\n############### SNIP ################\n$invokeParams = @{\nName          = 'ExampleDSCResource'\nMethod        = 'set'\nProperty      = @{\nproperty1 = 'value1'\nproperty2 = 'value2'\n}\nModuleName = 'ExampleDscResourceModule'\n}\n############### SNIP ################\\\nDebug: Waited 100 total milliseconds.\nDebug: Create Dsc Resource returned: {\"rebootrequired\":false,\"indesiredstate\":true,\"errormessage\":\"\"}\nNotice: /Stage[main]/Main/Dsc_exampledscresource[foober]/ensure: invoked\nDebug: /Stage[main]/Main/Dsc_exampledscresource[foober]: The container Class[Main] will propagate my refresh event\nDebug: Class[Main]: The container Stage[main] will propagate my refresh event\nDebug: Finishing transaction 56434520\nDebug: Storing state\nDebug: Stored state in 0.10 seconds\n############### SNIP ################\n```\n\nThis shows us that there wasn't a problem parsing the manifest and turning it into a command to send to DSC. It also shows that there are two commands/operations for every DSC Resource executed, a SET and a test. DSC operates in two stages, it first tests if a system is in the desired state, and then it sets the state of the system to the desired state. You can see the result of each operation in the debug log.\n\nBy using the debug logging of a Puppet run, you can troubleshoot the application of DSC Resources during the development of your Puppet manifests.\n\n## Development\n\nAcceptance tests for this module leverage [puppet_litmus](https://github.com/puppetlabs/puppet_litmus).\nTo run the acceptance tests follow the instructions [here](https://puppetlabs.github.io/content-and-tooling-team/docs/litmus/).\nYou can also find a tutorial and walkthrough of using Litmus and the PDK on [YouTube](https://www.youtube.com/watch?v=FYfR7ZEGHoE).\n\nIf you run into an issue with this module, or if you would like to request a feature, please [raise an issue](https://github.com/puppetlabs/puppetlabs-dsc_lite/issues).\nEvery Monday the Puppet IA Content Team has [office hours](https://puppet.com/community/office-hours) in the [Puppet Community Slack](http://slack.puppet.com/), alternating between an EMEA friendly time (1300 UTC) and an Americas friendly time (0900 Pacific, 1700 UTC).\n\nIf you have problems getting this module up and running, please [contact Support](http://puppetlabs.com/services/customer-support).\n\nIf you submit a change to this module, be sure to regenerate the reference documentation as follows:\n\n```bash\npuppet strings generate --format markdown --out REFERENCE.md\n```\n\n### Contributors\n\nTo see who's already involved, see the [list of contributors.](https://github.com/puppetlabs/puppetlabs-dsc/graphs/contributors)\n\n## Learn More About DSC\n\nYou can learn more about PowerShell DSC from the following online resources:\n\n- [Microsoft PowerShell Desired State Configuration Overview](https://msdn.microsoft.com/en-us/PowerShell/dsc/overview) - Starting point for DSC topics\n- [Microsoft PowerShell DSC Resources page](https://msdn.microsoft.com/en-us/powershell/dsc/resources) - For more information about built-in DSC Resources\n- [Microsoft PowerShell xDSCResources Github Repo](https://github.com/PowerShell/DscResources) -  For more information about xDscResources\n- [Windows PowerShell Blog](http://blogs.msdn.com/b/powershell/archive/tags/dsc/) - DSC tagged posts from the Microsoft PowerShell Team\n- [Using Puppet and DSC to Report on Environment Change - PuppetConf 10-2017 talk](https://youtu.be/dR8VJjDmo9c) and [slides](https://speakerdeck.com/jpogran/using-puppet-and-dsc-to-report-on-environment-change)\n- [Puppet Inc Windows DSC \u0026 WSUS Webinar 9-17-2015 webinar](https://puppet.com/webinars/windows-dsc-wsus-webinar-09-17-2015) - How DSC works with Puppet\n- [Better Together: Managing Windows with Puppet, PowerShell and DSC - PuppetConf 10-2015 talk](https://www.youtube.com/watch?v=TP0zqe-yQto) and [slides](https://speakerdeck.com/iristyle/better-together-managing-windows-with-puppet-powershell-and-dsc)\n- [PowerShell.org](http://powershell.org/wp/tag/dsc/) - Community based DSC tagged posts\n- [PowerShell Magazine](http://www.powershellmagazine.com/tag/dsc/) - Community based DSC tagged posts\n\nThere are several books available as well. Here are some selected books for reference:\n\n- [Learning PowerShell DSC 2nd Edition](https://www.packtpub.com/networking-and-servers/learning-powershell-dsc-second-edition) - James Pogran is a member of the team here at Puppet Inc working on the DSC/Puppet integration\n- [The DSC Book](https://www.penflip.com/powershellorg/the-dsc-book) - Powershell.org community contributed content\n- [Pro PowerShell Desired State Configuration](https://www.apress.com/us/book/9781484234822) - Ravikanth Chaganti\n\n## License\n\n* Copyright (c) 2014 Marc Sutter, original author\n* Copyright (c) 2015 - Present Puppet Inc\n* License: [Apache License, Version 2.0](https://github.com/puppetlabs/puppetlabs-dsc/blob/master/LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpuppetlabs%2Fpuppetlabs-dsc_lite","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpuppetlabs%2Fpuppetlabs-dsc_lite","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpuppetlabs%2Fpuppetlabs-dsc_lite/lists"}