无法通过infoblox-client修改Infoblox中的主机记录名称
解决Infoblox-Client更新主机记录名称的问题
我之前也踩过infoblox-client的这个坑,帮你捋清楚问题和正确的解决步骤:
核心问题分析
你遇到的情况是典型的Infoblox-Client方法特性误解:
- 用
create+update_if_exists=True时,HostRecord类型的默认行为是给同一个IP新增关联名称(别名),而非覆盖原有名称,这和Infoblox本身的HostRecord多名称关联IP的设计一致; - 你参考测试用例时错误地把记录数据传给了Connector构造函数,它只接受连接参数(host、账号密码),所以才会报参数缺失错误。
正确的更新步骤
要修改现有HostRecord的名称,必须通过获取记录引用(_ref)+ 调用update_object的方式来实现,具体代码如下:
1. 先定位目标主机记录的_ref
首先通过IP或原名称查询到你要修改的记录,拿到它的唯一引用:
opts = {'host': '192.168.1.10', 'username': 'admin', 'password': 'admin'} conn = connector.Connector(opts) # 方式一:通过IP查询目标记录 search_params = {'view': 'my_dns_view', 'ip': '192.168.1.25'} host_records = conn.get_object('record:host', search_params) # 方式二:通过原名称查询目标记录 # search_params = {'view': 'my_dns_view', 'name': 'my_host_record.my_zone.com'} # host_records = conn.get_object('record:host', search_params) if not host_records: print("未找到对应主机记录,请检查参数") exit() existing_record = host_records[0] record_ref = existing_record['_ref']
2. 调用update_object修改名称
拿到_ref后,直接发起更新请求修改name字段即可:
update_payload = {'name': 'new_name.my_zone.com'} update_result = conn.update_object(record_ref, update_payload) if update_result: print("主机记录名称更新成功!") else: print("更新失败,请检查权限或名称是否已存在")
额外说明
如果你希望更新后该IP只关联新名称(移除原有名称),因为HostRecord本身支持多名称绑定,你需要额外处理:
- 先查询该HostRecord下的所有关联名称;
- 在更新时移除不需要的旧名称(通过修改
names字段,保留新名称即可)。
比如:
# 获取当前记录的所有名称 current_names = existing_record.get('names', []) # 保留新名称,移除旧名称 new_names = ['new_name.my_zone.com'] update_payload = {'names': new_names} conn.update_object(record_ref, update_payload)
内容的提问来源于stack exchange,提问作者justjais
相关产品推荐
相关产品推荐

