How to use PowerShell and PowerShell modules in the enterprise

Question:

Recently, I’ve joined the Windows team in my enterprise and with my developer background (Java, .NET and Web in general), I was pretty quickly interested in PowerShell. I can see its value over plain old batch files, VB, … which is why I’d like to promote its usage and, little by little, push people to favor it over the rest unless there’s a reason not to do so.

Deploying PowerShell seems pretty straightforward since we can easily approve the relevant patches in WSUS and configure the execution policy via GPO for the AD integrated servers.

My questions are in fact more about the distribution and usage of PowerShell and PowerShell modules (e.g., PCSX, PowerShellPack, home made, …).

For those of you who have already deployed PowerShell in your enterprise:

  1. Do you have some sort of standard package for PowerShell with a set of modules that you deploy on each server? If you do, then how do you deploy new versions of the installed modules?
  2. Did you put a central PowerShell repository in place where you store all your PowerShell modules? If so, is that repository accessible globally or do you also secondary repositories that you synchronize?

    I’m pretty used to tools such as Maven, Ivy and other dependency management software, which is why I’m a bit disappointed by what PowerShell has to offer in this regard.

    I’ve found a very nice article about this subject and will probably go down the same path, as it corresponds to my requirements.

  3. Do you use WinRM? Do you connect directly from workstations or do you have central management servers? Did you limit access to WinRM to those management servers?
  4. Do you use WinRM in a non-managed environment (servers not in an AD domain)? How do you configure WinRM?

    We have a network zone in which the servers aren’t part of an AD domain, thus I can’t rely on the Kerberos authentication for WinRM.

  5. Globally, what is your experience, are you satisfied with the results?

Edit:
Regarding question 2, we’ve decided to put a central repository in place.

The idea will be to have a main repository which will be under version control (GIT) and to which we’ll be the only ones to have write access.

From that repository, we will copy the modules using an rsync like tool (in our case that’ll be robocopy) to other secondary repositories (which will be read-only copies). Only those repositories will be accessible by the clients (we’ll just have to update the PSModulePath on those clients to make sure they can access the repository).

We’ll also stage our releases, thus in the repository, there’ll be multiple versions available: Development, Integration and Production.

Answer:

Let’s cover each issue by category.

Evangelism

To start off interest in PowerShell to your coworkers, I would suggest starting off with the bread and butter of automation. Find a common pain point that is relatively easy to implement (to get something out there in front of your coworkers quickly) and automate it with PowerShell. Then expand from there.

Another good idea is to start a “Script Club” at your office where you do some training and share ideas or problems about scripting in PowerShell. You can start out with once every few weeks and see how it goes. At my work, we have a book club where we go through various technical books on testing, design, and programming, it works well.

Packaging

  • Modules – PowerShell modules are the best form of packaging. They are quite easy to use and offer some nice features such as easy deployment and private variables/functions.
  • Scripts – Scripts are a good idea for work-in-progress or to start off since your coworkers will certainly be comfortable with scripts.

Deployment

There are a few options currently for deployment.

  • Deploy to every machine – This could avoid some network issues and gives you more flexibility with each machine, but the downside is that updating modules may be more of a pain.
  • Central repository (a.k.a. a network share) – You could also store all your modules on a central network share. This would avoid issues with deploying to every machine and you can make the modules read-only if you want to control modifications. But you would still have to deploy a profile to each machine to add the network share to the $env:PSModulePath variable. It would be best to set this in the all-users-all-hosts profile. From then on you shouldn’t need to update it unless the path changes.
  • NuGetNuGet is an open source project that is bringing package management to .NET development. What is nice about it is the ability to have public repositories and local/private repositories. There is already an initial version of a PowerShell module that will leverage NuGet for PowerShell module deployment.

Remote Access

Being a build engineer, I have relatively few machines and full control over them. So I have remoting enabled. You would have to ask some IT guys for better advice.

Source:

How to use PowerShell and PowerShell modules in the enterprise by licensed under CC BY-SA | With most appropriate answer!

Leave a Reply