我对 Azure 有点陌生。我想要完成的是拥有一个安装了 OneDrive 的虚拟机,并使用 runbook 将其打开,运行存储在 SharePoint 文件夹中的 python 脚本,该脚本将使用 api 来查询一些信息并创建文件来存储在另一个 SharePoint 文件夹中。然后将其关闭。 问题是,目前我可以运行脚本,但它无法同步,除非我连接到它,我想避免这种情况,因为我希望它是一个自动化过程。 这是我的 Runbook 代码,上面我在 VM 中有路由:
# Function to run a Python script
function Run-PythonScript {
param (
[string]$PythonExecutable,
[string]$ScriptPath
)
$escapedScriptPath = $ScriptPath -replace '\\', '\\\\'
$command = @"
& '$PythonExecutable' '$escapedScriptPath'
"@
try {
$response = Invoke-AzVMRunCommand -ResourceGroupName $ResourceGroupName -VMName $VMName -CommandId 'RunPowerShellScript' -ScriptString $command -ErrorAction Stop
if ($response) {
$response.Value | ForEach-Object {
$logMessage = "Command execution output for ${ScriptPath}: " + $_.Message
Write-Output $logMessage
}
} else {
$noResponseMessage = "No response received from the VM command execution for ${ScriptPath}."
Write-Output $noResponseMessage
}
} catch {
$errorMessage = "Error executing ${ScriptPath}: $_"
Write-Output $errorMessage
}
}
# Main Script Execution
# Login to Azure using Managed Identity
$AzureContext = (Get-AzContext)
if ($AzureContext -eq $null) {
Connect-AzAccount -Identity
}
# Run OneDrive sync script
Write-Output "Running OneDrive sync script..."
Run-PythonScript -PythonExecutable $PythonExecutable -ScriptPath $OneDriveSyncScript
# Run all other scripts sequentially
foreach ($scriptPath in $ScriptPaths) {
Run-PythonScript -PythonExecutable $PythonExecutable -ScriptPath $scriptPath
}
# Log completion of the runbook
$runbookCompletedMessage = "Runbook execution completed."
Write-Output $runbookCompletedMessage
所以我使用 Runbook 尝试了很多不同的情况,例如尝试执行 OneDrive 文件,但它告诉我该文件不存在,或者该文件夹不存在。 有什么建议吗?或者可能改变方法? 提前致谢
提出的问题是许多人试图在 Azure 中实现无人值守自动化时遇到的常见问题。是对的,手动连接到 VM 来同步 OneDrive 不是一个可扩展的解决方案。
好消息是,有几种方法可以解决这个问题。让我们来探讨一下这些方法以及为什么一种方法可能比另一种方法更适合的情况。
了解问题:
核心问题是 OneDrive 通常依赖于与用户帐户交互的图形用户界面 (GUI) 来进行同步。当通过 Runbook 运行脚本时,实际上并没有以交互方式登录用户会话,因此 OneDrive 同步客户端无法完成其工作。
解决方案:
-
使用不依赖于 OneDrive 的 SharePoint API:
-
这是最直接且可能最可靠的长期解决方案。与其依赖于 OneDrive 同步,不如直接使用 SharePoint API 在脚本中与的 SharePoint 文件进行交互。
-
优势:
- 无需 OneDrive 同步,使自动化更加可靠。
- 更好的控制和粒度,用于文件操作。
-
劣势:
- 需要更多代码和对 SharePoint API 的理解。
示例 (使用 Python): ```python from office365.sharepoint.client_context import ClientContext from office365.runtime.auth.client_credential import ClientCredential
client_id = 'YOUR_APPLICATION_ID' client_secret = 'YOUR_APPLICATION_SECRET' sharepoint_site_url = 'YOUR_SHAREPOINT_SITE_URL'
credentials = ClientCredential(client_id, client_secret) ctx = ClientContext(sharepoint_site_url).with_credentials(credentials)
# 获取文件 file_url = '/Shared Documents/YourFile.txt' file = ctx.web.get_file_by_server_relative_url(file_url).execute_query() print(file.properties['Name'])
# 上传文件 with open('./data/MyFile.txt', 'rb') as content_file: file_content = content_file.read() ctx.web.get_folder_by_server_relative_url('/Shared Documents').upload_file('MyFile.txt', file_content).execute_query() print("File uploaded") ```
-
使用无头 OneDrive 客户端:
-
有一些工具像
rclone
可以与 OneDrive 进行交互,而无需 GUI。可以在 VM 上安装rclone
,并使用 Runbook 触发rclone
命令进行同步。 -
优势:
- 比使用完整的 OneDrive 客户端更轻量级。
-
劣势:
- 可能需要一些配置和故障排除。
- 与直接使用 SharePoint API 相比,控制更少。
示例 (使用 rclone): ```bash # 配置 rclone (只需运行一次) rclone config create onedrive microsoft_graph
# 同步文件夹 rclone sync /path/to/local/folder onedrive:/SharePoint/Folder ```
-
使用计划任务和用户上下文:
-
可以在 VM 上创建一个计划任务,该任务以特定用户身份运行,该用户具有 OneDrive 同步的权限。可以使用 Runbook 来触发此计划任务。
-
优势:
- 利用现有的 OneDrive 客户端。
-
劣势:
- 用户帐户需要始终保持登录状态,或者至少在计划任务运行时登录,这可能不理想。
- 不如其他选项安全。
无论选择哪种方法,请务必考虑安全隐患。使用服务主体或其他安全凭据来访问的 SharePoint 数据,而不是存储硬编码的用户名和密码。
标签:python,azure,cloud,virtual-machine From: 78697841