Ansible通过RestAPI调用主机组报错,求助多组调用方法
我来帮你搞定这个「Incorrect pattern」错误,顺便教你怎么在同一命令里处理两个主机组的需求~
一、先排查「Incorrect pattern」错误
这个报错基本是因为你传给Nagios XI API的pattern参数格式不对,或者Ansible变量引用导致参数拼接出了问题,咱们一步步来查:
- 先确认变量到底取到了啥值
先在你的Playbook里加个debug任务,把你用来获取主机组的变量打出来看看,比如:
- name: 看看主机组变量的实际值 debug: var: your_host_group_var # 换成你实际用的变量,比如group_names或者自定义的组变量
执行后看看变量是单个字符串、列表,还是带了多余的括号/引号——这些乱码符号都会让API认不出你的pattern。
- 搞清楚Nagios XI API的pattern规则
如果你是用pattern参数来匹配现有主机(比如批量操作时),Nagios XI对格式要求很严:
- 匹配主机组的正确格式是
hostgroup_name:你的组名,比如pattern=hostgroup_name:web_servers - 要是你直接写
pattern=web_servers这种裸组名,API肯定会给你扔「Incorrect pattern」的报错。
- 检查curl命令的参数拼接
如果你的变量是多个主机组的列表,直接硬拼肯定出问题。比如变量是['group1', 'group2'],你直接写pattern={{ your_var }},最终curl里的参数会变成pattern=['group1', 'group2'],这格式API完全看不懂。
二、在同一命令里处理两个主机组的两种场景
根据你的需求,分两种常见情况来处理:
场景1:把新添加的主机同时加到Nagios XI的两个组里
Nagios XI的添加主机API支持用hostgroups参数,直接用逗号分隔多个组名就行,比如:
- name: 给Nagios XI加主机并同时加入两个组 shell: | curl -XPOST "http://16.231.22.60/nagiosxi/api/v1/config/host?apikey=qfOQpKFOR..." \ -d "host_name={{ inventory_hostname }}&address={{ ansible_host }}&hostgroups=group1,group2&check_command=check_ping"
这里的hostgroups=group1,group2就能让新主机同时属于这两个组。
场景2:从Ansible清单的两个组里批量捞主机添加到Nagios XI
如果要批量处理Ansible清单里两个组的所有主机,你可以在Playbook的hosts字段里用冒号分隔两个组,然后逐个添加:
- name: 批量把两个组的主机加到Nagios XI hosts: group1:group2 # 指定要操作的两个Ansible主机组 tasks: - name: 调用API添加主机 shell: | curl -XPOST "http://16.231.22.60/nagiosxi/api/v1/config/host?apikey=qfOQpKFOR..." \ -d "host_name={{ inventory_hostname }}&address={{ ansible_host }}&hostgroups={{ group_names | join(',') }}&check_command=check_ping"
这里用group_names | join(',')把当前主机在Ansible里所属的所有组转成逗号分隔的字符串,直接传给Nagios XI的hostgroups参数,省心又准确。
最后给个小建议
尽量别用shell模块调用curl,Ansible自带的uri模块专门用来搞API调用,不仅能自动处理参数编码,还能帮你判断请求是否成功,调试起来也方便:
- name: 用uri模块更优雅地加主机 uri: url: "http://16.231.22.60/nagiosxi/api/v1/config/host" method: POST body: apikey: "qfOQpKFOR..." host_name: "{{ inventory_hostname }}" address: "{{ ansible_host }}" hostgroups: "group1,group2" check_command: "check_ping" body_format: form-urlencoded status_code: 200
这种写法完全不会出现shell命令的参数拼接问题,出错了也更容易定位。
内容的提问来源于stack exchange,提问作者user9698169
相关产品推荐
相关产品推荐

