استخدام خادم تقرير DSC

ينطبق على: Windows PowerShell 5.0

هام

خادم السحب (Windows Feature DSC-Service) هو مكون مدعوم من Windows Server ولكن لا توجد خطط لتقديم ميزات أو قدرات جديدة. نود أن تعرف أن إصدارا أحدث من DSC متاح الآن بشكل عام، تتم إدارته بواسطة ميزة Azure Policy المسماة تكوين الضيف. تجمع خدمة تكوين الضيف ميزات ملحق DSC وAzure Automation State Configuration والميزات الأكثر شيوعاً المطلوبة من ملاحظات العملاء. يتضمن تكوين الضيف أيضاً دعم الجهاز المختلط من خلال الخوادم الممكنة بواسطة Arc.

يمكن تكوين Configuration Manager المحلي (LCM) للعقدة لإرسال تقارير حول حالة التكوين الخاصة بها إلى خادم سحب يمكن الاستعلام عنه بعد ذلك لاسترداد تلك البيانات. في كل مرة تتحقق فيها العقدة من التكوين وتطبقه، ترسل تقريرا إلى خادم التقرير. يتم تخزين هذه التقارير في قاعدة بيانات على الخادم، ويمكن استردادها عن طريق استدعاء خدمة ويب التقارير. يحتوي كل تقرير على معلومات مثل التكوينات التي تم تطبيقها وما إذا كانت قد نجحت، والموارد المستخدمة، وأي أخطاء تم طرحها، وأوقات البدء والانتهاء.

تكوين عقدة لإرسال التقارير

يمكنك إخبار العقدة بإرسال تقارير إلى خادم باستخدام كتلة ReportServerWeb في تكوين LCM للعقدة (للحصول على معلومات حول تكوين LCM، راجع تكوين Configuration Manager المحلي). يجب إعداد الخادم الذي ترسل إليه العقدة التقارير كخادم سحب ويب (لا يمكنك إرسال تقارير إلى مشاركة SMB). للحصول على معلومات حول إعداد خادم سحب، راجع إعداد خادم سحب ويب DSC. يمكن أن يكون خادم التقرير نفس الخدمة التي تسحب منها العقدة التكوينات وتحصل على الموارد، أو يمكن أن تكون خدمة مختلفة.

في كتلة ReportServerWeb ، يمكنك تحديد عنوان URL لخدمة السحب ومفتاح تسجيل معروف للخادم.

يقوم التكوين التالي بتكوين عقدة لسحب التكوينات من خدمة واحدة، وإرسال التقارير إلى خدمة على خادم مختلف.

[DSCLocalConfigurationManager()]
configuration ReportClientConfig
{
    Node localhost
    {
        Settings
        {
            RefreshMode          = 'Pull'
            RefreshFrequencyMins = 30
            RebootNodeIfNeeded   = $true
        }

        ConfigurationRepositoryWeb CONTOSO-PullSrv
        {
            ServerURL          = 'https://CONTOSO-PULL:8080/PSDSCPullServer.svc'
            RegistrationKey    = 'bbb9778f-43f2-47de-b61e-a0daff474c6d'
            ConfigurationNames = @('ClientConfig')
        }

        ReportServerWeb CONTOSO-ReportSrv
        {
            ServerURL               = 'http://CONTOSO-REPORT:8080/PSDSCPullServer.svc'
            RegistrationKey         = 'ba39daaa-96c5-4f2f-9149-f95c46460faa'
            AllowUnsecureConnection = $true
        }
    }
}

ReportClientConfig

يقوم التكوين التالي بتكوين عقدة لاستخدام خادم واحد للتكوينات والموارد وإعداد التقارير.

[DSCLocalConfigurationManager()]
configuration PullClientConfig
{
    Node localhost
    {
        Settings
        {
            RefreshMode = 'Pull'
            RefreshFrequencyMins = 30
            RebootNodeIfNeeded = $true
        }

        ConfigurationRepositoryWeb CONTOSO-PullSrv
        {
            ServerURL = 'https://CONTOSO-PullSrv:8080/PSDSCPullServer.svc'
            RegistrationKey = 'fbc6ef09-ad98-4aad-a062-92b0e0327562'
        }



        ReportServerWeb CONTOSO-ReportSrv
        {
            ServerURL = 'https://CONTOSO-PullSrv:8080/PSDSCPullServer.svc'
        }
    }
}
PullClientConfig

ملاحظة

يمكنك تسمية خدمة الويب ما تريد عند إعداد خادم سحب، ولكن يجب أن تتطابق الخاصية ServerURL مع اسم الخدمة.

الحصول على بيانات التقرير

يتم إدخال التقارير المرسلة إلى خادم السحب في قاعدة بيانات على الخادم. تتوفر التقارير من خلال المكالمات إلى خدمة الويب. لاسترداد التقارير لعقدة معينة، أرسل طلب HTTP إلى خدمة ويب التقرير في النموذج التالي:

http://CONTOSO-REPORT:8080/PSDSCReportServer.svc/Nodes(AgentId='MyNodeAgentId')/Reports

أين MyNodeAgentId هو AgentId للعقدة التي تريد الحصول على تقارير لها. يمكنك الحصول على AgentID لعقدة عن طريق استدعاء Get-DscLocalConfigurationManager على تلك العقدة.

يتم إرجاع التقارير كصفيف من عناصر JSON.

يقوم البرنامج النصي التالي بإرجاع تقارير العقدة التي يتم تشغيلها عليها:

function GetReport
{
    param
    (
        $AgentId = "$((glcm).AgentId)",
        $serviceURL = "http://CONTOSO-REPORT:8080/PSDSCPullServer.svc"
    )

    $invokeWebRequestSplat = @{
        Uri = "$serviceURL/Nodes(AgentId= '$AgentId')/Reports"
        ContentType = "application/json;odata=minimalmetadata;streaming=true;charset=utf-8"
        UseBasicParsing = $true
        Headers = @{Accept = "application/json"; ProtocolVersion = "2.0"}
        ErrorAction = 'SilentlyContinue'
        ErrorVariable = 'ev'
    }

    $request = Invoke-WebRequest @invokeWebRequestSplat
    $object = ConvertFrom-Json $request.content
    return $object.value
}

عرض بيانات التقرير

إذا قمت بتعيين متغير إلى نتيجة الدالة GetReport ، يمكنك عرض الحقول الفردية في عنصر من الصفيف الذي يتم إرجاعه:

$reports = GetReport
$reports[1]
JobId                : 019dfbe5-f99f-11e5-80c6-001dd8b8065c
OperationType        : Consistency
RefreshMode          : Pull
Status               : Success
ReportFormatVersion  : 2.0
ConfigurationVersion : 2.0.0
StartTime            : 04/03/2016 06:21:43
EndTime              : 04/03/2016 06:22:04
RebootRequested      : False
Errors               : {}
StatusData           : {{"StartDate":"2016-04-03T06:21:43.7220000-07:00","IPV6Addresses":["2001:4898:d8:f2f2:852b:b255:b071:283b","fe80::852b:b255:b071
                       :283b%12","::2000:0:0:0","::1","::2000:0:0:0"],"DurationInSeconds":"21","JobID":"{019DFBE5-F99F-11E5-80C6-001DD8B8065C}","Curren
                       tChecksum":"A7797571CB9C3AF4D74C39A0FDA11DAF33273349E1182385528FFC1E47151F7F","MetaData":"Author: configAuthor; Name:
                       Sample_ArchiveFirewall; Version: 2.0.0; GenerationDate: 04/01/2016 15:23:30; GenerationHost: CONTOSO-PullSrv;","RebootRequested":"False
                       ","Status":"Success","IPV4Addresses":["10.240.179.151","127.0.0.1"],"LCMVersion":"2.0","ResourcesNotInDesiredState":[{"SourceInf
                       o":"C:\\ReportTest\\Sample_xFirewall_AddFirewallRule.ps1::23::9::xFirewall","ModuleName":"xNetworking","DurationInSeconds":"8.785",
                       "InstanceName":"Firewall","StartDate":"2016-04-03T06:21:56.4650000-07:00","ResourceName":"xFirewall","ModuleVersion":"2.7.0.0","
                       RebootRequested":"False","ResourceId":"[xFirewall]Firewall","ConfigurationName":"Sample_ArchiveFirewall","InDesiredState":"False
                       "}],"NumberOfResources":"2","Type":"Consistency","HostName":"CONTOSO-PULLCLI","ResourcesInDesiredState":[{"SourceInfo":"C:\\ReportTest\\Sample_xFirewall_AddFirewallRule.ps1::16::9::Archive","ModuleName":"PSDesiredStateConfiguration","DurationInSeconds":"1.848",
                       "InstanceName":"ArchiveExample","StartDate":"2016-04-03T06:21:56.4650000-07:00","ResourceName":"Archive","ModuleVersion":"1.1","
                       RebootRequested":"False","ResourceId":"[Archive]ArchiveExample","ConfigurationName":"Sample_ArchiveFirewall","InDesiredState":"T
                       rue"}],"MACAddresses":["00-1D-D8-B8-06-5C","00-00-00-00-00-00-00-E0"],"MetaConfiguration":{"AgentId":"52DA826D-00DE-4166-8ACB-73F2B46A7E00",
                       "ConfigurationDownloadManagers":[{"SourceInfo":"C:\\ReportTest\\LCMConfig.ps1::14::9::ConfigurationRepositoryWeb","A
                       llowUnsecureConnection":"True","ServerURL":"http://CONTOSO-PullSrv:8080/PSDSCPullServer.svc","RegistrationKey":"","ResourceId":"[Config
                       urationRepositoryWeb]CONTOSO-PullSrv","ConfigurationNames":["ClientConfig"]}],"ActionAfterReboot":"ContinueConfiguration","LCMCo
                       mpatibleVersions":["1.0","2.0"],"LCMState":"Idle","ResourceModuleManagers":[],"ReportManagers":[{"AllowUnsecureConnection":"True
                       ","RegistrationKey":"","ServerURL":"http://CONTOSO-PullSrv:8080/PSDSCPullServer.svc","ResourceId":"[ReportServerWeb]CONTOSO-PullSrv","S
                       ourceInfo":"C:\\ReportTest\\LCMConfig.ps1::24::9::ReportServerWeb"}],"StatusRetentionTimeInDays":"10","LCMVersion":"2.0","Config
                       urationMode":"ApplyAndMonitor","RefreshFrequencyMins":"30","RebootNodeIfNeeded":"True","RefreshMode":"Pull","DebugMode":["NONE"]
                       ,"LCMStateDetail":"","AllowModuleOverwrite":"False","ConfigurationModeFrequencyMins":"15"},"Locale":"en-US","Mode":"Pull"}}
AdditionalData       : {}

بشكل افتراضي، يتم فرز التقارير حسب JobID. للحصول على أحدث تقرير، يمكنك فرز التقارير حسب خاصية StartTime التنازلية، ثم الحصول على العنصر الأول من الصفيف:

$reportsByStartTime = $reports | Sort-Object {$_."StartTime" -as [DateTime] } -Descending
$reportMostRecent = $reportsByStartTime[0]

لاحظ أن الخاصية StatusData هي كائن يحتوي على عدد من الخصائص. هذا هو المكان الذي يوجد فيه الكثير من بيانات التقارير. لنلق نظرة على الحقول الفردية لخاصية StatusData لآخر تقرير:

$statusData = $reportMostRecent.StatusData | ConvertFrom-Json
$statusData
StartDate                  : 2016-04-04T11:21:41.2990000-07:00
IPV6Addresses              : {2001:4898:d8:f2f2:852b:b255:b071:283b, fe80::852b:b255:b071:283b%12, ::2000:0:0:0, ::1...}
DurationInSeconds          : 25
JobID                      : {135D230E-FA92-11E5-80C6-001DD8B8065C}
CurrentChecksum            : A7797571CB9C3AF4D74C39A0FDA11DAF33273349E1182385528FFC1E47151F7F
MetaData                   : Author: configAuthor; Name: Sample_ArchiveFirewall; Version: 2.0.0; GenerationDate: 04/01/2016 15:23:30; GenerationHost:
                             CONTOSO-PullSrv;
RebootRequested            : False
Status                     : Success
IPV4Addresses              : {10.240.179.151, 127.0.0.1}
LCMVersion                 : 2.0
ResourcesNotInDesiredState : {@{SourceInfo=C:\ReportTest\Sample_xFirewall_AddFirewallRule.ps1::23::9::xFirewall; ModuleName=xNetworking;
                             DurationInSeconds=10.725; InstanceName=Firewall; StartDate=2016-04-04T11:21:55.7200000-07:00; ResourceName=xFirewall;
                             ModuleVersion=2.7.0.0; RebootRequested=False; ResourceId=[xFirewall]Firewall; ConfigurationName=Sample_ArchiveFirewall;
                             InDesiredState=False}}
NumberOfResources          : 2
Type                       : Consistency
HostName                   : CONTOSO-PULLCLI
ResourcesInDesiredState    : {@{SourceInfo=C:\ReportTest\Sample_xFirewall_AddFirewallRule.ps1::16::9::Archive; ModuleName=PSDesiredStateConfiguration;
                             DurationInSeconds=2.672; InstanceName=ArchiveExample; StartDate=2016-04-04T11:21:55.7200000-07:00; ResourceName=Archive;
                             ModuleVersion=1.1; RebootRequested=False; ResourceId=[Archive]ArchiveExample; ConfigurationName=Sample_ArchiveFirewall;
                             InDesiredState=True}}
MACAddresses               : {00-1D-D8-B8-06-5C, 00-00-00-00-00-00-00-E0}
MetaConfiguration          : @{AgentId=52DA826D-00DE-4166-8ACB-73F2B46A7E00; ConfigurationDownloadManagers=System.Object[];
                             ActionAfterReboot=ContinueConfiguration; LCMCompatibleVersions=System.Object[]; LCMState=Idle;
                             ResourceModuleManagers=System.Object[]; ReportManagers=System.Object[]; StatusRetentionTimeInDays=10; LCMVersion=2.0;
                             ConfigurationMode=ApplyAndMonitor; RefreshFrequencyMins=30; RebootNodeIfNeeded=True; RefreshMode=Pull;
                             DebugMode=System.Object[]; LCMStateDetail=; AllowModuleOverwrite=False; ConfigurationModeFrequencyMins=15}
Locale                     : en-US
Mode                       : Pull

من بين أمور أخرى، يظهر هذا أن أحدث تكوين يسمى موردين، وأن أحدهما كان في الحالة المطلوبة، وأحدهما لم يكن. يمكنك الحصول على إخراج أكثر قابلية للقراءة من الخاصية ResourcesNotInDesiredState فقط:

$statusData.ResourcesInDesiredState
SourceInfo        : C:\ReportTest\Sample_xFirewall_AddFirewallRule.ps1::16::9::Archive
ModuleName        : PSDesiredStateConfiguration
DurationInSeconds : 2.672
InstanceName      : ArchiveExample
StartDate         : 2016-04-04T11:21:55.7200000-07:00
ResourceName      : Archive
ModuleVersion     : 1.1
RebootRequested   : False
ResourceId        : [Archive]ArchiveExample
ConfigurationName : Sample_ArchiveFirewall
InDesiredState    : True

لاحظ أن هذه الأمثلة تهدف إلى منحك فكرة عما يمكنك القيام به مع بيانات التقرير. للحصول على مقدمة حول العمل مع JSON في PowerShell، راجع التشغيل باستخدام JSON وPowerShell.

راجع أيضاً

تكوين مدير التكوين المحلي

إعداد خادم سحب ويب DSC

إعداد عميل سحب باستخدام أسماء التكوين