You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:12:46