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

如何在Ansible中遍历资产IP/主机名并通过API推送至Check_MK监控系统

问题根因

  1. 循环逻辑错误:with_nested用于多列表笛卡尔积遍历,你当前单主机单IP/主机名的场景完全不需要使用该循环,单主机场景下恰好生成一组可用值,多主机场景下变量覆盖、遍历逻辑错误直接导致请求参数异常。
  2. JSON构造错误:手动拼接JSON字符串极易因特殊字符、转义失误出现格式错误,触发API返回JSON解析报错。
  3. 多主机逻辑缺失:现有逻辑是单主机维度执行,未做全资产信息收集,多主机执行时变量会互相覆盖,无法正常批量添加。

解决方案

方案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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:45:06