[30] Window PowerShell DSC 学习系列----如何解决跨节点(across computers)依赖?

原创 2017年06月15日 21:28:05

在用Window PowerShell DSC管理服务器的时候,会遇到下面的类似的场景,比如,先在一台域控制服务器上安装域控(Active Directory),等域控制服务器A安装好后,在把另外一台机器B加入到域控服务器A中;还有一种常见的场景是,比如,先安装数据库服务器,然后在安装应用服务器;不管是何种情况都牵涉到了跨机器间的依赖;刚好,在DSC5.x中提供了一个DSC的资源专门做这个事情,这个资源就是WaitForAll,WaitForAny以及WaitForSome。下面咱们先看一个简单的例子。

Configuration WaitForDemo {

  Import-DscResource -ModuleName PSDesiredStateConfiguration

    Node doTestAction
    {
        File  backupFile{
          Ensure="Present"
          Checksum="SHA-1"
          Type="Directory"
          Recurse=$true
          SourcePath="C:\software"
          DestinationPath="C:\softwareBak";
        }
    }

    Node doWaitForAction
    {

        WaitForAll ComputerA
        {
            ResourceName      = '[File]backupFile'
            NodeName          = 'computerA'
            RetryIntervalSec  = 15
            RetryCount        = 30
        }

        File  generateFile{
          Ensure="Present";
          Contents="Waitfor test";
          DestinationPath="C:\test\hellowworld4.txt"
          DependsOn        ='[WaitForAll]ComputerA
'
        }
    }
}
$mofPath="C:\Program Files\WindowsPowerShell\DscService\Configuration"
WaitForDemo -OutputPath $mofPath
New-DscCheckSum -ConfigurationPath $mofPath
New-DscCheckSum -ConfigurationPath "C:\Program Files\WindowsPowerShell\DscService\Modules"


上面的Configuration文件会生成2个MOF文件:doTestAction.mof和doWaitForAction.mof文件。

其中让computerA在注册DSC Pull服务器的时候,注册doTestAction.mof,computerB注册doWaitForAction.mof文件。

不知道大家发现没有,在Node doWaitForAction的配置中,我们显式的依赖了computerA的backupFile的Resource,也就是说必须等ComputerA的backupFile的DSC的resource的状态返回True的时候,computerB的generateFile的DSC resource才会被执行。


好了,原理说完了,例子也说完了;但是不知道大家有没有想过,为什么computerB知道ComputerA的任务已经完成了呢?是ComputerB通过DSC Pull服务器不断查询DSC的Report服务器得到的结果吗?还是computerB直接调用ComputerA的某项服务器查询ComputerA的backupFile的DSC的resource的状态是否已经返回True了呢。

笔者通过抓包工具发现,其实是computerB直接调用ComputerA的某项服务器查询ComputerA的backupFile的DSC的resource的状态是否已经返回True。具体过程咱们来分析。


从上图可以看出,经过三次TCP/IP握手之后,computerB会给computer发送一个HTTP 的Post的请求。请求的URI为wsman,端口的5985

那么到底发送了什么消息呢?

POST /wsman HTTP/1.1
Connection: Keep-Alive
Content-Type: application/soap+xml;charset=UTF-8
User-Agent: Microsoft WinRM Client
Content-Length: 1614
Host: computerA:5985

<?xml version="1.0" encoding="utf-8"?>

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:w="http://schemas.dmtf.org
/wbem/wsman/1/wsman.xsd" xmlns:p="http://schemas.microsoft.com/wbem/wsman/1/wsman.xsd">
  <s:Header>
    <a:To>http://computerA:5985/wsman</a:To>
    <w:ResourceURI s:mustUnderstand="true">http://schemas.microsoft.com/wbem/wsman/1/wmi/root/microsoft/windows/DesiredStateConfigurationProxy/
MSFT_DscProxy</w:ResourceURI>
    <a:ReplyTo>
      <a:Address s:mustUnderstand="true">http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address>
    </a:ReplyTo>
    <a:Action s:mustUnderstand="true">http://schemas.microsoft.com/wbem/wsman/1/wmi/root/microsoft/windows/DesiredStateConfigurationProxy/MSFT_DscProxy/
GetResourceState</a:Action>
    <w:MaxEnvelopeSize s:mustUnderstand="true">512000</w:MaxEnvelopeSize>
    <a:MessageID>uuid:DBB05C5C-5E11-498D-888E-D55F627DE47D</a:MessageID>
    <w:Locale xml:lang="en-US" s:mustUnderstand="false"/>
    <p:DataLocale xml:lang="en-US" s:mustUnderstand="false"/>
    <p:SessionId s:mustUnderstand="false">uuid:BD34BBB3-A6E3-44E9-A098-F48C7A564C34</p:SessionId>
    <p:OperationID s:mustUnderstand="false">uuid:FC2CD0FE-B9A4-4167-890C-8FC937C2D487</p:OperationID>
    <p:SequenceId s:mustUnderstand="false">1</p:SequenceId>
    <w:OperationTimeout>PT60.000S</w:OperationTimeout>
  </s:Header>
  <s:Body>
    <p:GetResourceState_INPUT xmlns:p="http://schemas.microsoft.com/wbem/wsman/1/wmi/root/microsoft/windows/DesiredStateConfigurationProxy/MSFT_DscProxy">
      <p:ConfigurationData>WwBGAGkAbABlAF0AYgBhAGMAawB1AHAAQwBNAFMA</p:ConfigurationData>
    </p:GetResourceState_INPUT>
  </s:Body>
</s:Envelope>


那么返回的结果呢?

HTTP/1.1 200 
Content-Type: application/soap+xml;charset=UTF-8
Server: Microsoft-HTTPAPI/2.0
Date: Wed, 07 Jun 2017 20:32:14 GMT
Connection: close
Content-Length: 1207


<?xml version="1.0" encoding="utf-8"?>


<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:x="http://schemas.xmlsoap.
org/ws/2004/09/transfer" xmlns:w="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd" xmlns:p="http://schemas.microsoft.com/wbem/wsman/1/wsman.xsd" 
xml:lang="en-US">
  <s:Header>
    <a:Action>http://schemas.microsoft.com/wbem/wsman/1/wmi/root/microsoft/windows/DesiredStateConfigurationProxy/MSFT_DscProxy/GetResourceStateResponse
</a:Action>
    <a:MessageID>uuid:68F10B95-1BF1-414C-95FD-12FDC89A5D7D</a:MessageID>
    <p:OperationID s:mustUnderstand="false">uuid:FC2CD0FE-B9A4-4167-890C-8FC937C2D487</p:OperationID>
    <p:SequenceId>1</p:SequenceId>
    <a:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:To>
    <a:RelatesTo>uuid:DBB05C5C-5E11-498D-888E-D55F627DE47D</a:RelatesTo>
  </s:Header>
  <s:Body>
    <p:GetResourceState_OUTPUT xmlns:p="http://schemas.microsoft.com/wbem/wsman/1/wmi/root/microsoft/windows/desiredstateconfigurationproxy/MSFT_DscProxy"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cim="http://schemas.dmtf.org/wbem/wscim/1/common">
      <p:state>true</p:state>
      <p:ReturnValue>0</p:ReturnValue>
    </p:GetResourceState_OUTPUT>
  </s:Body>
</s:Envelope>


从上面可以查看出,其会返回一个state和returnvalue,从而知道是否所依赖的computerA节点的相应的DSC 资源(Resource)已经执行成功了。







版权声明:本文为博主原创文章,未经博主允许不得转载。

[1] Window PowerShell DSC 学习系列----DSC的定义和2种架构模式

PowerShell DSC是PowerShell的一部分,是一个新的管理平台,英文全称为,PowerShell Desired Status Configuration,翻译成中文就是理想管理配置状...
  • chancein007
  • chancein007
  • 2017年01月09日 23:09
  • 1587

[22]Window PowerShell DSC学习系列---- 如何用PowerShell脚本查看DSC服务器的执行报表(Report)

本文只适合DSC 5.x的版本。我们知道在DSC 5.x的版本中,Pull服务器和Report是安装在一起的。那么当目标节点注册成功到Pull和Report服务器之后,且Pull服务器上的MOF和Re...
  • chancein007
  • chancein007
  • 2017年02月14日 13:45
  • 1716

2014 30 天学习 30 种新技术系列

30 天学习 30 种新技术系列Noodles001 2.5k 2013年12月02日 发布推荐 37 推荐收藏 465 收藏,54.6k 浏览编者注:我们发现了比较有趣的系列文章《30 天学习 30...
  • berryreload
  • berryreload
  • 2015年05月30日 08:43
  • 1070

[5] Window PowerShell DSC 学习系列----如何生成一个DSC MOF文件?

在前面的四个章节,笔者介绍了一些PowerShell基础的知识,包括PowerShell DSC的基本架构,DSC的资源以及配置格式,已经在PowerShell DSC 如何安装扩展的DSC Modu...
  • chancein007
  • chancein007
  • 2017年01月23日 16:07
  • 1447

[25]Window PowerShell DSC学习系列----如何更换DSC Pull服务器数据库为Access数据库?

我们知道,PowerShell DSC的默认数据库为ESENT文件数据库;或者oleDB形式的Access数据库(数据库文件后缀名为:mdb). 默认安装方式下,如果用xDscWebService D...
  • chancein007
  • chancein007
  • 2017年04月10日 22:24
  • 1968

[10] Window PowerShell DSC 学习系列----目标节点和Pull 服务器底层通信原理剖析

在本节中,笔者将会用wireshark抓包,并分析目标节点如何和Pull 服务器通信的?注意笔者本机装的Window Management Framework 5.1,如果是其他的版本,可能请求的UR...
  • chancein007
  • chancein007
  • 2017年01月25日 13:45
  • 2027

[29] Window PowerShell DSC 学习系列----如何备份数据库和解决一个MS Server 2008上的大坑?

有的时候我们需要定期的备份数据库,而DSC刚好就能非常好的做这个事情。DSC中有一个xSQLServer Module,里面提供了许多操作数据库的方法。但是里面没有任何一个DSC Resource能够...
  • chancein007
  • chancein007
  • 2017年05月24日 20:34
  • 2268

使用 window.name 解决跨域问题

window.name 传输技术,原本是 Thomas Frank 用于解决 cookie 的一些劣势(每个域名 4 x 20 Kb 的限制、数据只能是字符串、设置和获取 cookie 语法的复杂...
  • fengri5566
  • fengri5566
  • 2016年08月03日 17:27
  • 4736

跨域解决方法之window.name

window.name 跨域请求 方法
  • u013558749
  • u013558749
  • 2017年02月24日 23:54
  • 1245

前端解决跨域问题的8种方案(最新最全)

原文:http://www.cnblogs.com/JChen666/p/3399951.html 1.同源策略如下: URL 说明 是否允许通信 ...
  • u013521220
  • u013521220
  • 2017年05月19日 18:03
  • 523
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[30] Window PowerShell DSC 学习系列----如何解决跨节点(across computers)依赖?
举报原因:
原因补充:

(最多只允许输入30个字)