如何在自托管 Windows 代理上从 Azure DevOps 管道运行 Azure CLI 任务?

2023-11-23

情况

我的自托管 Windows 代理运行来自 Azure DevOps 的管道。到 管理 Azure 中的资源 我想使用 Azure CLI 任务。即使在前面的步骤中安装了 Azure CLI,AzureCLI 任务也会失败。

我有两个从我的管道运行的脚本。

  • (1)安装Azure CLI-->成功
  • (2) 运行 Azure CLI 命令 --> 未运行任何内部代码(甚至“Hello, World!”)而失败不会被执行。
2021-03-05T14:50:02.5986237Z ##[error]Azure CLI 2.x is not installed on this machine.
2021-03-05T14:50:02.6391547Z ##[error]Script failed with error: Error: Unable to locate executable file: 'az'. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.

微软 says

  • (1) After you install new software on an agent, you must restart the agent for the new capability to show up in the pool so that the build can run.
  • (2) After the installation is complete, you will need to reopen PowerShell to use the Azure CLI.

AzureCLI 任务无法找到已安装的 Azure CLI 可执行文件。如何修复此问题以便可以运行 AzureCLI 任务?

我已经尝试过的

  • 通过 PowerShell 设置 Azure CLI 的路径。路径已设置,但 Azure CLI 任务的 Powershell 任务失败。
  • 直接在我的安装脚本中运行 Azure CLI 命令,这可以工作,但我需要使用单独的凭据登录 Azure,同时我想使用 Azure CLI 任务中定义的服务主体。
  • 正在 VM 上重新启动 Microsoft Agent 服务,但我的代理上没有提到的服务 (https://learn.microsoft.com/en-us/azure/devops/pipelines/agents/v2-windows?view=azure-devops)
  • 设置执行 Azure CLI 任务之前的延迟。
  • 使用 Microsoft 托管代理,该代理 100% 有效,但不符合我的公司要求,因此不是一个选择。

管道详情

trigger:
  branches:
    exclude:
    - master

pool:
  name: SelfHosted-AgentPool
  vmImage: 'windows-latest'

variables:
  environment.name: 'Test'

stages:
- stage: build_and_deploy
  jobs:
  - deployment: VMBackup_Testing  
    displayName: "Enable Backup Protection"
    environment: '$(environment.name)'
    strategy:
      runOnce:
        deploy:
          steps:
          - checkout: self    
          
         
          - task: PowerShell@2
            inputs:
              filePath: '$(System.DefaultWorkingDirectory)/Templates/Snippets/InstallAzureCLI.ps1'

          - task: AzureCLI@2
            inputs:
              workingDirectory: 'C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin'
              azureSubscription: 'XXX'
              scriptType: 'ps'
              scriptLocation: 'scriptPath'
              scriptPath: '$(System.DefaultWorkingDirectory)/Templates/Snippets/EnableBackupProtection.ps1'

安装 Azure CLI 脚本

# Download and Install Azure CLI
Invoke-WebRequest -Uri https://azcliprod.blob.core.windows.net/msi/azure-cli-2.19.1.msi -OutFile .\AzureCLI.msi; Start-Process msiexec.exe -Wait -ArgumentList "/I AzureCLI.msi /quiet"; rm .\AzureCLI.msi

# Update PATH for Powershell to use new installed software
setx /M PATH "$env:Path += ;C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin"

# Test if PATH of Azure CLI exists
Test-Path -Path "C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin"

# Reload Shell with new PATH 
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")

# Check if AZ CLI is installed
az version

Azure CLI 命令脚本

# Check if script gets executed
Write-Host "Hello, World!"

# AZ CLI commands to enable Backup Protection
az backup protection enable-for-vm `
    --resource-group XXX`
    --vault-name XXXX`
    --vm $(az vm show -g XXX -n XXX --query id) `
    --policy-name DailyBackup

为什么每次在同一个自承载 Windows 代理上运行管道时都需要安装 Azure CLI?

Unlike Microsoft 托管代理,您只需要在自托管代理机器上手动安装所需的工具,然后就可以在代理上运行的管道中使用它们。

  1. 登录到安装了自承载代理的 Windows 计算机(本地或虚拟机)。

  2. 打开 Web 浏览器以下载已发布的最新 Azure CLI 的 MSI 安装程序here.

  3. 通过 MSI 安装程序安装 Azure CLI 时,通常安装向导会自动将此工具添加到系统环境变量中PATH。安装完成后,即可打开“编辑系统环境变量”在机器上检查一下。如果没有添加到系统环境变量中PATH,您可以手动添加。

enter image description here

  1. 完成上述步骤后,按照文档的建议,重新启动代理服务或重新启动计算机,以便已安装的 Azure CLI 工具可以在池中代理的功能中列出。

通过这种方式,当您设置管道在此自托管代理上运行时,您可以直接调用 Azure CLI,而无需在管道中安装 Azure CLI 的任何步骤。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在自托管 Windows 代理上从 Azure DevOps 管道运行 Azure CLI 任务? 的相关文章

随机推荐

  • Objective-C中UIImage的平均颜色值

    我需要目标 c 中图像的平均颜色值 我想创建它的颜色渐变 有人有想法吗 这是我尚未测试的实验代码 struct pixel unsigned char r g b a UIColor getDominantColor UIImage ima
  • 使用Object.wait(毫秒)来模拟睡眠

    这是我在维护的一些代码中看到的一段代码 Object lock new Object synchronized lock try lock wait 50000 Thread sleep 3000 catch Exception ex 开发
  • Internet Explorer 或任何浏览器 F1 按键都会显示您自己的帮助

    我想在按 F1 时显示用户选择的帮助文件 这应该适用于我测试应用程序的每个浏览器 如何停止显示默认帮助文件 AFAIK F1 键的默认操作可以在除 IE 之外的任何浏览器中更改 Microsoft 团队通常坚持在其应用程序中保持一致的用户体
  • 使用 OpenCV 从网络摄像头捕获视频时 QT GUI 冻结

    我正在使用 Opencv 进行一些实时视频处理 作为前端 我使用 QT 框架 在我的 GUI 上 我有一个输入图像窗口 映射到一个标签 和一个输出图像窗口 映射到另一个标签 和 3 个按钮 第一个用于开始输入视频捕获 第二个用于处理视频 代
  • Python-位置参数跟随关键字参数

    我有一个函数 它接受可变长度的参数 如下所述 我正在通过kwargs作为字典 但是我不明白为什么我会收到错误 class PanSearch object otp wait 30 def init self surname dob mobi
  • Python 时间转换 h:m:s 到秒

    我知道使用 timedelta 函数 您可以使用以下方法将秒转换为 h m s gt gt import datetime gt gt str datetime timedelta seconds 666 0 11 06 但我需要将 h m
  • 如何在不绑定工具的情况下使用 Windows ToolTip 控件

    我想使用本机 Windows 工具提示控件 纯 Win32 API 没有 MFC 的东西 我阅读了文档 似乎我必须发送 TTM ADDTOOL 消息才能将工具绑定到工具提示控件 只有在那之后我才能发送 TTM TRACKACTIVATE 和
  • Sql Server 网络配置协议不可用

    安装 SQL Server 2008 32 位后 我尝试将其配置为允许远程访问 所以我打开 SSCM sql server 配置管理器 将协议设置为启用 我在Sql Server网络配置下没有找到任何协议 我尝试过修复 卸载并重新安装 注册
  • 如何转储mysql数据库?

    我想只转储 mysql 数据库有数据的表 你能给我你的建议吗 这更有帮助 感谢和问候 瓦拉 库马尔 您可以使用 忽略表选项 但您必须首先找出哪些表是空的 因为这不能直接使用 mysqldump 实现 所以你可以做 mysqldump u u
  • 在CSS文件中使用相对URL,它相对于什么位置?

    当在CSS文件中定义背景图片URL之类的东西时 当使用相对URL时 它是相对于哪里的 例如 假设文件 stylesheets base styles css包含 div header background image url images
  • iOS中如何获取个人热点的子网掩码和广播地址

    我需要找到一种方法来查找 iOS 中我的个人热点的子网掩码和广播地址 我正在使用以下方法来查找设备的 IP 地址 如果它连接到 WiFi 但无法弄清楚如何获取个人热点的网络属性 NSString localIPAddress NSStrin
  • 从 Codeigniter 中的 URL 中删除 index.php

    我已经做了很多次了 但我又被困在这里 在不同的服务器中 并且无法弄清楚问题是什么 htaccess编辑完成
  • 在什么情况下“git pull”可能有害?

    我有一个同事声称git pull是有害的 每当有人使用它时就会感到不安 The git pull命令似乎是更新本地存储库的规范方法 是否使用git pull制造问题 它会产生什么问题 有没有更好的方法来更新 git 存储库 Summary
  • 模板和单独编译

    我想用 C 编写一个单独编译的程序 我写了这样的 main cpp include
  • 在生成器函数上使用 next()

    我有这个生成器功能 def gen for i in range 3 yield i i 现在当我打电话时next on gen 它每次都给出第一个元素 gt gt gt next gen 0 gt gt gt next gen 0 但是当
  • 如何将 R Markdown 转换为 HTML?即,“Knit HTML”在 Rstudio 0.96 中做什么?

    在 Rstudio 0 96 中的 R Markdown 文件上按 Knit HTML 时会运行哪些命令 我的动机是 当我在另一个文本编辑环境中时 我可能想运行相同的命令 或者我可能想将命令组合到更大的文本编辑器中 makefile 基本脚
  • 使用 Plink (PuTTy) 通过 Python 进行 SSH

    我正在尝试编写一个 python 脚本 它将通过 SSH 连接到服务器并执行命令 我在 Windows 上使用 Python 2 6 并安装了 plink 和 paegent 用于 ssh 密钥 并将它们全部添加到我的路径中 如果我转到命令
  • 改造 - 多部分请求:所需的 MultipartFile 参数“文件”不存在

    我正在尝试使用 Retrofit2 在服务器上发送文件 我按照文档做了一切 但总是收到 400 服务器错误 我尝试这样做 RequestBody body RequestBody create MediaType parse image p
  • 在括号中显示 p 值而不是 SE

    当使用stargazer包中 我想更改系数下括号中出现的值 默认情况下 包将输出标准错误 如何将实际 p 值包含在括号中 正如中提到的Stargazer 省略测试统计 从5 0版本开始stargazer已包括report允许用户选择要报告哪
  • 如何在自托管 Windows 代理上从 Azure DevOps 管道运行 Azure CLI 任务?

    情况 我的自托管 Windows 代理运行来自 Azure DevOps 的管道 到 管理 Azure 中的资源 我想使用 Azure CLI 任务 即使在前面的步骤中安装了 Azure CLI AzureCLI 任务也会失败 我有两个从我