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

如何用Ansible URI模块通过Host头健康检查同端口多本地网站?

问题描述

我想要对部署了多个网站的Web主机进行健康检查,请问能否使用Ansible的URI模块在同一端口下遍历不同站点?

我现有如下代码:

# Check site directory is present

- name: "Check 'Site 1' site directory"
  ansible.windows.win_stat:
    path: C:\WWW\site1
  register: check_site_1

- name: "Check 'Site 2' site directory"
  ansible.windows.win_stat:
    path: C:\WWW\site2
  register: check_site_2

- name: "Check 'Site 3' site directory"
  ansible.windows.win_stat:
    path: C:\WWW\site3
  register: check_site_3

# Query Sites

# site-1.example.com
- name: "Check 'Site 1' site"
  uri:
    url: "http://{{ ansible_host }}:80/"
    status_code: 
      - 200 
      - 301 
      - 302
  register: result
    delay: 10
    failed_when: result.status == 404
  when: check_site_1.stat.exists

# site-2.example.com
- name: "Check 'Site 2' site"
  uri:
    url: "http://{{ ansible_host }}:80/"
    status_code: 
      - 200 
      - 301 
      - 302
  register: result
    delay: 10
    failed_when: result.status == 404
  when: check_site_2.stat.exists

# site-3.example.com
- name: "Check 'Site 3' site"
  uri:
    url: "http://{{ ansible_host }}:8080/"
    status_code: 
      - 200 
      - 301 
      - 302
  register: result
    delay: 10
    failed_when: result.status == 404
  when: check_site_3.stat.exists

当前遇到的问题是:当多个站点使用同一端口时,我希望通过传递主机名,以ansible_host来查询本地网站,而非使用可能指向其他主机的负载均衡域名site-1.example.com。请问是否有人尝试过使用URI模块设置Host头来实现本地站点查询?


解决方案

完全可以通过给URI模块添加headers参数设置Host请求头来实现同一端口下不同站点的健康检查,这是多站点共享端口场景下的常规做法。

优化后的Playbook可以简化重复代码,用循环替代重复任务,同时实现需求:

# 定义待检查的站点信息集合
- name: 定义站点检查清单
  set_fact:
    sites_to_check:
      - name: "Site 1"
        dir_path: "C:\\WWW\\site1"
        host_header: "site-1.example.com"
        port: 80
      - name: "Site 2"
        dir_path: "C:\\WWW\\site2"
        host_header: "site-2.example.com"
        port: 80
      - name: "Site 3"
        dir_path: "C:\\WWW\\site3"
        host_header: "site-3.example.com"
        port: 8080

# 批量检查站点目录是否存在
- name: 验证站点目录存在性
  ansible.windows.win_stat:
    path: "{{ item.dir_path }}"
  register: site_dir_checks
  loop: "{{ sites_to_check }}"

# 批量执行站点健康检查
- name: 执行站点健康状态检查
  uri:
    url: "http://{{ ansible_host }}:{{ item.item.port }}/"
    status_code: [200, 301, 302]
    headers:
      Host: "{{ item.item.host_header }}"
    delay: 10
  register: check_result
  failed_when: check_result.status == 404
  when: item.stat.exists
  loop: "{{ site_dir_checks.results }}"

关键说明

  • Host头路由:通过headers参数指定Host字段,Web服务器会根据该头信息精准路由到对应的站点,解决同一端口下多站点的区分问题。
  • 本地检查保障:URL使用ansible_host直接访问目标主机,完全绕开负载均衡域名,确保检查的是当前主机上的站点实例。
  • 代码可维护性:用循环替代重复任务,后续新增站点只需在sites_to_check列表中添加条目即可,无需重复编写检查逻辑。

内容的提问来源于stack exchange,提问作者Mr. E

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:03:21