通过Azure CLI执行Ansible Playbook时出现MSI令牌获取失败问题
排查步骤
1. 核查依赖版本兼容性
这个错误大概率是Azure SDK依赖包与Ansible Azure集合版本不匹配导致的:
- 执行以下命令查看当前版本:
ansible --version pip show azure-core azure-identity ansible-collection-azure - 重点关注
azure-identity和ansible-collection-azure的版本:旧版Azure Ansible集合依赖特定版本的azure-identity,如果Cloud Shell自动更新了其中一方,就会出现API不兼容(比如MSIAuthentication类的get_token方法被移除或重命名)。
2. 手动验证MSI功能
排除MSI服务本身的问题:
- 在Cloud Shell中执行以下命令手动获取MSI token:
curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/' -H Metadata:true - 如果能正常返回包含
access_token的JSON,说明MSI服务正常;如果返回错误,联系Azure支持排查Cloud Shell的MSI配置。
3. 强制安装兼容的依赖版本
如果确认是版本不兼容,临时指定兼容版本修复:
- 安装与当前Ansible Azure集合匹配的
azure-identity版本(例如1.12.0是兼容性较高的版本):pip install --user azure-identity==1.12.0 - 重新运行Playbook测试。
4. 显式指定认证方式
确保Playbook明确使用MSI认证:
- 在模块参数中添加
auth_source: msi,修改后的任务如下:- name: create Log Analytics workspace azure_rm_loganalyticsworkspace: resource_group: "{{ resource_group_name }}" name: "{{ workspace_name }}" location: "{{ location }}" sku: per_gb2018 auth_source: msi
5. 确认Cloud Shell订阅上下文
虽然多个账户出现问题,仍需确认当前订阅状态:
- 执行
az account show查看当前激活的订阅,确保该订阅下MSI有足够权限创建Log Analytics工作区(不过多账户都出问题的话,此步骤优先级较低)。
内容的提问来源于stack exchange,提问作者Bartłomiej Janik
相关产品推荐
相关产品推荐

