Ansible入门:如何从include_tasks中传递返回结果?
嘿,刚入门Ansible确实容易碰到这类细节问题,先帮你梳理清楚怎么获取include_tasks里的返回结果,顺便先提个小问题:你子任务里的instance-state-name: running...多了三个点,得改成running哦,不然过滤器会匹配不到实例。
回到你的核心问题,其实你当前的代码已经在收集返回结果了,只是需要知道怎么正确提取里面的内容:
1. 理解当前register的结构
你在include_tasks这一步用了register: res,再加上with_dict: "{{users}}",那么res.results会是一个列表,列表里的每一个元素对应users字典中的一个键值对的执行结果。每个元素里包含了子任务中所有任务的返回数据。
比如你的子任务里只运行了ec2_instance_facts模块,这个模块会把实例信息放到ansible_facts里,所以你可以这样提取每个用户的实例信息:
修改你的print任务:
- name: print instance info for each user debug: msg: "User {{ item.item.key }} has instances: {{ item.ansible_facts.ec2_instances }}" loop: "{{ res.results }}"
这里的item.item.key就是循环中的用户key,item.ansible_facts.ec2_instances就是ec2_instance_facts返回的实例列表。
2. 子任务多任务场景的结果提取
如果你的子任务里有多个任务,想要分别获取每个任务的返回值,可以在子任务里单独给每个任务加register,比如:
修改inhabit_instance.yml:
- name: Get instance info for {{ item.key }} ec2_instance_facts: profile: henryaws filters: "tag:name": "{{item.key}}" instance-state-name: running register: instance_info - name: Log instance count debug: msg: "Found {{ instance_info.ansible_facts.ec2_instances | length }} instances" register: log_result
然后在主任务里,你可以通过res.results里的results字段访问子任务中每个任务的结果:
- name: print all sub-task results debug: msg: | User {{ item.item.key }}: Instance info task result: {{ item.results[0].ansible_facts.ec2_instances }} Log task result: {{ item.results[1].msg }} loop: "{{ res.results }}"
这里的item.results[0]对应子任务里第一个任务的结果,item.results[1]对应第二个任务的结果。
3. 额外小提示
- 如果你用的是Ansible 2.9及以上版本,
ec2_instance_facts模块已经被弃用,推荐使用amazon.aws.ec2_instance_info模块,用法基本一致。 - 如果你担心XY问题,其实可以补充说明你最终想要实现的目标,比如是要批量获取用户对应的实例信息后做什么操作,这样能帮你更精准地优化方案~
内容的提问来源于stack exchange,提问作者aikipooh

