使用Ansible vars_file变量给AWS IAM角色打标签报错求助
IAM角色标签创建报错原因及修复方案
报错核心原因
你的Ansible任务中,标签键的写法在部分版本中未被正确解析:
tags: "{{ global_tags.created_by.name }}": "{{ global_tags.created_by.value }}"
在Ansible 2.7及更早版本中,YAML字典键位置的"{{ var }}"写法不会被解析为变量值,而是被当作原始字符串{{ global_tags.created_by.name }}传递给AWS API。这个字符串包含{}字符,违反了AWS标签键必须匹配的正则规则[\p{L}\p{Z}\p{N}_.:/=+\-@]+(该规则禁止{}这类特殊符号),因此触发ValidationError。
而debug模块能正常打印变量,是因为debug中直接引用变量的场景,Ansible会按常规逻辑解析变量值,和字典键位置的语法解析规则不同。
修复方案
根据你的Ansible版本,选择以下两种方案之一:
方案1:适用于Ansible 2.8+版本
直接使用YAML的变量键语法,确保变量被解析:
tags: "{{ global_tags.created_by.name }}": "{{ global_tags.created_by.value }}"
(注:如果你的Ansible版本符合要求,只需确认任务中缩进和引号格式正确即可)
方案2:兼容所有Ansible版本(推荐)
使用dict过滤器动态构建标签字典,彻底避免YAML语法解析问题:
tags: "{{ dict([[global_tags.created_by.name, global_tags.created_by.value]]) }}"
如果需要添加多个标签,直接扩展列表元素即可:
tags: "{{ dict([ [global_tags.created_by.name, global_tags.created_by.value], [global_tags.environment.name, global_tags.environment.value] ]) }}"
修复后,Ansible会先解析变量生成合法的键值对owner: ansible,再传递给AWS API,满足标签格式要求,即可成功创建IAM角色。
内容的提问来源于stack exchange,提问作者Tony Chan
相关产品推荐
相关产品推荐

