使用Ansible的amazon.aws.ec2_metadata_facts访问EC2标签的疑问
问题解答
关于ansible_ec2_tags_instance_<tag key name>变量的文档说明
ansible_ec2_tags_instance_<tag key name>这类变量属于amazon.aws.ec2_metadata_facts模块收集元数据时自动衍生的隐式变量,官方文档中并未单独对其进行明确标注。模块会将EC2实例元数据中的标签解析为前缀为ansible_ec2_tags_instance_的变量,但仅支持符合Ansible变量命名规则的标签名(不能包含连字符、空格等特殊字符),这也是带“-”的标签无法通过该方式访问的原因。
访问含特殊字符的EC2标签的解决方法
由于Ansible变量名不允许包含连字符,当标签名带有“-”时,你可以通过字典键值对的方式直接访问标签字典,这种方式对所有格式的标签名都生效:
- name: 收集EC2元数据 amazon.aws.ec2_metadata_facts: - name: 获取带连字符的EC2标签值 set_fact: new_var: "{{ ansible_ec2_tags_instance['my-tag'] }}" tags: - testssl
如果标签名是my_tag或mytag,也可以用这种方式访问,兼容性更强。
访问hostvars中EC2标签的简便方法
当你已经通过amazon.aws.ec2_metadata_facts收集了元数据后,EC2标签会以字典形式存储在hostvars的ansible_ec2_tags_instance字段中,无需额外转换:
- 当前主机直接访问:
{{ ansible_ec2_tags_instance['标签名'] }} - 跨主机访问其他实例的标签:
{{ hostvars['目标主机 inventory 名称']['ansible_ec2_tags_instance']['标签名'] }}
比如在play中直接引用标签值,无需先通过set_fact赋值:
- name: 打印当前主机的my-tag标签值 debug: msg: "当前主机的my-tag标签值为: {{ ansible_ec2_tags_instance['my-tag'] }}" tags: - testssl
内容的提问来源于stack exchange,提问作者Daniel Owen
相关产品推荐
相关产品推荐

