Jalankan skrip startup layanan sebagai pengguna lokal atau akun sistem

Sebelum layanan Service Fabric dapat dieksekusi dimulai, mungkin perlu untuk menjalankan beberapa konfigurasi atau pekerjaan pengaturan. Misalnya, mengonfigurasi variabel lingkungan. Anda dapat menentukan skrip yang akan dijalankan sebelum layanan dapat dieksekusi dimulai dalam manifes layanan untuk layanan. Dengan mengonfigurasi kebijakan RunAs untuk titik entri pengaturan layanan, Anda dapat mengubah akun mana yang dapat dieksekusi oleh penyiapan. Titik entri pengaturan terpisah memungkinkan Anda menjalankan konfigurasi dengan hak istimewa tinggi untuk waktu yang singkat sehingga host layanan yang dapat dieksekusi tidak perlu berjalan dengan hak istimewa tinggi untuk jangka waktu yang lama.

Titik masuk penyiapan (SetupEntryPoint dalam manifes layanan) adalah titik masuk istimewa yang secara default berjalan dengan kredensial yang sama dengan Service Fabric (biasanya akun NetworkService) sebelum titik masuk lainnya. Executable yang ditentukan oleh EntryPoint biasanya merupakan host layanan yang berjalan lama. Executable EntryPoint dijalankan setelah perintah yang dapat dieksekusi SetupEntryPoint berhasil keluar. Proses yang dihasilkan dipantau dan dimulai ulang, dan dimulai lagi dengan SetupEntryPoint jika pernah berakhir atau macet.

Mengonfigurasi titik entri penyiapan layanan

Berikut ini adalah contoh manifes layanan sederhana untuk layanan stateless yang menentukan skrip penyiapan MySetup.bat dalam layanan SetupEntryPoint. Argumen digunakan untuk meneruskan argumen ke skrip saat dijalankan.

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

Mengonfigurasi kebijakan untuk titik entri penyiapan layanan

Secara default, titik entri pengaturan layanan yang dapat dieksekusi berjalan dengan kredensial yang sama dengan Service Fabric (biasanya akun NetworkService). Dalam manifes aplikasi, Anda dapat mengubah izin keamanan untuk menjalankan skrip startup di bawah akun sistem lokal atau akun administrator.

Mengonfigurasi kebijakan dengan menggunakan akun sistem lokal

Contoh manifes aplikasi berikut menunjukkan cara mengonfigurasi titik entri penyiapan layanan untuk dijalankan di bawah akun administrator pengguna (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>

Pertama, buat bagian Principals dengan nama pengguna, seperti SetupAdminUser. Akun pengguna SetupAdminUser adalah anggota grup sistem Administrator.

Selanjutnya, di bawah bagian ServiceManifestImport, konfigurasikan kebijakan untuk menerapkan prinsipal ini ke SetupEntryPoint. Kebijakan ini memberi tahu Service Fabric bahwa saat fileMySetup.bat dijalankan, file tersebut harus berjalan sebagai SetupAdminUser ( dengan hak istimewa administrator). Karena Anda belum menerapkan kebijakan ke titik masuk utama, kode dalam MyServiceHost.exe di bawah akun NetworkService sistem. Ini adalah akun default yang dijalankan oleh semua titik masuk layanan.

Mengonfigurasi kebijakan dengan menggunakan akun sistem lokal

Seringkali, lebih baik menjalankan skrip startup menggunakan akun sistem lokal daripada akun administrator. Menjalankan kebijakan RunAs sebagai anggota grup Administrator biasanya tidak berfungsi dengan baik karena komputer memiliki User Access Control (UAC) yang diaktifkan secara default. Dalam kasus seperti itu, rekomendasi adalah menjalankan SetupEntryPoint sebagai LocalSystem, alih-alih sebagai pengguna lokal yang ditambahkan ke grup Administrator. Contoh berikut ini memperlihatkan pengaturan SetupEntryPoint untuk dijalankan sebagai 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>

Catatan

Untuk kluster Linux, untuk menjalankan layanan atau titik entri pengaturan sebagai akar, Anda dapat menentukan AccountType sebagai LocalSystem.

Jalankan skrip dari titik entri penyiapan

Sekarang tambahkan skrip start up ke proyek untuk dijalankan di bawah hak administrator.

Di Visual Studio, klik kanan proyek layanan dan tambahkan file baru yang disebut MySetup.bat.

Selanjutnya, pastikan MySetup.bat berkas tersebut sudah termasuk dalam paket layanan. Secara default, itu tidak. Pilih file, klik kanan untuk mendapatkan menu konteks, dan pilih Properti. Dalam kotak dialog Properti, pastikan bahwa Salin ke Direktori Output diatur ke Salin jika lebih baru. Lihat cuplikan layar berikut ini.

Visual Studio CopyToOutput untuk file batch SetupEntryPoint

Sekarang edit file MySetup.bat dan tambahkan perintah berikut mengatur variabel lingkungan sistem dan output file teks:

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

Selanjutnya, membangun dan menyebarkan solusi ke kluster pengembangan lokal. Setelah layanan dimulai, seperti yang ditunjukkan di Service Fabric Explorer, Anda dapat melihat MySetup.bat file berhasil dengan dua cara. Buka prompt perintah PowerShell dan ketik:

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

Kemudian, perhatikan nama node tempat layanan disebarkan dan dimulai di Service Fabric Explorer. Misalnya, Node 2. Selanjutnya, navigasi ke folder kerja instans aplikasi untuk menemukan file out.txt yang menunjukkan nilai TestVariable. Misalnya, jika layanan ini disebarkan ke Node 2, maka Anda dapat pergi ke jalur ini untuk MyApplicationType:

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

Menjalankan perintah PowerShell dari titik entri penyiapan

Untuk menjalankan PowerShell dari titik SetupEntryPoint, Anda bisa menjalankan PowerShell.exe dalam file batch yang menunjuk ke file PowerShell. Pertama, tambahkan file PowerShell ke proyek layanan --misalnya, MySetup.ps1. Ingatlah untuk mengatur properti Salin jika yang lebih baru sehingga file juga disertakan dalam paket layanan. Contoh berikut menunjukkan contoh file batch yang memulai file PowerShell yang disebut MySetup.ps1, yang menetapkan variabel lingkungan sistem yang disebut TestVariable.

MySetup.bat untuk memulai file PowerShell:

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

Dalam file PowerShell, tambahkan yang berikut ini untuk mengatur variabel lingkungan sistem:

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

Catatan

Secara default, ketika file batch berjalan, ia melihat folder aplikasi yang disebut berfungsi untuk file. Dalam hal ini, MySetup.bat berjalan, kami ingin ini menemukan file MySetup.ps1 dalam folder yang sama, yang merupakan folder paket kode aplikasi. Untuk mengubah folder ini, atur folder yang berfungsi:

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

Men-debug skrip startup secara lokal menggunakan pengalihan konsol

Terkadang, ini berguna untuk tujuan debugging untuk melihat output konsol dari menjalankan skrip penyiapan. Anda dapat mengatur kebijakan pengalihan konsol pada titik entri penyiapan dalam manifes layanan, yang menulis output ke file. Output file ditulis ke folder aplikasi bernama log pada node kluster tempat aplikasi disebarkan dan dijalankan, terdapat di C:\SfDeployCluster\_App\{application-name}\log. Anda mungkin melihat angka setelah nama aplikasi Anda di jalur. Jumlah ini bertambah pada setiap penyebaran. File yang ditulis ke folder log termasuk Code_{service-name}Pkg_S_0.err, yang merupakan output kesalahan standar, dan Code_{service-name}Pkg_S_0.out, yang merupakan output standar. Anda mungkin melihat lebih dari satu set file tergantung pada upaya aktivasi layanan.

Peringatan

Jangan pernah menggunakan kebijakan pengalihan konsol dalam aplikasi yang disebarkan dalam produksi karena ini dapat memengaruhi kegagalan aplikasi. Hanya gunakan ini untuk tujuan pengembangan dan penelusuran kesalahan lokal.

Contoh manifes layanan berikut menunjukkan pengaturan pengalihan konsol dengan nilai FileRetentionCount:

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

Jika Sekarang Anda mengubah MySetup.ps1 untuk menulis perintah Echo, ini akan menulis ke file output untuk tujuan debugging:

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

Peringatan

Setelah men-debug skrip, segera hapus kebijakan pengalihan konsol ini.

Langkah berikutnya