The IAC team has been hard at work over the past week. Here’s a brief overview of what we’ve been up to:

New Module Releases (IAC Team)

Let’s kick things off by highlighting a new module release:

Community Contributions

As always, we work hand-in-hand with the broader Puppet community to get work done. This week, we want to take a moment to highlight a few PRs and the people behind them!

First up, a pull request to the puppetlabs/docker module by Sergey Ivanov. Sergey’s work enabled the module to function transparently on RedHat systems utilizing the podman-docker package!. Thank you, Sergey!

We’d like to thank Atanas Stoyanov for his fix to the Apache module. This PR ensures that the custom ldap options in /etc/apache2/mods can actually be applied and loaded, fixing a previously unknown bug! Thank you, Atanas!

Finally, big Thanks to Frank Wall for his PR that will fix MODULES-10023, ensuring that the xtrabackup functionality in puppetlabs/mysql actually works as intended! Thank you, Frank!

Supported Module Litmus Conversion

On the topic of Litmus, we’re continuing to make progress on the conversion of all supported modules to the framework:

Puppet + DSC: Phase II Begins!

We have continued to make excellent progress on our refactor of DSC support in Puppet as we step in Phase II! To find out what we’re doing, the reasoning behind it and why we’re SUPER EXCITED about this, check out my earlier blog post

The technical work this week has largely been in the de-prototyping details as we work to convert the prototype build script into a supportable PowerShell module. We scaffolded the module out using Fred Weinmann’s PSFramework module, giving us some nice automatic testing and a bunch of options to improve UX down the road (including layered configurations and tab completion). We added our first sets of test code, added a Vagrantfile to the repository to make the development process easier on our team, and enabled on-PR testing in Appveyor to ensure we don’t introduce regressions.

Work is currently underway to decompose the module vendoring code from the build script into a function in the module for ease of maintenance and testability. Additionally, the replacement of the extant templating engine is also underway to reduce complexity and dependencies for the module.

But the biggest milestone this week has been bringing on board Puppet’s own Gene Liverman, John O’Connor, and the rest of our Developer Infrastructre & Operations Team as Customer 0 for this work, ensuring that we get live feedback as early as possible for our updated methodology. We sent them beta versions of both the NetworkingDsc and UpdateServicesDsc PowerShell modules, puppetized!

That will let them test out replacing profiles like this:

define profile::network::windows_interface (
  Array[Stdlib::IP::Address]    $ipaddress,
  String[1]                     $interfacealias,
  Enum['IPv4','IPv6']           $addressfamily = 'IPv4',
  Optional[Stdlib::IP::Address] $gw_address = undef,
){

  include profile::network::windows_install_dsc_modules

  dsc {"${name}-ip-address":
    resource_name => 'IPAddress',
    module        => 'NetworkingDsc',
    properties    => {
      ipaddress      => $ipaddress,
      interfacealias => $interfacealias,
      addressfamily  => $addressfamily,
    },
    require       => Class['profile::network::windows_install_dsc_modules'],
  }

  if $gw_address {
    dsc {"${name}-default-gw":
      resource_name => 'DefaultGatewayAddress',
      module        => 'NetworkingDsc',
      properties    => {
        address        => $gw_address,
        interfacealias => $interfacealias,
        addressfamily  => $addressfamily,
      },
      require       => Class['profile::network::windows_install_dsc_modules'],
    }
  }
}

With one using the beta modules, like this!

define profile::network::windows_interface (
  Array[Stdlib::IP::Address]    $ipaddress,
  String[1]                     $interfacealias,
  Enum['IPv4','IPv6']           $addressfamily = 'IPv4',
  Optional[Stdlib::IP::Address] $gw_address = undef,
){

  dsc_ipaddress {"${name}-ip-address":
    dsc_ipaddress      => $ipaddress,
    dsc_interfacealias => $interfacealias,
    dsc_addressfamily  => $addressfamily,
  }

  if $gw_address {
    dsc_defaultgatewayaddress {"${name}-default-gw":
      dsc_address        => $gw_address,
      dsc_interfacealias => $interfacealias,
      dsc_addressfamily  => $addressfamily,
    }
  }
}

If you’re interested in joining our beta program, which we will be launching in earnest after Easter, please email us (dsc@puppet.com) and let us know:

  1. What are the top three PowerShell modules with DSC resources you’d like to see Puppetized?
  2. Are you interested in joining our beta test group for this ongoing project?

If you just wanna keep an eye on things, you can follow the repository on GitHub and the parent epic in JIRA!

PowerShell 101 Training

In addition to helping oversee the DSC work, Michael just wrapped up running the team through his [PowerShell 101 Course][pwshop], which focuses on helping with the “blinking cursor” problem:

Help! I’m in a PowerShell prompt and have no idea what to do from here!

It’s meant not to turn you into a comprehensive PowerShell scripter but to get you up, running, and reasonably effective in a few hours. It includes 12 lessons and 20 sets of exercises and is available right now, and for the duration of the impacts from COVID-19, for free. If you’ve been thinking about learning about this (more than decade old, now!) young shell that the Windowsy devops crowd has been talking about, this is a good way to get started.

I’ve been helping to level up the team on PowerShell over the past several weeks as the DSC work becomes a serious focus and to generally help the team improve our Windows support skills.