Uruchamianie skryptu uruchamiania usługi za pomocą użytkownika lokalnego lub konta systemowego

Przed uruchomieniem pliku wykonywalnego usługi Service Fabric może być konieczne uruchomienie pewnej konfiguracji lub pracy konfiguracji. Na przykład konfigurowanie zmiennych środowiskowych. Skrypt do uruchomienia można określić przed uruchomieniem pliku wykonywalnego usługi w manifeście usługi dla usługi. Konfigurując zasady Uruchom jako punkt wejścia konfiguracji usługi, można zmienić konto, w którym jest uruchamiany plik wykonywalny konfiguracji. Oddzielny punkt wejścia konfiguracji umożliwia uruchamianie konfiguracji z wysokimi uprawnieniami przez krótki czas, dzięki czemu plik wykonywalny hosta usługi nie musi działać z wysokimi uprawnieniami przez dłuższy czas.

Punkt wejścia konfiguracji (SetupEntryPoint w manifeście usługi) jest uprzywilejowanym punktem wejścia, który domyślnie jest uruchamiany z tymi samymi poświadczeniami co Service Fabric (zazwyczaj konto usługi sieciowej) przed innym punktem wejścia. Plik wykonywalny określony przez program EntryPoint jest zazwyczaj długotrwałym hostem usługi. Plik wykonywalny programu EntryPoint jest uruchamiany po pomyślnym zakończeniu działania pliku wykonywalnego SetupEntryPoint . Wynikowy proces jest monitorowany i uruchamiany ponownie, a następnie rozpoczyna się od instalatoraEntryPoint , jeśli kiedykolwiek zakończy się lub ulegnie awarii.

Konfigurowanie punktu wejścia usługi instalatora

Poniżej przedstawiono prosty przykład manifestu usługi dla usługi bezstanowej, która określa skrypt konfiguracji MySetup.bat w usłudze SetupEntryPoint. Argumenty są używane do przekazywania argumentów do skryptu podczas jego uruchamiania.

<?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>

Konfigurowanie zasad punktu wejścia konfiguracji usługi

Domyślnie plik wykonywalny punktu wejścia konfiguracji usługi jest uruchamiany pod tymi samymi poświadczeniami co Service Fabric (zazwyczaj konto Usługi sieciowej). W manifeście aplikacji można zmienić uprawnienia zabezpieczeń, aby uruchomić skrypt uruchamiania na lokalnym koncie systemowym lub koncie administratora.

Konfigurowanie zasad przy użyciu konta systemowego lokalnego

W poniższym przykładzie manifestu aplikacji pokazano, jak skonfigurować punkt wejścia konfiguracji usługi do uruchomienia na koncie administratora użytkownika (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>

Najpierw utwórz sekcję Podmioty zabezpieczeń z nazwą użytkownika, taką jak SetupAdminUser. Konto użytkownika SetupAdminUser jest członkiem grupy systemowej Administratorzy.

Następnie w sekcji ServiceManifestImport skonfiguruj zasady, aby zastosować tę jednostkę do setupEntryPoint. Te zasady informują Service Fabric, że po uruchomieniu pliku MySetup.bat powinien zostać uruchomiony jako SetupAdminUser (z uprawnieniami administratora). Ponieważ zasady nie zostały zastosowane do głównego punktu wejścia, kod w MyServiceHost.exe jest uruchamiany w ramach systemowego konta NetworkService . Jest to domyślne konto, w ramach którego są uruchamiane wszystkie punkty wejścia usługi.

Konfigurowanie zasad przy użyciu kont systemowych lokalnych

Często zaleca się uruchamianie skryptu uruchamiania przy użyciu lokalnego konta systemowego, a nie konta administratora. Uruchamianie zasad Uruchom jako członek grupy Administratorzy zwykle nie działa prawidłowo, ponieważ komputery mają domyślnie włączoną funkcję Access Control użytkownika (UAC). W takich przypadkach zaleceniem jest uruchomienie instalatoraEntryPoint jako LocalSystem, a nie jako użytkownik lokalny dodany do grupy Administratorzy. W poniższym przykładzie pokazano ustawienie ustawienia setupEntryPoint do uruchomienia 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>

Uwaga

W przypadku klastrów z systemem Linux, aby uruchomić usługę lub punkt wejścia konfiguracji jako katalog główny, można określić parametr AccountType jako LocalSystem.

Uruchamianie skryptu z punktu wejścia konfiguracji

Teraz dodaj skrypt uruchamiania do projektu, aby był uruchamiany w ramach uprawnień administratora.

W Visual Studio kliknij prawym przyciskiem myszy projekt usługi i dodaj nowy plik o nazwie MySetup.bat.

Następnie upewnij się, że plik MySetup.bat znajduje się w pakiecie usługi. Domyślnie nie jest. Wybierz plik, kliknij prawym przyciskiem myszy, aby pobrać menu kontekstowe, a następnie wybierz polecenie Właściwości. W oknie dialogowym Właściwości upewnij się, że dla opcji Kopiuj do katalogu wyjściowego ustawiono opcję Kopiuj, jeśli jest nowsza. Zobacz poniższy zrzut ekranu.

Visual Studio CopyToOutput for SetupEntryPoint batch file

Teraz edytuj plik MySetup.bat i dodaj następujące polecenia, aby ustawić zmienną środowiskową systemową i wyświetlić plik tekstowy:

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

Następnie skompiluj i wdróż rozwiązanie w lokalnym klastrze deweloperów. Po uruchomieniu usługi, jak pokazano w Service Fabric Explorer, widać, że plik MySetup.bat zakończył się pomyślnie na dwa sposoby. Otwórz wiersz polecenia programu PowerShell i wpisz:

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

Następnie zanotuj nazwę węzła, w którym wdrożono usługę i uruchomiono w Service Fabric Explorer. Na przykład węzeł 2. Następnie przejdź do folderu roboczego wystąpienia aplikacji, aby znaleźć plik out.txt, który pokazuje wartość TestVariable. Jeśli na przykład ta usługa została wdrożona w węźle 2, możesz przejść do tej ścieżki dla elementu MyApplicationType:

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

Uruchamianie poleceń programu PowerShell z punktu wejścia konfiguracji

Aby uruchomić program PowerShell z punktu SetupEntryPoint , można uruchomić PowerShell.exe w pliku wsadowym wskazującym plik programu PowerShell. Najpierw dodaj plik programu PowerShell do projektu usługi — na przykład MySetup.ps1. Pamiętaj, aby ustawić właściwość Kopiuj, jeśli nowsza , aby plik był również uwzględniony w pakiecie usługi. W poniższym przykładzie przedstawiono przykładowy plik wsadowy, który uruchamia plik programu PowerShell o nazwie MySetup.ps1, który ustawia zmienną środowiskową systemową o nazwie TestVariable.

MySetup.bat, aby uruchomić plik programu PowerShell:

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

W pliku programu PowerShell dodaj następujące polecenie, aby ustawić zmienną środowiskową systemową:

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

Uwaga

Domyślnie, gdy plik wsadowy jest uruchamiany, analizuje folder aplikacji o nazwie work dla plików. W takim przypadku po uruchomieniu MySetup.bat chcemy znaleźć plik MySetup.ps1 w tym samym folderze, który jest folderem pakietu kodu aplikacji. Aby zmienić ten folder, ustaw folder roboczy:

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

Lokalne debugowanie skryptu uruchamiania przy użyciu przekierowania konsoli

Czasami przydatne jest debugowanie danych wyjściowych konsoli podczas uruchamiania skryptu instalacyjnego. Zasady przekierowania konsoli można ustawić w punkcie wejścia konfiguracji w manifeście usługi, który zapisuje dane wyjściowe w pliku. Dane wyjściowe pliku są zapisywane w folderze aplikacji o nazwie log w węźle klastra, w którym aplikacja jest wdrażana i uruchamiana, znajduje się w pliku C:\SfDeployCluster\_App\{application-name}\log. Możesz zobaczyć liczbę po nazwie aplikacji w ścieżce. Ta liczba zwiększa się w każdym wdrożeniu. Pliki zapisywane w folderze dziennika obejmują Code_{service-name}Pkg_S_0.err, czyli standardowe dane wyjściowe błędu, a Code_{nazwa-usługi}Pkg_S_0.out, czyli standardowe dane wyjściowe. W zależności od prób aktywacji usługi może zostać wyświetlonych więcej niż jeden zestaw plików.

Ostrzeżenie

Nigdy nie używaj zasad przekierowania konsoli w aplikacji wdrożonej w środowisku produkcyjnym, ponieważ może to mieć wpływ na tryb failover aplikacji. Tej funkcji należy używać tylko do celów programowania lokalnego i debugowania.

Poniższy przykład manifestu usługi przedstawia ustawienie przekierowania konsoli przy użyciu wartości FileRetentionCount:

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

Jeśli teraz zmienisz plik MySetup.ps1 na napisanie polecenia Echo , zapiszesz go w pliku wyjściowym do celów debugowania:

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

Ostrzeżenie

Po debugowania skryptu natychmiast usuń te zasady przekierowania konsoli.

Następne kroki