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 nastavení. 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ásady Spustit jako pro vstupní bod nastavení služby můžete změnit účet, pod kterým se spustitelný soubor instalace spouští. Samostatný vstupní bod nastavení umožňuje krátkodobě spustit konfiguraci s vysokými oprávněními, aby spustitelný soubor hostitele služby nemusel běžet s vysokými oprávněními po delší dobu.

Vstupní bod nastavení (SetupEntryPoint v manifestu služby) je privilegovaný vstupní bod, který se ve výchozím nastavení spouští 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ý EntryPointem je obvykle dlouhotrvající hostitel služby. Spustitelný soubor EntryPoint se spustí po úspěšném ukončení spustitelného souboru SetupEntryPoint . Výsledný proces se monitoruje a restartuje, a pokud se někdy ukončí nebo se chybově ukončí, začne znovu s SetupEntryPoint .

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í se spustitelný soubor vstupního bodu nastavení služby spouští 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í tak, aby spouštěl spouštěcí skript 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 instalace služby tak, aby se spustil 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 pro použití tohoto objektu zabezpečení na SetupEntryPoint. Tato zásada říká Service Fabric, že po spuštění souboruMySetup.bat by se měl spustit jako SetupAdminUser ( s oprávněními správce). Vzhledem k tomu, že jste nepoužádili zásadu na hlavní vstupní bod, kód v MyServiceHost.exe běží pod systémovým účtem NetworkService. Toto je výchozí účet, pod kterým se spouští všechny vstupní body služby.

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

Spouštěcí skript je často vhodnější spustit pomocí místního systémového účtu než pomocí úč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í povolenou službu User Access Control (UAC). V takových případech se doporučuje spustit SetupEntryPoint jako LocalSystem, nikoli jako místní uživatel přidaný do skupiny Administrators. Následující příklad ukazuje nastavení SetupEntryPoint na 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 instalace jako kořenový adresář pro clustery s Linuxem, můžete zadat AccountType jako LocalSystem.

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

Teď do projektu přidejte 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í 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 zkontrolujte, ž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 for SetupEntryPoint batch file

Teď upravte MySetup.bat soubor a přidejte následující příkazy, které nastaví systémovou proměnnou 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 Explorer, 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, na kterém byla služba nasazena a spuštěna v Service Fabric Explorer. Například Uzel 2. Dále přejděte do pracovní složky instance aplikace a vyhledejte out.txt soubor, který zobrazuje hodnotu TestVariable. Pokud byla například tato služba nasazena do uzlu 2, můžete přejít na tuto cestu pro typ MyApplicationType:

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

Spouštění příkazů PowerShellu ze vstupního bodu nastavení

Pokud chcete PowerShell spustit z bodu SetupEntryPoint , můžete spustitPowerShell.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 Copy if novější tak, aby byl soubor zahrnut také v balíčku služby. Následující příklad ukazuje ukázkový dávkový soubor, který spustí powershellový soubor s názvem MySetup.ps1, který nastaví systémovou proměnnou prostředí s názvem TestVariable.

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

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

Do souboru PowerShellu přidejte následující příkaz pro nastavení systémové proměnné 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á na složku aplikace s názvem work pro soubory. V tomto případě při spuštění MySetup.bat chceme, aby se 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

Občas je užitečné pro účely ladění zobrazit výstup konzoly ze spuštění instalačního skriptu. Můžete nastavit zásady přesměrování konzoly pro vstupní bod nastavení v manifestu služby, který zapisuje výstup do souboru. Výstup souboru se zapíše do složky aplikace s názvem log na uzlu clusteru, kde je aplikace nasazená a spuštěná. Nachází se v C:\SfDeployCluster\_App\{application-name}\logsouboru . V cestě se může za názvem vaší aplikace zobrazit číslo. 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ů.

Upozornění

Nikdy nepoužívejte zásady přesměrování konzoly v aplikaci, která je nasazena v produkčním prostředí, protože to může mít vliv na převzetí služeb při selhání aplikace. Používejte ho 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 tak, aby zapisuje příkaz Echo , zapíše se to 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"

Upozornění

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

Další kroky