如何用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
相关产品推荐
相关产品推荐

