我正在寻找将Python
可执行文件部署到Azure Service Fabric
的有用解决方案
这里有node js
的文档,但我找不到任何与python
相关的
提示:为您节省一些时间,请尝试先在本地运行此程序。我的经验是,很多事情都可能出错,其中最难确定的是节点上的执行权限。
置>将Python部署到Service Fabric所需的步骤:
- 确保Python已经安装在SF节点上(以及你需要的包)。有两种方法:
- 使用"远程桌面"使用端点"sf_cluster.westeurope.cloudapp.azure.com:node_port"导航到节点。其中node_port是(对我来说)3389-3393。然后通过从Python.org下载安装程序手动安装python。
- 创建一个python安装脚本,在Guest可执行文件SetupEntryPoint中调用,后面会详细介绍。 在任何情况下,你都需要将Python添加到节点和中,确保将Python和Python/Scripts添加到节点路径中。
- 创建一个带有来宾可执行服务的服务结构应用程序。
- 指向你的python代码文件夹
- 选择要运行的启动文件-留空
- 选择CodePackage作为工作文件夹
- 按下Ok。
现在我们开始一些黑客行为。Service Fabric不会像在Microsoft示例中运行node.exe那样运行Python.exe。所以你需要做的是创建一个运行。CMD脚本基本上是这样做的:
python.exe main.py
使用它作为你的入口点。
现在你的入口点在ServiceManifest.xml看起来像这样:
...
<EntryPoint>
<ExeHost>
<Program>run.cmd</Program>
<Arguments></Arguments>
<WorkingFolder>CodePackage</WorkingFolder>
<ConsoleRedirection FileRetentionCount="5" FileMaxSizeInKb="2048"/> //use this to get logging (very helpful ;)
</ExeHost>
</EntryPoint>
</CodePackage>
如果你想用SetupEntryPoint为你安装python,你可以这样做:
<SetupEntryPoint>
<ExeHost>
<Program>Setupsetup.bat</Program>
<WorkingFolder>CodePackage</WorkingFolder>
</ExeHost>
</SetupEntryPoint>
我的setup.bat看起来像这样(路径有一些问题):
C:WindowsSystem32WindowsPowerShellv1.0powershell.exe -ExecutionPolicy - Bypass -Command ".SetuppythonInstall.ps1"
我的解决方案中的代码被复制到这个结构中:
MyGuestExecutablePkg
|
- Code
- run.cmd
- main.py
- Setup
- setup.bat
- ....
- Config
- Settings.xml
- ServiceManifest.xml
ApplicationManifest.xml
我希望这能帮助到一些人,但请务必阅读客户可执行文件,以了解我错过的任何内容。1
政策有些东西需要在Service Fabric节点上解除特权,这就是你如何解除你的服务,以便它运行。cmd,。bat, Python.exe等。以下编辑来自ApplicationManifest.xml
....
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="MyGuestExecutablePkg" ServiceManifestVersion="1.0.0" />
<ConfigOverrides />
<Policies>
<RunAsPolicy CodePackageRef="Code" UserRef="SetupAdminUser" EntryPointType="Setup" />
<RunAsPolicy CodePackageRef="Code" UserRef="SetupAdminUser" EntryPointType="Main" />
</Policies>
</ServiceManifestImport>
....
第一个策略是提升SetupEntryPoint,第二个策略是剔除EntryPoint,也就是。您的服务。确保您在ApplicationManifest.xml的底部定义了这些主体。
</DefaultServices>
<Principals>
<Users>
<User Name="SetupAdminUser">
<MemberOf>
<SystemGroup Name="Administrators" />
</MemberOf>
</User>
</Users>
</Principals>
</ApplicationManifest>
最终想法
我把我的服务作为Flask Api运行,因为这非常容易。因此,Service Fabric所做的"全部"就是启动Flask api,然后确保它在崩溃时重新启动。这使得通过执行
可以很容易地测试和验证部署的哪个部分崩溃了,以及它是否已经启动并运行。netstat -na | find "5000"
,以验证API确实已启动并运行。
当然,在所有这些之后,您需要在Azure Portal中为您的服务结构集群打开负载均衡器中的端口。
对于Python来说应该没有什么不同,只要你通过脚本扩展直接在节点上安装Python需求(对于Azure)。或者调用Python安装程序作为SetupEntryPoint。