编写配置脚本
一个配置脚本主要由三个部分组成:
- 主configuration块,包含其他所有内容
- 一个或者多个node段落,指定特定的目标节点,并且包含配置项
- 每个node段落都有一个或者多个配置项(Resource定义的),指定你想那些节点被设定成什么样
PowerShell ISE理解DSC的配置语法,是一个不错的编辑器。一定要注意的是:当你执行一个配置脚本,它就会创建一个文件夹和一个或者多个MOF文件。它将会在ISE现在指向的文件夹内实现。因此,在你开始写之前,你或许想要切换到ISE的控制台面板,并且更改(当前的工作)路径。否则,你可能会把文件写到 \Windows\System32下,那或许是不可取的。
这儿就是一个基本的配置脚本,你可以把它保存为MyConfig.ps1:
Configuration MonitoringSoftware
{
param(
[string[]]$ComputerName="localhost"
)
Node $ComputerName
{
File MonitoringInstallationFiles
{
Ensure ="Present"
SourcePath ="\\dc01\Software\Monitoring"
DestinationPath="C:\Temp\Monitoring"
Type ="Directory"
Recurse =$true
}
}
}
MonitoringSoftware
与此同时,有几件重要的事情正在发生:
- 顶层的Configuration结构很像一个PowerShell的Function。它包含整个配置,并且它确实是一种PowerShell指令。而这个configuration的名字MonitoringSoftware是随便取的,你可以以你任何喜欢的词汇来给它命名。
- 这个配置脚本支持-computername的参数,它默认是localhost。因此,当你运行这个配置的时候,你指定了你想它应用到的电脑的名字。把一堆电脑名字硬写到配置中也是一种选择。注意到这一点,像function里的参数一样,配置脚本参数也可以有一个[Parameter()]的属性以及很多有用的属性。这些可以被用做验证参数输入,强制参数,等等。想知道更多信息,请阅读about_functions_advanced_parameters帮助文件。
- Node元素指定了配置将要应用到的电脑。在这里,我们嵌入-computername参数的值。
- File关键字指一个特定的DSC Resource(WMF4搭载了File这个Resource)。这个配置项有一个名字,叫做MonitoringInstallationFiles,这个你可以自己命名。例如,我们可以叫它Fred,它仍然可以工作。
- 这个配置项包含5个设置(属性):Ensure,SourcePath, DestinationPath, Type,以及Recurse。这些事对这个File DSC Resource的声明;其他Resource也会有不一样的属性。在这个案例中我们要求DSC确认这个特定的目录层次结构在该目标节点上是存在的。如果不存在,我们会告诉DSC去哪儿找到它,那么它就可以把它拷贝到那儿。如果你需要的话,你也可以拷贝你自己的文件。
一个配置就是一个命令,因此脚本的最后一行就是在运行这个命令。我们没有提供一个-computername的参数,所以它将默认为localhost创建一个MOF文件。我们将得到一个文件夹名字叫做 MonitoringSoftwaare(这个配置的名字),并且它将包含Localhost.mof文件。
你会发现-ComputerName参数被定义为[string[]],意味着它可以接受多个值。我们可以提供多个值,并且对于每一个都可以生成一个MOF文件。例如:
MonitoringSoftware –ComputerName (
Get-ADComputer –Filter * -SearchBase "ou=clients,dc=domain,dc=pri" |
Select-Object –Expand Name)
这就会在Domain.pri域的OU客户端里的每台电脑下生成一个MOF文件。
配置中的多节点
你看到的网上的大部分例子将是一个Configuration块里仅仅包含一个Node段落。但是在一个配置里包含多个节点也是一种合法的场景。比如,设想你正在搭建一个包含几个服务器,一些客户端等等内容的实验室环境。你应该在一个配置脚本里包含实验室所有的电脑,用单个源管理整个配置。当你运行这个配置脚本的时候,PowerShell就会给里面提到的每个节点生成一个MOF文件。在这份指导接下来的例子里,我们也会包含一个多节点配置的例子。
寻找Resource
上面的例子可能会带来一个,又或者是两个问题:
- 我怎么知道我已经安装了什么Resource?
- 我怎么知道设置一个DSC Resource需要什么?
这两个都是不错的问题,也很容易解答。通过执行Get-DSCResource(如果这个命令没有起作用,你或许没有启动PowerShell v4)来开始。这将会列出所有加载到内存的Resource,包括那些Windows已经搭载了的。这个指令的输出包含在配置中我们要用的Resource的名字。一旦你只想了解一个你需要的Resource,比如说“Package”,你可以获取它的更多细节信息。运行Get-DSCResource –Name Package | Select –Expand Properties(把“Package”用你感兴趣的Resource名字替换掉)。你就会得到一段完整的属性,以及每个它期望的数据类型。在某些情况下,我们可以看到允许的值。比如,“Ensure”属性通常接受“Absent”和“Present”,用于决定你是否想这些东西在那儿,或者不在那儿。
另外一个选项,使用File模块为例,可以执行Get-DSCResource –Name File –Syntax。
这会产出了类似的输出,显示所有的Resource的属性设置,它们期望的值的种类,也包括一些属性可接受的值。
除此之外,PowerShell不一定为每个Resource提供一堆文档,因此你需要谷歌一些东西,但是至少Get-DscResource就给你提供了一个不错的起点。
你自己添加的Resource会让事情变得微妙起来。尽管它们被打包成了PowerShell脚本模块,但是它们却并不像模块那样运作,因此你不得不采取一些额外的步骤。首先,它们应该被放置在\Program Files\WindowsPowerShell\Modules下。这儿就是一个针对单个DSC Resource目录层次的例子:
你会看到:
- 模块名为xPSDesiredStateConfiguration。这个文件夹包含一个脚本模块以及一份模块说明(尽管你将看到不是所有的Resource都有这两个)。这里也会有个DSCResource的子文件夹。
- DSCResource子文件夹不包含任何文件。里面是模块提供的每个Resource对应的文件夹。
- MSFT_xDSCWebService子文件夹代表单个DSC Resource。它至少包括一个.psm1脚本和一个.schema.mof文件。要使用这个Resource,这两个脚本都是必要的。