如何基于Ansible主机文件变量本地循环执行任务?
如何在本地循环Ansible主机组变量并执行任务?
我来帮你解决这个问题——要在本地执行任务同时遍历[any]组里的每台主机变量(比如region和ec2_instance_id),其实有两种直观的方法,都能完美适配你的需求,下面分别说明:
方法1:委托本地执行,遍历原主机组
这种方法最贴近你原来的Playbook结构,只需要给任务加上本地委托配置,让原本针对远程主机的任务在本地执行,同时保留每台主机的变量引用:
- name: Fetch EC2 tags locally for all hosts in [any] group hosts: any gather_facts: no # 不需要收集远程主机信息,我们只用到主机文件里的变量 connection: local # 整个Play默认使用本地连接,替代给单个任务加delegate_to tasks: - name: List EC2 tags for each instance ec2_tag: region: "{{ region }}" resource: "{{ ec2_instance_id }}" state: list register: ec2_tags - name: Display fetched tags debug: msg: "Instance {{ ec2_instance_id }} in region {{ region }} has tags: {{ ec2_tags.tags }}"
原理说明
Play的hosts: any会遍历组内的每一条主机记录,connection: local让所有任务都在你的本地机器上执行,而不是连接到123.123.123.123这些远程主机。每一轮循环都会自动使用当前主机的region和ec2_instance_id变量,完全匹配你的需求。
方法2:针对localhost,主动循环主机组变量
如果你想直接以本地为主机,然后主动遍历[any]组的所有主机变量,可以用这种方式,通过hostvars获取每台主机的变量值:
- name: Fetch EC2 tags by looping through [any] group locally hosts: localhost gather_facts: no tasks: - name: List EC2 tags for each instance in [any] ec2_tag: region: "{{ hostvars[item].region }}" resource: "{{ hostvars[item].ec2_instance_id }}" state: list register: ec2_tags loop: "{{ groups['any'] }}" loop_control: label: "{{ hostvars[item].ec2_instance_id }}" # 让循环输出更简洁,只显示实例ID - name: Print all tag results debug: msg: "Instance {{ hostvars[item.item].ec2_instance_id }} ({{ hostvars[item.item].region }}) tags: {{ item.tags }}" loop: "{{ ec2_tags.results }}"
原理说明
Play只针对localhost执行,然后用loop: "{{ groups['any'] }}"遍历[any]组的所有主机名/IP,通过hostvars[item]获取对应主机的变量值。这种方式适合你想在单个本地任务中批量处理所有主机变量的场景。
注意事项
- 确保你的本地Ansible环境已经安装了
boto3和botocore(ec2_tag模块依赖AWS SDK,可通过pip install boto3 botocore安装) - 两种方法都不需要实际连接到
123.123.123.123这些远程主机,所有操作都在本地完成,仅使用主机文件中定义的变量
内容的提问来源于stack exchange,提问作者adam
相关产品推荐
相关产品推荐

