Sdílet prostřednictvím


Spuštění skriptu spuštění služby jako místní uživatel nebo systémový účet

Před spuštěním spustitelného souboru služby Service Fabric může být nutné spustit určitou konfiguraci nebo instalaci. Například konfigurace proměnných prostředí. Můžete zadat skript, který se má spustit před spuštěním spustitelného souboru služby v manifestu služby pro službu. Konfigurací zásad Spustit jako pro vstupní bod nastavení služby můžete změnit účet, pod kterým spustitelný soubor instalačního souboru běží. Samostatný vstupní bod nastavení umožňuje spustit konfiguraci s vysokými oprávněními po krátkou dobu, takže spustitelný soubor hostitele služby nemusí běžet s vysokými oprávněními po delší časové období.

Vstupní bod nastavení (SetupEntryPoint v manifestu služby) je privilegovaný vstupní bod, který ve výchozím nastavení běží se stejnými přihlašovacími údaji jako Service Fabric (obvykle účet NetworkService) před jakýmkoli jiným vstupním bodem. Spustitelný soubor určený službou EntryPoint je obvykle hostitelem dlouhotrvající služby. Spustitelný soubor EntryPointu se spustí po úspěšném ukončení spustitelného souboru SetupEntryPoint . Výsledný proces se monitoruje a restartuje a začne znovu s SetupEntryPointem, pokud se někdy ukončí nebo dojde k chybovému ukončení.

Konfigurace vstupního bodu nastavení služby

Následuje příklad jednoduchého manifestu služby pro bezstavovou službu, která určuje instalační skript MySetup.bat ve službě SetupEntryPoint. Argumenty se používají k předání argumentů skriptu při jeho spuštění.

<?xml version="1.0" encoding="utf-8"?>
<ServiceManifest Name="MyStatelessServicePkg"
                 Version="1.0.0"
                 xmlns="http://schemas.microsoft.com/2011/01/fabric"
                 xmlns:xsd="https://www.w3.org/2001/XMLSchema"
                 xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <Description>An example service manifest.</Description>
  <ServiceTypes>
    <StatelessServiceType ServiceTypeName="MyStatelessServiceType" />
  </ServiceTypes>

  <!-- Code package is your service executable. -->
  <CodePackage Name="Code" Version="1.0.0">
    <SetupEntryPoint>
      <ExeHost>
        <Program>MySetup.bat</Program>
        <Arguments>MyValue</Arguments>
        <WorkingFolder>Work</WorkingFolder>        
      </ExeHost>
    </SetupEntryPoint>
    <EntryPoint>
      <ExeHost>
        <Program>MyStatelessService.exe</Program>
      </ExeHost>
    </EntryPoint>
  </CodePackage>

  <ConfigPackage Name="Config" Version="1.0.0" />

  <Resources>
    <Endpoints>
      <Endpoint Name="ServiceEndpoint" />
    </Endpoints>
  </Resources>
</ServiceManifest>

Konfigurace zásad pro vstupní bod nastavení služby

Ve výchozím nastavení běží spustitelný soubor vstupního bodu služby pod stejnými přihlašovacími údaji jako Service Fabric (obvykle účet NetworkService ). V manifestu aplikace můžete změnit oprávnění zabezpečení ke spuštění spouštěcího skriptu pod místním systémovým účtem nebo účtem správce.

Konfigurace zásad pomocí místního systémového účtu

Následující příklad manifestu aplikace ukazuje, jak nakonfigurovat vstupní bod nastavení služby tak, aby běžel pod účtem správce uživatele (SetupAdminUser).

<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="MyApplicationType" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <Parameters>
    <Parameter Name="MyStatelessService_InstanceCount" DefaultValue="-1" />
  </Parameters>
  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="MyStatelessServicePkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides />
    <Policies>
      <RunAsPolicy CodePackageRef="Code" UserRef="SetupAdminUser" EntryPointType="Setup" />
    </Policies>
  </ServiceManifestImport>
  <DefaultServices>
    <Service Name="MyStatelessService" ServicePackageActivationMode="ExclusiveProcess">
      <StatelessService ServiceTypeName="MyStatelessServiceType" InstanceCount="[MyStatelessService_InstanceCount]">
        <SingletonPartition />
      </StatelessService>
    </Service>
  </DefaultServices>
  <Principals>
    <Users>
      <User Name="SetupAdminUser">
        <MemberOf>
          <SystemGroup Name="Administrators" />
        </MemberOf>
      </User>
    </Users>
  </Principals>
</ApplicationManifest>

Nejprve vytvořte oddíl Objekty zabezpečení s uživatelským jménem, například SetupAdminUser. Uživatelský účet SetupAdminUser je členem systémové skupiny Administrators.

Dále v části ServiceManifestImport nakonfigurujte zásadu, která použije tento objekt zabezpečení na SetupEntryPoint. Tato zásada říká Service Fabric, že při spuštění souboru MySetup.bat by se měl spustit jako SetupAdminUser (s oprávněními správce). Vzhledem k tomu, že jste na hlavní vstupní bod nepouplatili zásadu, kód v MyServiceHost.exe běží v rámci systémového účtu NetworkService. Toto je výchozí účet, který se spouští jako všechny vstupní body služby.

Konfigurace zásad pomocí místních systémových účtů

Často je vhodnější spustit spouštěcí skript pomocí místního systémového účtu místo účtu správce. Spuštění zásady Spustit jako člena skupiny Administrators obvykle nefunguje dobře, protože počítače mají ve výchozím nastavení povolené řízení přístupu uživatele (UAC). V takových případech doporučujeme spustit SetupEntryPoint jako LocalSystem místo místního uživatele přidaného do skupiny Administrators. Následující příklad ukazuje nastavení SetupEntryPoint pro spuštění jako LocalSystem:

<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="MyApplicationType" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <Parameters>
    <Parameter Name="MyStatelessService_InstanceCount" DefaultValue="-1" />
  </Parameters>
  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="MyStatelessServicePkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides />
    <Policies>
         <RunAsPolicy CodePackageRef="Code" UserRef="SetupLocalSystem" EntryPointType="Setup" />
      </Policies>
  </ServiceManifestImport>
  <DefaultServices>
    <Service Name="MyStatelessService" ServicePackageActivationMode="ExclusiveProcess">
      <StatelessService ServiceTypeName="MyStatelessServiceType" InstanceCount="[MyStatelessService_InstanceCount]">
        <SingletonPartition />
      </StatelessService>
    </Service>
  </DefaultServices>
  <Principals>
      <Users>
         <User Name="SetupLocalSystem" AccountType="LocalSystem" />
      </Users>
   </Principals>
</ApplicationManifest>

Poznámka:

Pokud chcete spustit službu nebo vstupní bod nastavení jako kořen, můžete pro clustery s Linuxem zadat AccountType jako LocalSystem.

Spuštění skriptu z vstupního bodu instalace

Teď přidejte do projektu spouštěcí skript, který se spustí pod oprávněními správce.

V sadě Visual Studio klikněte pravým tlačítkem na projekt služby a přidejte nový soubor s názvem MySetup.bat.

Dále se ujistěte, že je soubor MySetup.bat součástí balíčku služby. Ve výchozím nastavení to není. Vyberte soubor, kliknutím pravým tlačítkem myši získáte místní nabídku a zvolte Vlastnosti. V dialogovém okně Vlastnosti se ujistěte, že možnost Kopírovat do výstupního adresáře je nastavená na kopírovat, pokud je novější. Viz následující snímek obrazovky.

Visual Studio CopyToOutput pro dávkový soubor SetupEntryPoint

Teď upravte soubor MySetup.bat a přidejte následující příkazy, které nastaví proměnnou systémového prostředí a vypíše textový soubor:

REM Set a system environment variable. This requires administrator privilege
setx -m TestVariable %*
echo System TestVariable set to > out.txt
echo %TestVariable% >> out.txt

REM To delete this system variable us
REM REG delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v TestVariable /f

Dále sestavte a nasaďte řešení do místního vývojového clusteru. Po spuštění služby, jak je znázorněno v Service Fabric Exploreru, můžete vidět, že soubor MySetup.bat byl úspěšný dvěma způsoby. Otevřete příkazový řádek PowerShellu a zadejte:

PS C:\ [Environment]::GetEnvironmentVariable("TestVariable","Machine")
MyValue

Pak si poznamenejte název uzlu, ve kterém byla služba nasazena a spuštěna v Service Fabric Exploreru. Například Node 2. Dále přejděte do pracovní složky instance aplikace a vyhledejte soubor out.txt, který zobrazuje hodnotu TestVariable. Pokud byla například tato služba nasazena do uzlu 2, můžete přejít na tuto cestu pro MyApplicationType:

C:\SfDevCluster\Data\_App\Node.2\MyApplicationType_App\work\out.txt

Spuštění příkazů PowerShellu z vstupního bodu nastavení

Pokud chcete spustit PowerShell z bodu SetupEntryPoint , můžete spustit PowerShell.exe v dávkovém souboru, který odkazuje na soubor PowerShellu. Nejprve do projektu služby přidejte soubor PowerShellu– například MySetup.ps1. Nezapomeňte nastavit vlastnost Kopírovat, pokud je novější, aby soubor byl také součástí balíčku služby. Následující příklad ukazuje ukázkový dávkový soubor, který spustí soubor PowerShellu s názvem MySetup.ps1, který nastaví systémovou proměnnou prostředí s názvem TestVariable.

MySetup.bat pro spuštění souboru PowerShellu:

powershell.exe -ExecutionPolicy Bypass -Command ".\MySetup.ps1"

V souboru PowerShellu přidejte následující příkaz, který nastaví proměnnou systémového prostředí:

[Environment]::SetEnvironmentVariable("TestVariable", "MyValue", "Machine")
[Environment]::GetEnvironmentVariable("TestVariable","Machine") > out.txt

Poznámka:

Ve výchozím nastavení se při spuštění dávkového souboru podívá do složky aplikace označované jako pracovní pro soubory. V tomto případě, když MySetup.bat spustíme, chceme, aby soubor MySetup.ps1 našel ve stejné složce, což je složka balíčku kódu aplikace. Chcete-li změnit tuto složku, nastavte pracovní složku:

<SetupEntryPoint>
    <ExeHost>
    <Program>MySetup.bat</Program>
    <WorkingFolder>CodePackage</WorkingFolder>
    </ExeHost>
</SetupEntryPoint>

Místní ladění spouštěcího skriptu pomocí přesměrování konzoly

Někdy je užitečné pro účely ladění zobrazit výstup konzoly spuštěním instalačního skriptu. Zásady přesměrování konzoly můžete nastavit na vstupním bodu nastavení v manifestu služby, který zapíše výstup do souboru. Výstup souboru se zapíše do složky aplikace označované jako protokol na uzlu clusteru, ve kterém je aplikace nasazená a spuštěná.C:\SfDeployCluster\_App\{application-name}\log V cestě se může zobrazit číslo za názvem aplikace. Toto číslo se zvýší při každém nasazení. Soubory zapsané do složky protokolu zahrnují Code_{název_služby}Pkg_S_0.err, což je standardní výstup chyby a Code_{název_služby}Pkg_S_0.out, což je standardní výstup. V závislosti na pokusech o aktivaci služby se může zobrazit více než jedna sada souborů.

Upozorňující

Nikdy nepoužívejte zásadu přesměrování konzoly v aplikaci nasazené v produkčním prostředí, protože to může mít vliv na převzetí služeb při selhání aplikace. Tuto možnost použijte pouze pro účely místního vývoje a ladění.

Následující příklad manifestu služby ukazuje nastavení přesměrování konzoly s hodnotou FileRetentionCount:

<SetupEntryPoint>
    <ExeHost>
    <Program>MySetup.bat</Program>
    <WorkingFolder>CodePackage</WorkingFolder>
    <ConsoleRedirection FileRetentionCount="10"/>
    </ExeHost>
</SetupEntryPoint>

Pokud teď změníte soubor MySetup.ps1 na zápis příkazu Echo , zapíše se do výstupního souboru pro účely ladění:

Echo "Test console redirection which writes to the application log folder on the node that the application is deployed to"

Upozorňující

Po ladění skriptu okamžitě odeberte tuto zásadu přesměrování konzoly.

Další kroky