Aracılığıyla paylaş


Yerel kullanıcı veya sistem hesabı olarak bir hizmet başlangıcı komut dosyası çalıştırma

Service Fabric hizmeti yürütülebilir dosyası başlatılmadan önce bazı yapılandırma veya kurulum çalışmalarının çalıştırılması gerekebilir. Örneğin, ortam değişkenlerini yapılandırma. Hizmetin hizmet bildiriminde hizmet yürütülebilir dosyası başlatılmadan önce çalıştırılacak bir betik belirtebilirsiniz. Hizmet kurulumu giriş noktası için bir RunAs ilkesi yapılandırarak, kurulum yürütülebilir dosyasının hangi hesapta çalıştırıldığı değiştirebilirsiniz. Ayrı bir kurulum giriş noktası, hizmet ana bilgisayarı yürütülebilir dosyasının uzun süreler boyunca yüksek ayrıcalıklarla çalıştırılması gerekmemesi için kısa bir süre için yüksek ayrıcalıklı yapılandırma çalıştırmanıza olanak tanır.

Kurulum giriş noktası (hizmet bildiriminde SetupEntryPoint), varsayılan olarak diğer giriş noktalarından önce Service Fabric (genellikle NetworkService hesabı) ile aynı kimlik bilgileriyle çalışan ayrıcalıklı bir giriş noktasıdır. EntryPoint tarafından belirtilen yürütülebilir dosya genellikle uzun süre çalışan hizmet konağıdır. EntryPoint yürütülebilir dosyası, SetupEntryPoint yürütülebilir dosyası başarıyla çıktıktan sonra çalıştırılır. Sonuçta elde edilen işlem izlenir ve yeniden başlatılır ve sonlandırılırsa veya kilitlenirse SetupEntryPoint ile yeniden başlar.

Hizmet kurulumu giriş noktasını yapılandırma

Aşağıda, SetupEntryPoint hizmetinde bir kurulum betiği MySetup.bat belirten durum bilgisi olmayan bir hizmet için basit bir hizmet bildirimi örneği verilmiştir. Bağımsız değişkenler çalıştırıldığında betike bağımsız değişkenler geçirmek için kullanılır.

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

Hizmet kurulumu giriş noktası için ilkeyi yapılandırma

Varsayılan olarak, hizmet kurulum giriş noktası yürütülebilir dosyası Service Fabric ile aynı kimlik bilgileri altında (genellikle NetworkService hesabı) çalışır. Uygulama bildiriminde, başlangıç betiğini yerel sistem hesabı veya yönetici hesabı altında çalıştırmak için güvenlik izinlerini değiştirebilirsiniz.

İlkeyi yerel bir sistem hesabı kullanarak yapılandırma

Aşağıdaki uygulama bildirimi örneği, hizmet kurulum giriş noktasının kullanıcı yönetici hesabı (SetupAdminUser) altında çalışacak şekilde nasıl yapılandırılacaklarını gösterir.

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

İlk olarak, SetupAdminUser gibi bir kullanıcı adına sahip bir Sorumlular bölümü oluşturun. SetupAdminUser kullanıcı hesabı, Administrators sistem grubunun bir üyesidir.

Ardından, ServiceManifestImport bölümünde, bu sorumluyu SetupEntryPoint'e uygulayacak bir ilke yapılandırın. Bu ilke Service Fabric'e MySetup.bat dosyası çalıştırıldığında SetupAdminUser (yönetici ayrıcalıklarıyla) olarak çalıştırılması gerektiğini bildirir. Ana giriş noktasına bir ilke uygulamadığınızdan, MyServiceHost.exe içindeki kod sistem NetworkService hesabı altında çalışır. Bu, tüm hizmet giriş noktalarının farklı çalıştırıldığını varsayılan hesaptır.

İlkeyi yerel sistem hesaplarını kullanarak yapılandırma

Genellikle, başlangıç betiğini yönetici hesabı yerine yerel bir sistem hesabı kullanarak çalıştırmak tercih edilir. Bilgisayarlarda varsayılan olarak Kullanıcı Erişim Denetimi (UAC) etkinleştirildiğinden, RunAs ilkesini Yöneticiler grubunun bir üyesi olarak çalıştırmak genellikle iyi çalışmaz. Bu gibi durumlarda, SetupEntryPoint'i Administrators grubuna eklenen bir yerel kullanıcı yerine LocalSystem olarak çalıştırmanız önerilir. Aşağıdaki örnekte SetupEntryPoint'in LocalSystem olarak çalıştırılacak şekilde ayarlanması gösterilmektedir:

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

Not

Linux kümelerinde bir hizmeti veya kurulum giriş noktasını kök olarak çalıştırmak için AccountType değerini LocalSystem olarak belirtebilirsiniz.

Kurulum giriş noktasından betik çalıştırma

Şimdi, yönetici ayrıcalıkları altında çalıştırmak için projeye bir başlangıç betiği ekleyin.

Visual Studio'da hizmet projesine sağ tıklayın ve MySetup.bat adlı yeni bir dosya ekleyin.

Ardından, MySetup.bat dosyasının hizmet paketine eklendiğinden emin olun. Varsayılan olarak değildir. Dosyayı seçin, bağlam menüsünü almak için sağ tıklayın ve Özellikler'i seçin. Özellikler iletişim kutusunda, Daha yeniyse Çıkış Dizinine Kopyala'nın Kopyala olarak ayarlandığından emin olun. Aşağıdaki ekran görüntüsüne bakın.

KurulumEntryPoint toplu iş dosyası için Visual Studio CopyToOutput

Şimdi MySetup.bat dosyasını düzenleyin ve aşağıdaki komutları ekleyerek bir sistem ortam değişkeni ayarlayın ve bir metin dosyası çıktısı oluşturun:

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

Ardından çözümü derleyin ve yerel bir geliştirme kümesine dağıtın. Hizmet başlatıldıktan sonra Service Fabric Explorer'da gösterildiği gibi, MySetup.bat dosyasının iki şekilde başarılı olduğunu görebilirsiniz. Bir PowerShell komut istemi açın ve şunu yazın:

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

Ardından hizmetin dağıtıldığı ve Service Fabric Explorer'da başlatıldığı düğümün adını not edin. Örneğin, Düğüm 2. Ardından, TestVariable değerini gösteren out.txt dosyasını bulmak için uygulama örneği çalışma klasörüne gidin. Örneğin, bu hizmet Node 2'ye dağıtıldıysa MyApplicationType için şu yola gidebilirsiniz:

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

PowerShell komutlarını bir kurulum giriş noktasından çalıştırma

PowerShell'i SetupEntryPoint noktasından çalıştırmak için, PowerShell.exe bir PowerShell dosyasına işaret eden bir toplu iş dosyasında çalıştırabilirsiniz. İlk olarak, hizmet projesine bir PowerShell dosyası ekleyin; örneğin, MySetup.ps1. Dosyanın hizmet paketine de eklenmesi için Daha yeniyse Kopyala özelliğini ayarlamayı unutmayın. Aşağıdaki örnekte, TestVariable adlı bir sistem ortam değişkeni ayarlayan MySetup.ps1 adlı bir PowerShell dosyası başlatan örnek bir toplu iş dosyası gösterilmektedir.

PowerShell dosyasını başlatmak için MySetup.bat:

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

PowerShell dosyasında, bir sistem ortam değişkeni ayarlamak için aşağıdakileri ekleyin:

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

Not

Varsayılan olarak, toplu iş dosyası çalıştırıldığında dosyalar için iş adlı uygulama klasörüne bakar. Bu durumda, MySetup.bat çalıştırıldığında, bunun Uygulama kodu paketi klasörü olan MySetup.ps1 dosyasını aynı klasörde bulmasını istiyoruz. Bu klasörü değiştirmek için çalışma klasörünü ayarlayın:

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

Konsol yeniden yönlendirmesini kullanarak başlangıç betiğinde yerel olarak hata ayıklama

Bazen hata ayıklama amacıyla bir kurulum betiği çalıştırmanın konsol çıkışını görmek yararlı olur. Hizmet bildirimindeki kurulum giriş noktasında, çıkışı bir dosyaya yazan bir konsol yeniden yönlendirme ilkesi ayarlayabilirsiniz. Dosya çıkışı, içinde bulunanC:\SfDeployCluster\_App\{application-name}\log, uygulamanın dağıtıldığı ve çalıştırıldığı küme düğümünde log adlı uygulama klasörüne yazılır. Yolda uygulama adınızın ardından bir sayı görebilirsiniz. Bu sayı her dağıtımda artar. Günlük klasörüne yazılan dosyalar, standart hata çıkışı olan Code_{service-name}Pkg_S_0.err ve standart çıkış olan Code_{service-name}Pkg_S_0.out içerir. Hizmet etkinleştirme girişimlerine bağlı olarak birden fazla dosya kümesi görebilirsiniz.

Uyarı

Bu, uygulama yük devretmesini etkileyebileceğinden, konsol yeniden yönlendirme ilkesini asla üretimde dağıtılan bir uygulamada kullanmayın. Bunu yalnızca yerel geliştirme ve hata ayıklama amacıyla kullanın.

Aşağıdaki hizmet bildirimi örneği, konsol yeniden yönlendirmesini FileRetentionCount değeriyle ayarlamayı gösterir:

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

Şimdi MySetup.ps1 dosyasını Echo komutu yazacak şekilde değiştirirseniz, bu hata ayıklama amacıyla çıkış dosyasına yazılır:

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

Uyarı

Betiğinizde hata ayıkladıktan sonra bu konsol yeniden yönlendirme ilkesini hemen kaldırın.

Sonraki adımlar