如何在Ansible中遍历资产IP/主机名并通过API推送至Check_MK监控系统
问题根因
- 循环逻辑错误:
with_nested用于多列表笛卡尔积遍历,你当前单主机单IP/主机名的场景完全不需要使用该循环,单主机场景下恰好生成一组可用值,多主机场景下变量覆盖、遍历逻辑错误直接导致请求参数异常。 - JSON构造错误:手动拼接JSON字符串极易因特殊字符、转义失误出现格式错误,触发API返回JSON解析报错。
- 多主机逻辑缺失:现有逻辑是单主机维度执行,未做全资产信息收集,多主机执行时变量会互相覆盖,无法正常批量添加。
解决方案
方案1:单主机维度执行(Play绑定资产组,每个主机上报自己的信息)
直接删除冗余的with_nested,使用body_format自动处理请求编码,避免手动拼JSON的转义问题:
- set_fact: ip_out: "{{ hostvars[inventory_hostname].ansible_default_ipv4.address }}" host_out: "{{ hostvars[inventory_hostname].inventory_hostname }}" - name: Add host to Check_MK site via WebAPI uri: url: '{{ cmkclient__connection_string }}?action=add_host&_username={{ cmkclient_api_user }}&_secret={{ cmkclient_api_password }}&output_format=json' method: 'POST' body: request: | { "attributes": { "alias": "Test", "ipaddress": "{{ ip_out }}", "hostname": "{{ host_out }}", "create_folders": "0", "folder": "" } } body_format: form-urlencoded return_content: yes delegate_to: localhost when: '"No such host" in cmkclient__host_query.json.result' register: cmkclient__host_add changed_when: cmkclient__host_add.json is defined and cmkclient__host_add.json.result_code == 0 failed_when: cmkclient__host_add.json is not defined or cmkclient__host_add.json.result_code != 0
方案2:localhost批量执行(一次性添加所有资产主机)
先统一收集全资产的IP和主机名,再循环调用接口,适合批量资产录入场景:
- name: 收集所有资产的IP与主机名 set_fact: host_list: "{{ host_list | default([]) + [{'ip': hostvars[item].ansible_default_ipv4.address, 'name': hostvars[item].inventory_hostname}] }}" loop: "{{ groups['all'] }}" # 替换为你需要遍历的资产组名称 run_once: true delegate_to: localhost - name: 批量添加主机到Check_MK uri: url: '{{ cmkclient__connection_string }}?action=add_host&_username={{ cmkclient_api_user }}&_secret={{ cmkclient_api_password }}&output_format=json' method: 'POST' body: request: | { "attributes": { "alias": "Test", "ipaddress": "{{ item.ip }}", "hostname": "{{ item.name }}", "create_folders": "0", "folder": "" } } body_format: form-urlencoded return_content: yes loop: "{{ host_list }}" delegate_to: localhost register: cmkclient__host_add changed_when: cmkclient__host_add.json is defined and cmkclient__host_add.json.result_code == 0 failed_when: cmkclient__host_add.json is not defined or cmkclient__host_add.json.result_code != 0
批量场景建议先调用CheckMK的
get_all_hosts接口拉取全量已存在主机列表,循环时判断当前主机是否已存在,替代逐个查询的逻辑,降低API请求频次。
内容的提问来源于stack exchange,提问作者CookieDough
相关产品推荐
相关产品推荐

