能否将Ansible Inventory中的hostname作为uri模块的url参数并循环调用?
当然可行!不用单独放vars文件,直接用Inventory组变量就行
你完全不需要把webservers组的主机名放到vars文件里,Ansible原生就支持直接引用Inventory中的组主机列表,还能轻松实现遍历执行的需求,这正是Inventory设计的初衷呀!
具体实现方法
核心就是用Ansible内置的groups['webservers']变量,它会直接返回你Inventory里webservers组下的所有主机名列表。然后通过loop指令遍历这个列表,把每个主机名传入uri模块的url参数即可。
另外要注意:uri模块是发起HTTP请求的任务,通常不需要在目标主机上执行,所以最好加上delegate_to: localhost让任务在控制节点运行,避免不必要的远程执行开销。
修改后的完整Playbook示例
- name: 获取webservers组中每个主机的网页内容 hosts: localhost tasks: - name: 逐个访问webserver的URL uri: url: "http://{{ item }}" return_content: yes register: webpage_results loop: "{{ groups['webservers'] }}" delegate_to: localhost - name: 打印每个主机的返回内容(可选) debug: msg: "来自 {{ item.item }} 的内容片段: {{ item.content[:100] }}..." loop: "{{ webpage_results.results }}"
关键细节解释
groups['webservers']:自动从Inventory中读取webservers组的所有主机,后续你更新Inventory里的主机列表时,Playbook不需要任何修改就能自动适配loop: "{{ groups['webservers'] }}":让uri任务遍历组内的每个主机,依次执行请求register: webpage_results:把每个主机的请求结果存储在webpage_results.results数组里,每个元素包含对应主机的返回内容、状态码等信息delegate_to: localhost:确保任务在控制节点执行(如果你确实需要在目标主机上发起请求,可以去掉这一行)
这样一来,你就不用手动维护主机名列表,完全依赖Inventory来管理,既简洁又不容易出错。
内容的提问来源于stack exchange,提问作者user1536782
相关产品推荐
相关产品推荐

