我正在尝试在特定的代理程序池上运行本地化的构建。
这个想法是我分两个阶段运行管道。
第一阶段运行Ansible剧本,该剧本在Azure DevOps中创建代理池,在Azure虚拟网络中置备VM,安装代理,在此新创建的池上注册代理,并授权所有管道使用该池。这是因为需要在不同的虚拟网络上运行Ansible剧本,而VSTS需要连接到正确的代理。
第二阶段使用新创建的池来查找代理,并在实际所需的虚拟网络中运行另一台Ansible Playbook。
问题在于第二阶段失败并显示以下错误:
“管道无效。找不到ID为0的池。该池不存在或尚未被授权使用。有关授权的详细信息,请参阅https://aka.ms/yamlauthz。”
这基本上就是我正在做的事情:
阶段1:
displayName: Environment Preparation
jobs:
- job: Prepare_Customer_Environment
displayName: Prepare Target Environment
variables:
- group: Azure-Ansible-Variables
pool:
name: 'Infrastructure-Agents'
workspace:
clean: all
steps:
- task: Ansible@0
displayName: Prepare Target Environment for Deployment
inputs:
SUBSCRIPTION_ID: $(SUBSCRIPTION-ID)
failOnStderr: false
playbookPathOnAgentMachine: '$(Build.Repository.LocalPath)/ansible/playbooks/environment.yml'
第二阶段:
- stage: Environment_Provisioning
displayName: Environment Provisioning
jobs:
- job: Update_Customer_Environment
displayName: Update Target Environment
variables:
- group: Azure-Ansible-Variables
pool:
name: $(environment)-$(env_id)
workspace:
clean: all
steps:
该池的名称正确,我已经对其进行了10次检查。
在Ansible中,我使用REST API调用创建池:
- name: VSTS Agent Specific Configuration | Create the Agent Pool
register: create_pool_result
uri:
url: "https://company.visualstudio.com/_apis/distributedtask/pools?api-version=5.0-preview.1"
method: POST
body_format: json
body: {"name": "{{ hostvars['localhost']['resource_group'] }}","autoProvision": true}
status_code:
- 200
- 409
headers:
Authorization: "Bearer {{ hostvars['localhost']['current_bearer_token_3'] }}"
我在这里授权使用它:
- name: VSTS Agent Specific Configuration | Authorise Agent Pool for all Pipelines
register: authorise_pool_result
uri:
url: "https://dev.azure.com/Company/Project/_apis/build/authorizedresources?api-version=5.0-preview"
method: PATCH
body_format: json
body: [{"name": "{{ hostvars['localhost']['resource_group'] }}","type": "queue","id": "{{ current_agent_pool_queue }}","authorized": true}]
status_code:
- 200
headers:
Authorization: "Bearer {{ hostvars['localhost']['current_bearer_token_3'] }}"
所有这些都有效,但是第二阶段找不到池。我认为这是因为yaml文件是在创建池之前加载的,然后我会尝试查找它认为不存在的资源。
有没有一种方法可以重新加载定义/构建文件?还是通过任何方式获得服务以查找即时创建的资源?
谢谢。