Condividi tramite


Eseguire uno script di avvio del servizio come account utente o di sistema locale

Prima dell'avvio del file eseguibile di un servizio di Service Fabric può essere necessario eseguire alcune operazioni di configurazione o di installazione, ad esempio la configurazione delle variabili di ambiente. Nel manifesto del servizio è possibile specificare di eseguire uno script prima dell'avvio dell'eseguibile del servizio stesso. La configurazione di criteri RunAs per il punto di ingresso dell'installazione del servizio consente di modificare l'account di esecuzione dell'eseguibile di installazione. Un punto di ingresso dell'installazione separato consente di eseguire una configurazione con privilegi elevati per un breve periodo di tempo, in modo che non sia necessario eseguire con privilegi elevati il file eseguibile dell'host servizio per periodi di tempo prolungati.

Il punto di ingresso dell'installazione, (SetupEntryPoint nel manifesto del servizio), è un punto di ingresso con privilegi che per impostazione predefinita viene eseguito con le stesse credenziali di Service Fabric (in genere, l'account NetworkService) prima di qualsiasi altro punto di ingresso. L'eseguibile specificato da EntryPoint è in genere l'host del servizio a esecuzione prolungata. L'eseguibile EntryPoint viene eseguito dopo la conclusione dell'eseguibile SetupEntryPoint. Il processo risultante viene monitorato e riavviato ed inizia di nuovo con SetupEntryPoint, se termina o si arresta in modo anomalo.

Configurare il punto di ingresso dell'installazione del servizio

Ecco un esempio semplice di manifesto per un servizio senza stato con uno script di installazione MySetup.bat nel servizio SetupEntryPoint. Argumentsè usato per passare argomenti allo script durante l'esecuzione.

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

Configurare i criteri per il punto di ingresso dell'installazione del servizio

Per impostazione predefinita, il file eseguibile del punto di ingresso dell'installazione del servizio viene eseguito con le stesse credenziali di Service Fabric (in genere, l'account NetworkService). Nel manifesto dell'applicazione, è possibile modificare le autorizzazioni di sicurezza per eseguire lo script di avvio con un account di sistema locale o un account amministratore.

Configurare i criteri tramite un account di sistema locale

L'esempio di manifesto dell'applicazione seguente illustra come configurare il punto di ingresso dell'installazione del servizio per l'esecuzione con un account utente amministratore (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>

Creare prima di tutto una sezione Principals con un nome utente, ad esempio SetupAdminUser. L'account utente SetupAdminUser è un membro del gruppo di sistema Administrators.

Successivamente, configurare nella sezione ServiceManifestImport un criterio per applicare tale entità a SetupEntryPoint. Il criterio indica a Service Fabric che il file MySetup.bat deve essere eseguito con l'account SetupAdminUser (con privilegi di amministratore). Dato che non sono stati applicati criteri al punto di ingresso principale, il codice in MyServiceHost.exe viene eseguito con l'account NetworkService di sistema, ossia l'account predefinito con cui vengono eseguiti tutti i punti di ingresso del servizio.

Configurare i criteri usando gli account di sistema locale

Spesso è preferibile eseguire lo script di avvio usando un account di sistema locale invece di un account amministratore. L'esecuzione dei criteri RunAs con un account membro del gruppo Administrators in genere non ha esito positivo. Per impostazione predefinita, infatti, per i computer è abilitato il controllo dell'account utente. In questi casi, è consigliabile eseguire SetupEntryPoint come LocalSystem invece che come utente locale aggiunto al gruppo Administrators. L'esempio seguente illustra l'impostazione di SetupEntryPoint per l'esecuzione come 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>

Nota

Per i cluster Linux, per eseguire un servizio o il punto di ingresso della configurazione come root, è possibile specificare AccountType come LocalSystem.

Eseguire uno script dal punto di ingresso dell'installazione

Aggiungere ora un script di avvio per il progetto da eseguire con privilegi di amministratore.

In Visual Studio fare clic con il pulsante destro del mouse sul progetto del servizio e aggiungere un nuovo file denominato MySetup.bat.

Verificare quindi che il file MySetup.bat sia incluso nel pacchetto del servizio. Per impostazione predefinita, non è incluso. Selezionare il file, fare clic con il pulsante destro del mouse per visualizzare il menu di scelta rapida e scegliere Proprietà. Nella finestra di dialogo delle proprietà verificare che Copia nella directory di output sia impostato su Copia se più recente. Vedi la schermata seguente.

Visual Studio CopyToOutput for SetupEntryPoint batch file

Modificare ora il file MySetup.bat e aggiungere i comandi seguenti per impostare una variabile di ambiente di sistema e generare un file di testo come output:

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

Successivamente, compilare e distribuire la soluzione a un cluster di sviluppo locale. Dopo l'avvio del servizio, come illustrato in Service Fabric Explorer, è possibile verificare la corretta esecuzione del file MySetup.bat in due modi. Avviare un prompt dei comandi di PowerShell e digitare:

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

Annotare quindi il nome del nodo in cui il servizio è stato distribuito e avviato in Service Fabric Explorer, ad esempio Node 2. Passare quindi alla cartella di lavoro dell'istanza dell'applicazione per trovare il file out.txt che mostra il valore di TestVariable. Se, ad esempio, il servizio è stato distribuito in Node 2, è possibile passare a questo percorso per MyApplicationType:

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

Eseguire comandi PowerShell da un punto di ingresso dell'installazione

Per eseguire PowerShell dal punto SetupEntryPoint, è possibile eseguire PowerShell.exe in un file batch che punta a un file di PowerShell. Aggiungere prima di tutto un file PowerShell al progetto del servizio, ad esempio MySetup.ps1. Ricordarsi di impostare la proprietà Copia se più recente in modo che il file venga incluso anche nel pacchetto servizio. L'esempio seguente illustra un file batch di esempio per avviare un file PowerShell denominato MySetup.ps1, che imposta una variabile di ambiente di sistema denominata TestVariable.

MySetup.bat per avviare il file PowerShell:

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

Nel file di PowerShell aggiungere quanto segue per impostare una variabile di ambiente di sistema:

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

Nota

Per impostazione predefinita, quando viene eseguito, il file batch cerca i file nella cartella dell'applicazione denominata work. In questo caso, quando MySetup.bat viene eseguito, il file MySetup.ps1 deve trovarsi nella stessa cartella, ovvero la cartella code package dell'applicazione. Per modificare questa cartella, impostare la cartella di lavoro:

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

Eseguire il debug di uno script di avvio localmente tramite il reindirizzamento della console

A scopo di debug può talvolta essere utile visualizzare l'output generato nella console dall'esecuzione di uno script di installazione. È possibile impostare criteri di reindirizzamento della console per il punto di ingresso dell'installazione nel manifesto del servizio, che scrive l'output in un file. L'output del file viene scritto nella cartella dell'applicazione denominata log nel nodo del cluster in cui l'applicazione viene distribuita ed eseguita, disponibile in C:\SfDeployCluster\_App\{application-name}\log. È possibile che venga visualizzato un numero dopo il nome delle applicazioni nel percorso. Questo numero aumenta in ogni distribuzione. Tra i file scritti nella cartella dei log sono compresi Code_{service-name}Pkg_S_0.err, ovvero l'output di errore standard e Code_{service-name}Pkg_S_0.out, ovvero l'output standard. A seconda dei tentativi di attivazione del servizio, è possibile che vengano visualizzati più di un set di file.

Avviso

Non usare mai i criteri di reindirizzamento della console in un'applicazione distribuita nell'ambiente di produzione, perché ciò può incidere sul failover dell'applicazione. Usare questa opzione solo a scopo di sviluppo e debug locale.

L'esempio di manifesto del servizio seguente illustra come impostare il reindirizzamento della console con un valore FileRetentionCount:

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

Se si modifica il file MySetup.ps1 per scrivere un comando Echo, questo verrà scritto nel file di output a scopo di debug:

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

Avviso

Dopo avere eseguito il debug dello script, rimuovere immediatamente i criteri di reindirizzamento della console.

Passaggi successivi