Cookbook¶
Copy-pasteable command recipes for the common jobs an ibcli operator runs.
Each section lists the command shape (abbreviations are fine - co g M m a is
the same as configure grid <grid> member add) and, where relevant, notes
what WAPI field the command lands on.
Conventions¶
Placeholders used throughout this page¶
Anything in angle brackets is a placeholder you substitute with your own value. The three you'll see most often:
| Placeholder | What to replace with | Example |
|---|---|---|
<grid> |
Your NIOS grid name - the string you picked on grid-join, not the master IP. | Migration |
<fqdn> |
A fully-qualified member host name. | ibdns01.example.com |
<cidr> |
A CIDR (v4 or v6). | 10.10.1.0/24, 2001:db8:100:1::/64 |
Commands like configure grid <grid> member add … require the grid name verbatim.
Shell snippets additionally assume you've exported three environment variables identifying your grid - adapt once and the rest of the page is copy-paste-safe:
Connecting¶
# Interactive REPL
ibcli -s "$GRID" -u "$USER" -p "$PASSWORD" -k
# Run a single command and exit
ibcli -s "$GRID" -u "$USER" -p "$PASSWORD" -k -e "show member"
# Batch-process a .ibcli file
ibcli -s "$GRID" -u "$USER" -p "$PASSWORD" -k lab-provision.ibcli
# Same, but treat "already exists" conflicts as skippable - makes a re-run
# land cleanly on a partially-provisioned grid.
ibcli -s "$GRID" -u "$USER" -p "$PASSWORD" -k -i lab-provision.ibcli
Flags worth knowing:
| Flag | Purpose |
|---|---|
-k / --insecure |
Skip TLS verification (lab certs). |
-i / --idempotent |
Convert already exists conflicts into Skipped: warnings. |
-e "<cmd>" |
Run one command non-interactively. |
-m <ip> |
Set grid master IP (used when connecting via MGMT port). |
--wapi-version <ver> |
Override auto-detected WAPI version. |
-l |
List every registered match-line and exit. |
Output conventions (batch mode):
| Prefix | Meaning |
|---|---|
OK: |
Mutating command succeeded; handler had no output of its own. |
Skipped: |
-i mode: NIOS reported the object already exists. |
Deferred: |
Success contingent on grid state that isn't ready yet (e.g. IPv6 loopback waiting for the member). |
Error: |
Real failure - stripped of AdmConDataError: None (…) wrapper. |
All four prefixes are printed with two leading spaces, so scripts that grep ' Error:' still work.
Grid members¶
Add a minimal member¶
configure grid <grid> member add ibdns01.example.com \
ipaddress=192.0.2.101/24 gateway=192.0.2.1 \
platform=VNIOS hwtype=IB-V1425 \
license=dns license=nios license=enterprise
license= repeats; each license appears in the pre-provisioning hardware
spec.
Add a dual-stack member (IPv4 + IPv6 VIP)¶
configure grid <grid> member add ibdns01.example.com \
ipaddress=192.0.2.101/24 gateway=192.0.2.1 \
ipv6addr=2001:db8:64:40::101/64 ipv6gateway=2001:db8:64:40::1 \
platform=VNIOS hwtype=IB-V1425 \
license=dns license=nios license=enterprise
When ipv6addr= is supplied, ibcli automatically sets
config_addr_type=BOTH (or IPV6 if no IPv4) - without that flag NIOS
silently drops ipv6_setting on pre-provisioned members.
Add a member with a MGMT interface (v4 + v6)¶
configure grid <grid> member add ibdns01.example.com \
ipaddress=192.0.2.101/24 gateway=192.0.2.1 \
ipv6addr=2001:db8:64:40::101/64 ipv6gateway=2001:db8:64:40::1 \
mgmt_ipaddress=198.51.100.101/24 mgmt_gateway=198.51.100.1 \
mgmt_ipv6addr=2001:db8:65:40::101/64 mgmt_ipv6gateway=2001:db8:65:40::1 \
platform=VNIOS hwtype=IB-V1425 license=dns license=nios license=enterprise
MGMT fields land on node_info[0].mgmt_network_setting and
node_info[0].v6_mgmt_network_setting. The mgmt_port_setting.enabled flag
is set to true automatically when any MGMT field is supplied.
Enable DNS / DHCP service on a member¶
configure grid <grid> member ibdns01.example.com dns enable
configure grid <grid> member ibdns01.example.com dns disable
configure grid <grid> member ibdhcp01.example.com dhcp enable # IPv4 only (default)
configure grid <grid> member ibdhcp01.example.com dhcp enable ipv4 # IPv4 only (explicit)
configure grid <grid> member ibdhcp01.example.com dhcp enable ipv6 # IPv6 only
configure grid <grid> member ibdhcp01.example.com dhcp enable both # IPv4 + IPv6
configure grid <grid> member ibdhcp01.example.com dhcp disable ipv6
The dhcp enable/disable verb maps to:
| Qualifier | WAPI field toggled |
|---|---|
ipv4 (or bare) |
enable_dhcp |
ipv6 |
enable_dhcpv6_service |
both |
both in a single PUT |
Anycast loopback on a member¶
# Shared DNS anycast address across every DNS member:
configure grid <grid> member ibdns01.example.com anycast add 192.0.2.53
configure grid <grid> member ibdns02.example.com anycast add 192.0.2.53
…
# IPv6 anycast:
configure grid <grid> member ibdns01.example.com anycast add 2001:db8:0:53::53
# Defaults to /32 (v4) or /128 (v6); override with /prefix:
configure grid <grid> member ibdns01.example.com anycast add 192.0.2.0/30
# Removal:
configure grid <grid> member ibdns01.example.com anycast delete 192.0.2.53
Each command reads the member's current additional_ip_list, appends (or
removes) an interface struct with interface=LOOPBACK and anycast=true,
and PUTs the full list back.
IPv6 anycast note: NIOS requires the member's LAN IPv6 VIP to be live
before it accepts a v6 loopback. On pre-provisioned (not-yet-booted) members
the handler prints Deferred: v6 anycast <addr> on <member> (waiting for
member to come online with IPv6 LAN) instead of erroring - re-running once
the member boots will complete it.
Networks and DHCP ranges¶
Add a /24 with both DHCP members¶
DHCP range bound to a failover group¶
configure network failover add fo-group1 \
primary ibdhcp01.example.com secondary ibdhcp02.example.com
configure network 10.10.1.0/24 range add 10.10.1.100 10.10.1.200 failover=fo-group1
Swap a range to a different failover group¶
Previously this required three commands (delete range → move network members → re-add range). Now it's one:
Set DHCP options on a network¶
configure network 10.10.1.0/24 modify \
option=routers=10.10.1.1 \
option=domain-name=example.com \
option=domain-name-servers=10.10.1.2,10.10.2.2 \
option=ntp-servers=10.10.1.3 \
option=Cisco-AP:wlc-address=10.10.99.10,10.10.99.11
Space-qualified vendor options use space:name=value. To clear every option:
option=clear.
Extensible Attributes on an existing network¶
# Discoverable sibling of `modify set` - specifically for EAs:
configure network 10.10.1.0/24 extattrs set "DC Location" DC1
configure network 10.10.1.0/24 extattrs delete "DC Location"
Merges with existing extattrs; accepts quoted EA names with spaces.
DNS zones and records¶
Create a zone with an NS group¶
configure nsgroup add ns-group1 \
primary=ibdns01.example.com \
secondary=ibdns02.example.com \
secondary=ibdns03.example.com
configure zone add zone01.example.com ns_group=ns-group1
Reverse zones auto-rewrite CIDRs to in-addr.arpa/ip6.arpa:
configure zone add 10.10.1.0/24 ns_group=ns-group1
configure zone add 2001:db8:100:1::/64 ns_group=ns-group1
Add records¶
configure zone zone01.example.com add a web 10.10.1.10
configure zone zone01.example.com add aaaa web 2001:db8:100:1::10
configure zone zone01.example.com add cname www web.zone01.example.com
configure zone zone01.example.com add mx mail mail.zone01.example.com 10
configure zone zone01.example.com add txt spf "v=spf1 mx -all"
configure zone zone01.example.com add host ns1 10.10.1.1
Host records accept multiple IPs, aliases, and host-embedded fixed-addresses:
configure zone zone01.example.com add host web01 \
ip=10.10.1.20 ip=10.10.2.20 ipv6=2001:db8:100:1::20 \
alias=www.zone01.example.com alias=portal.zone01.example.com \
fixed mac=aa:bb:cc:00:00:01
Delegation, stub, and forward zones¶
configure zone add child.zone01.example.com \
delegate_to=ns1,203.0.113.70 delegate_to=ns2,203.0.113.71
configure zone add stub.partner.com stub_from=ns1,203.0.113.53
configure zone add corp.partner.com forward_to=ns1,8.8.8.8 forward_to=ns2,8.8.4.4
Views¶
configure view add External comment="External DNS view"
configure zone add ext01.example.net ns_group=ns-external view=External
configure zone ext01.example.net add a web 203.0.113.10 view=External
DTC (DNS Traffic Control)¶
Build an LBDN from scratch¶
configure dtc server add web1 host=203.0.113.10
configure dtc server add web2 host=203.0.113.20
configure dtc server add web3 host=203.0.113.30
configure dtc monitor icmp add web-icmp
configure dtc monitor http add web-http
configure dtc pool add web-pool lb_preferred_method=round_robin
configure dtc pool web-pool server add web1
configure dtc pool web-pool server add web2
configure dtc pool web-pool server add web3
configure dtc pool web-pool monitor add icmp web-icmp
configure dtc pool web-pool monitor add http web-http
configure dtc lbdn add web-lbdn lb_method=round_robin patterns=www.dtc.example.com
configure dtc lbdn web-lbdn pool add web-pool
Each wiring command reads the parent's link array, mutates it, and PUTs it
back. Detach with server delete, monitor delete <proto> <name>, or
pool delete.
Auth services¶
Handlers fill in NIOS-required defaults (timeout, retries, DC auth_port, etc.) so minimal commands work against a real grid:
configure auth ldap add lab-ldap \
server=ldap.corp.example.com:636 \
base_dn="dc=corp,dc=example,dc=com" \
comment="Lab LDAP"
configure auth ad add lab-ad \
domain=corp.example.com \
dc=dc1.corp.example.com dc=dc2.corp.example.com \
comment="Lab AD"
configure auth radius add lab-radius \
server=radius.corp.example.com \
shared_secret=labsecret \
comment="Lab RADIUS"
RPZ¶
configure rpz zone add rpz.lab.local policy=GIVEN comment="Lab RPZ policy zone"
configure rpz record a add badsite.example.com.rpz.lab.local 127.0.0.1 zone rpz.lab.local
configure rpz record aaaa add badsite6.example.com.rpz.lab.local ::1 zone rpz.lab.local
Named ACLs and grid recursion¶
configure acl add acl-recursion-internal \
access_list=10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 \
comment="Networks allowed to recurse via Internal DNS view"
configure grid <grid> dns allow_recursion acl=acl-recursion-internal
# Or without a named ACL:
configure grid <grid> dns allow_recursion any
configure grid <grid> dns allow_recursion ace=10.0.0.0/8 deny_ace=10.99.0.0/16
Inspecting and editing ACLs¶
show acl # hint line tells you to use `all` or a name
show acl all # dump every named ACL
show acl <name> # dump one
# Edit an existing ACL via the generic set verb - uses the ACL
# shortcut syntax (see set-syntax.md):
configure acl <name> set access_list=ALLOW:10.0.0.0/8,DENY:10.99.0.0/16
File operations¶
Downloads¶
Per-member dumps (member=<host_name> required):
download dns_conf /tmp/dns.cfg member infoblox.localdomain
download dns_cache /tmp/dns.cache member ibdns01.example.com
download dns_recursing_cache /tmp/dns.rec member ibdns01.example.com
download dhcp_conf /tmp/dhcp.cfg member ibdhcp01.example.com
download expert_dhcp_conf /tmp/xdhcp.cfg member ibdhcp01.example.com
download dhcpv6_conf /tmp/v6.cfg member ibdhcp01.example.com
download ntp_keys /tmp/ntp.keys member ibdns01.example.com
download radius_conf /tmp/rad.cfg member infoblox.localdomain
download traffic_capture /tmp/cap.pcap member infoblox.localdomain
Support bundles and logs:
download support_bundle /tmp/sb.tar.gz member infoblox.localdomain
download log_files /tmp/logs.tgz syslog member ibdns01.example.com
download merge_log /tmp/merge.log
download lease_history /tmp/leases.csv
Tab-complete the member slot. Pressing <TAB> after member pulls
live member names from the grid (primed when you connect).
Uploads¶
upload csv /tmp/hosts.csv object network
upload database /tmp/backup.tar.gz
upload expert_dhcp_conf /tmp/xdhcp.cfg member ibdhcp01.example.com
Tab completion tips¶
The completer shows live object names for slots that refer to existing objects:
| Slot | Completes from |
|---|---|
configure zone <TAB> |
existing zones |
configure view <TAB> |
existing DNS views |
configure network <TAB> |
existing networks |
configure dtc pool <TAB> |
existing DTC pools |
configure dtc pool <pool> server add <TAB> |
existing DTC servers |
configure dtc pool <pool> monitor add <proto> <TAB> |
monitors of that proto |
configure dtc lbdn <lbdn> pool add <TAB> |
existing DTC pools |
download … member <TAB> |
grid members (host_names) |
configure grid <TAB> |
connected grid name (auto-fills if there's only one) |
show grid <TAB> |
connected grid name |
show acl <TAB> |
all + existing named ACLs |
show ca_certificate <TAB> |
existing CA certificates |
show auth {ldap,ad,radius,tacacs,saml,certificate} <TAB> |
configured auth services of that type |
show capacity_report <TAB> |
grid members (hint line lists available members when none given) |
configure … set <TAB> |
writable fields of the target WAPI object, with type labels |
Grey ⟨…⟩ entries are slot hints - they tell you what shape of value the
next token should take (IP, CIDR, name, etc.) without inserting anything.
Discovering writable fields¶
Every configure ... set <key>=<value> pass-through has tab completion for
the key names (with type hints as metadata - true/false, number,
text list, enum choices, etc.). For the grid-wide service verbs there's
also a dedicated helper:
show grid <name> dhcp keys
show grid <name> dns keys
show grid <name> threat_insight keys
show grid <name> threat_protection keys
show grid <name> file_distribution keys
which prints the full alphabetical table of writable fields and types.
See the set value syntax reference for the coercion rules (bool / int / JSON / ACL shortcut) and example invocations.
Idempotency and re-running¶
Run a provisioning script twice with -i and the second run should land
cleanly - every successful mutation from the first run becomes a Skipped:
line on the second.
Typical clean second-run breakdown:
Error: 0
OK: N (the truly-fresh work, usually 0 on a stable grid)
Skipped: M (idempotent no-ops - objects already exist)
Deferred: D (NIOS preconditions not yet met, e.g. v6 loopback on an offline member)
Scenarios¶
End-to-end recipes for common maintenance jobs. Each one composes the commands above and calls out the gotchas.
Move a DHCP range from one failover group to another¶
The classic pain: a range is pinned to fo-group1 (two peers), and you
want to move it to fo-group2 with two different peers. Pre-range modify
this required delete → network member swap → re-add. Now it's one line:
Full lab-style walkthrough - adding two new DHCP members, creating a second failover group, and shifting two ranges onto it:
# Bring up the new members
configure grid <grid> member add ibdhcp03.example.com ipaddress=192.0.2.113/24 gateway=192.0.2.1 \
platform=VNIOS hwtype=IB-V1425 license=dhcp license=nios license=enterprise
configure grid <grid> member add ibdhcp04.example.com ipaddress=192.0.2.114/24 gateway=192.0.2.1 \
platform=VNIOS hwtype=IB-V1425 license=dhcp license=nios license=enterprise
# Create the new failover pair
configure network failover add fo-group2 \
primary ibdhcp03.example.com secondary ibdhcp04.example.com
# Swap the ranges onto the new group (members come from the failover peers)
configure network 10.10.4.0/24 range modify 10.10.4.100 10.10.4.200 failover=fo-group2
configure network 10.10.5.0/24 range modify 10.10.5.100 10.10.5.200 failover=fo-group2
Reverting a range to a single-member setup (detach from failover):
Add an alias to an existing host record¶
configure zone add host … takes alias= at create time. To mutate an
existing record without losing anything, use the companion modify host
path - it's a GET-then-PUT that merges with whatever's already there:
# Add one
configure zone zone01.example.com modify host web01 add-alias=www
# Add two in one PUT
configure zone zone01.example.com modify host web01 add-alias=www add-alias=portal
# Remove one
configure zone zone01.example.com modify host web01 remove-alias=portal
# Same shape for IP and IPv6 entries
configure zone zone01.example.com modify host web01 add-ip=10.10.1.25 add-ipv6=2001:db8:100:1::25
configure zone zone01.example.com modify host web01 remove-ip=10.10.1.25
# Flip the disable flag, update the comment
configure zone zone01.example.com modify host web01 disable=true comment="Decommissioned 2026-05"
# Cross-view - pass view=<name> when the record lives in a non-default view
configure zone ext01.example.net modify host ns1 add-alias=dns1 view=External
Alias names relative to the containing zone are auto-FQDN'd (www →
www.zone01.example.com); fully-qualified names are left as-is. Empty
modifies print Nothing to modify (no fields specified).
Decommission a grid member¶
Tear-down order matters - NIOS refuses to delete a member while anything
still references it. Scenario: retiring ibdhcp02.
# 1. Show what still references the member. Spot DHCP ranges + any host
# records that have it in their ipv4addrs or configure_for_dhcp slots.
show range
show fixed
# 2. Re-pin DHCP ranges onto the remaining failover partner or a different
# member. Ranges bound to a failover group don't need re-pinning - the
# group already carries the peer list.
configure network 10.10.3.0/24 range modify 10.10.3.100 10.10.3.200 member=192.0.2.111
# 3. If the member was part of a failover pair, the pair has to be rebuilt.
# Delete the old one, add a new one with the survivor + replacement.
configure network failover delete fo-group1
configure network failover add fo-group1 primary ibdhcp01.example.com secondary ibdhcp05.example.com
# 4. Strip it from any DHCP network member assignments (modify each affected
# network; see `show network`).
configure network 10.10.1.0/24 modify member=192.0.2.111
# 5. Turn services off so the member stops offering leases/DNS while you
# finish cleanup.
configure grid <grid> member ibdhcp02.example.com dhcp disable both
configure grid <grid> member ibdhcp02.example.com dns disable
# 6. Delete.
configure grid <grid> member ibdhcp02.example.com delete
Expect IB.Data.Conflict errors on step 6 if anything still points at the
member - they tell you exactly which reference is holding on.
Migrate a zone to a different view¶
NIOS treats (zone_fqdn, view) as the primary key, so "moving" is
delete-then-recreate in the target view. Record data doesn't auto-copy,
but NIOS gives you two clean mechanisms for pulling it in.
Option A: WAPI copyzonerecords (same grid)¶
Records already exist on this grid (most common - the original zone is still in a different view). Create the target shell, then clone:
configure zone add zone01.example.com ns_group=ns-external view=External
configure zone zone01.example.com copy from zone01.example.com \
source_view=default view=External
# Sanity check
show zone zone01.example.com view=External
# Drop the original once you've verified the copy
configure zone zone01.example.com delete
The copy from verb calls zone_auth?_function=copyzonerecords under
the hood. A/AAAA/CNAME/MX/TXT/PTR/host records all transfer; NS/SOA
records are re-created by the new zone automatically. Source and
destination don't have to be in different views (you can also clone
between fully-different FQDNs, e.g. for a "template zone" pattern).
Option B: AXFR import from an external primary¶
Records live on another DNS server (legacy BIND, another vendor, partner grid) and you want NIOS to pull them in at create time:
configure zone add corp.example.com \
primary=ibdns01.example.com \
import_from=10.99.0.53 \
do_host_abstraction=true \
create_ptr_for_hosts=true
import_from=<ip>- source DNS server for the AXFR; also setsuse_import_from=Trueautomatically.primary=<member>is required by NIOS before it'll acceptimport_from- you're telling it "this grid member will own the zone once the transfer completes."do_host_abstraction=true- turn imported A records into host records during the import. Handy when migrating from a non-Infoblox primary.create_ptr_for_hosts=true- auto-create reverse PTR records for the imported hosts.
import_from is write-only on NIOS - you won't see it in a show zone
after the import completes, but the records will be there. If the
source IP is unreachable, the POST may hang on the initial AXFR
attempt; 198.51.100.x-style unroutable IPs will cause timeouts.
Option C: CSV export/import (cross-grid / cross-boundary)¶
When the data source is a CSV or the zones aren't reachable via AXFR:
download csv /tmp/zone01.csv object record:host
# (edit the CSV - rewrite view column from "default" to "External")
upload csv /tmp/zone01.csv object record:host operation=MERGE
Attach anycast to a set of DNS members¶
# Shared loopback on every DNS member
for m in ibdns01 ibdns02 ibdns03 ibdns04 ibdns05 ibdns06 ibdns07 ibdns08 ibdns09 ibdns10; do
echo "configure grid <grid> member ${m}.example.com anycast add 192.0.2.53"
echo "configure grid <grid> member ${m}.example.com anycast add 2001:db8:0:53::53"
done | ibcli -s "$GRID" -u "$USER" -p "$PASSWORD" -k -i /dev/stdin
On pre-provisioned members the v6 line prints Deferred: and retries
successfully after first boot - re-run with -i once the member is online
and it becomes Skipped: (already set) or OK:.
Bulk-apply an EA across networks¶
configure network 10.10.1.0/24 modify set "DC Location" DC1
configure network 10.10.2.0/24 modify set "DC Location" DC1
configure network 10.10.3.0/24 modify set "DC Location" DC2
configure network 10.10.4.0/24 modify set "DC Location" DC2
# Or via the dedicated verb (same effect, clearer for pure-EA edits)
configure network 10.10.1.0/24 extattrs set "DC Location" DC1
# Query back
show network ea="DC Location:DC1"
Share records across zones with a Shared Record Group¶
A Shared Record Group (SRG) is a named bundle of DNS records that you
define once and then attach to any number of zones. Every zone linked to
the SRG publishes those records under its own apex - handy for common
entries like www, mail, SPF/DMARC TXT, or service SRVs that should
exist identically across a family of domains.
1. Create the group¶
configure shared_record_group add srg-common comment="Common shared records"
configure shared_record_group add srg-mail comment="Mail-related shared records"
configure shared_record_group add srg-directory comment="Directory/LDAP shared records"
2. Populate the group with records¶
The verb mirrors configure zone <z> add <type> but the target is the
group, not a zone:
# srg-common - an apex + API entries, v4 + v6 + CNAME + TXT
configure shared_record a add www 203.0.113.10 group=srg-common
configure shared_record a add api 203.0.113.20 group=srg-common
configure shared_record aaaa add www 2001:db8::10 group=srg-common
configure shared_record cname add portal www group=srg-common
configure shared_record txt add info "smoke-test" group=srg-common
# srg-mail - MX + SPF/DMARC
configure shared_record mx add mail mail.example.com 10 group=srg-mail
configure shared_record txt add spf "v=spf1 mx -all" group=srg-mail
configure shared_record txt add dmarc "v=DMARC1; p=reject" group=srg-mail
# srg-directory - SRV entries for LDAP / Kerberos
configure shared_record srv add _ldap._tcp ldap.example.com 0 100 389 group=srg-directory
configure shared_record srv add _kerberos._tcp kdc.example.com 0 100 88 group=srg-directory
Supported record types under configure shared_record …: a, aaaa,
cname, mx, txt, srv.
3. Attach the group to zones¶
At zone create time, pass srg=<name>. You can list it multiple times for
multiple groups on the same zone:
configure zone add corp01.example.com ns_group=ns-group1 srg=srg-common srg=srg-mail
configure zone add corp02.example.com ns_group=ns-group1 srg=srg-common srg=srg-mail
configure zone add corp03.example.com ns_group=ns-group1 srg=srg-common srg=srg-directory
To attach an SRG to an existing zone, re-run configure zone <zone> modify
srg=<name> - repeatable. modify replaces the zone's SRG list with what
you pass, so include every group you want attached.
4. Inspect¶
# Show every SRG and its attached zones
show zone shared_record_group
# Show a specific SRG
show zone shared_record_group srg-common
# Show records in an SRG, by type
show shared_record a group=srg-common
show shared_record mx group=srg-mail
show shared_record txt group=srg-mail
show shared_record srv group=srg-directory
5. Prune and decommission¶
Remove a single record from the group, or drop the group entirely:
# Drop one record from the group (doesn't affect zones)
configure shared_record txt delete info group=srg-common
# Detach the group from a zone (leave the group intact for other zones)
configure zone corp01.example.com modify srg=srg-common # keep this one
configure zone corp01.example.com modify # remove all SRGs from the zone
# Delete the group (only safe once no zones reference it)
configure shared_record_group srg-common delete
NIOS refuses the group delete while any zone still points at it - the error tells you which zone is holding on, so detach those first.
Stand up DTC from scratch (end-to-end)¶
# 1. Servers
configure dtc server add web1 host=203.0.113.10
configure dtc server add web2 host=203.0.113.20
configure dtc server add web3 host=203.0.113.30
# 2. Health checks
configure dtc monitor icmp add web-icmp
configure dtc monitor http add web-http comment="HTTP 200 check"
# 3. Pool + attach
configure dtc pool add web-pool lb_preferred_method=round_robin
configure dtc pool web-pool server add web1
configure dtc pool web-pool server add web2
configure dtc pool web-pool server add web3
configure dtc pool web-pool monitor add icmp web-icmp
configure dtc pool web-pool monitor add http web-http
# 4. LBDN + attach pool
configure dtc lbdn add web-lbdn lb_method=round_robin patterns=www.dtc.example.com
configure dtc lbdn web-lbdn pool add web-pool
# 5. Sanity check
show dtc lbdn web-lbdn
show dtc pool web-pool
Dismantling runs in reverse: pool delete from the LBDN, monitor delete
/ server delete from the pool, then delete the monitor/server/pool/LBDN
objects themselves.
Restart services after bulk config changes¶
# Check if a restart is needed and what's pending
show restart status
# Kick it
restart dns
restart dhcp
restart all # everything on every member
Save a support bundle from a specific member¶
Tab-complete the member slot - hostnames with VIPs as meta come straight
from the grid, so no typos.
Sign a zone with DNSSEC¶
Two steps: turn DNSSEC on at the grid level (once, grid-wide), then sign each zone.
# 1. Enable DNSSEC + validation grid-wide (idempotent; safe to re-run)
configure grid <grid> dns set dnssec_enabled=True dnssec_validation_enabled=True
# 2. Sign a zone
configure zone zone03.example.com dnssec sign
# 3. Verify: zone_auth now shows dnssec_keys, DNSKEY + RRSIG records appear
show zone zone03.example.com
# Other DNSSEC lifecycle operations
configure zone zone03.example.com dnssec unsign
configure zone zone03.example.com dnssec rollover_ksk
configure zone zone03.example.com dnssec rollover_zsk
All four verbs POST <zone_auth>?_function=dnssec_operation under the
hood. Add view=<name> to target a non-default DNS view.
Trust-anchor management (the dnssec_trusted_keys list on grid:dns)
isn't yet a native command - set it via configure grid <g> dns set
dnssec_trusted_keys=… or the NIOS UI.
Block a malicious domain with RPZ¶
An RPZ zone is an authoritative zone whose records tell recursing resolvers to rewrite or refuse specific queries. Policy semantics:
| RPZ record type | Effect |
|---|---|
cname . <qname>.rpz |
NXDOMAIN |
cname *. <qname>.rpz |
NODATA |
cname passthru. <qname>.rpz |
Passthru (don't block) |
a <qname>.rpz 127.0.0.1 (etc.) |
Redirect (local rewrite) |
# One-time: create the policy zone
configure rpz zone add rpz.lab.local policy=GIVEN comment="Lab RPZ policy zone"
# Block a domain - redirect to 127.0.0.1 (sinkhole)
configure rpz record a add badsite.example.com.rpz.lab.local 127.0.0.1 zone rpz.lab.local
# Block all of *.badsite.example.com (wildcard form - prepend *.)
configure rpz record a add *.badsite.example.com.rpz.lab.local 127.0.0.1 zone rpz.lab.local
# IPv6 sinkhole
configure rpz record aaaa add badsite6.example.com.rpz.lab.local ::1 zone rpz.lab.local
# Unblock
configure rpz record a delete badsite.example.com.rpz.lab.local zone rpz.lab.local
# What's currently blocked?
show rpz records zone=rpz.lab.local
For NXDOMAIN-style policy (rather than redirect), use the CNAME form with
. or *. as the target - that's an RPZ convention, not an ibcli shape;
wrap it however feels cleanest for your team.
Least-privilege admin: network-ops user restricted to DHCP¶
Scenario: Alice is a DHCP operator. She should be able to create/modify
DHCP ranges and fixed addresses, but not touch DNS zones, admin settings,
or grid configuration.
# 1. Role - grants the capabilities
configure admin role add lab-dhcp-operator comment="Lab DHCP operator role"
# 2. Group - links users to the role
configure admin group add lab-netops comment="Lab network ops group" role=lab-dhcp-operator
# 3. User - inherits everything from the group
configure admin user add alice password=AliceP@ss123 group=lab-netops \
comment="Alice - netops"
# 4. Permissions - what can the role actually do?
# Grant WRITE on DHCP networks and ranges; explicit DENY everywhere else.
configure admin permission add role=lab-dhcp-operator object=networks write
configure admin permission add role=lab-dhcp-operator object=dhcp_range write
configure admin permission add role=lab-dhcp-operator object=fixed_addresses write
configure admin permission add role=lab-dhcp-operator object=dns deny
configure admin permission add role=lab-dhcp-operator object=grid deny
To scope further - e.g. Alice can only edit DHCP under 10.10.0.0/16 -
attach an EA-based filter to the permission. That uses the
*<EA-name> = value WAPI match form, which is easier to configure from the
NIOS UI (Administration → Administrators → Roles → Permissions), since
it's click-and-select there. The CLI can still list and audit:
show admin user # all users + last-login + group membership
show admin group # all groups + member count
show admin role # all roles + comment
Rotate Alice's password:
Reserve an IP for a server or printer (fixed address)¶
Quick rule of thumb:
- Fixed address (no DNS name): a DHCP binding that always gives a specific MAC the same IP. DHCP-only; nothing in DNS.
- Host record with
fixed+ MAC: combined DNS + DHCP binding. Creates a forward A record, a reverse PTR, and a DHCP reservation in one shot.
Use a fixed address for things that don't need a DNS name (printers, industrial gear). Use a host record for anything you'll want to look up by name (servers, appliances).
# Fixed address (DHCP only)
configure network 10.10.1.0/24 fixed add 10.10.1.51 aa:bb:cc:10:00:11 \
name=printer-lobby comment="Lobby printer"
# Host record with embedded fixed (DNS + DHCP)
configure zone zone01.example.com add host lab-printer 10.10.1.52 \
fixed mac=aa:bb:cc:10:00:12
# Roaming host - DHCP binding not tied to a specific network
configure network roaminghost add laptop-alice 10.10.1.60 aa:bb:cc:de:ad:01
# List everything reserved
show fixed
show fixed 10.10.1.51
Delete is symmetric: configure network 10.10.1.0/24 fixed delete 10.10.1.51.
"Who has this IP?"¶
Incident-response #1 question.
Interactive REPL (no variable substitution - type the IP each time):
ibcli> show lease 10.10.1.145
ibcli> show fixed 10.10.1.145
ibcli> show record host ipv4addr=10.10.1.145
ibcli> show record ptr ipv4addr=10.10.1.145
ibcli> show record a ipv4addr=10.10.1.145
Shell one-liner (shell does the variable expansion, ibcli sees a fully-
resolved command per -e):
IP=10.10.1.145
for cmd in \
"show lease $IP" \
"show fixed $IP" \
"show record host ipv4addr=$IP" \
"show record ptr ipv4addr=$IP" \
"show record a ipv4addr=$IP"
do
ibcli -s "$GRID" -u "$USER" -p "$PASSWORD" -k -e "$cmd"
done
ibcli itself doesn't have variables, history substitution, or any shell features - the parser treats
$IPas a literal. All the$IP/$GRIDpatterns in this cookbook only work when bash expands them before ibcli sees them. Inside a.ibclibatch file, lines are taken as-is; inside the interactive REPL, type the value directly.
For the combined aggregator (NIOS's own "all objects at IP" answer),
use the show address command - one line, everything:
show address 10.10.1.11
# → ip=10.10.1.11 network=10.10.1.0/24 view=default status=USED
# types=HOST usage=DNS names=web01.zone01.example.com
show address ipv6 2001:db8:100:1::11
That surfaces types (HOST / LEASE / FIXED_ADDRESS / RESERVATION /
UNMANAGED / RANGE) and usage (DNS / DHCP) so you can see every object
class at the IP in one shot.
Split or join a network¶
Carve a /23 into two /24s, or merge them back:
# Split 10.20.0.0/23 into two /24s (10.20.0.0/24 + 10.20.1.0/24)
configure network 10.20.0.0/23 split /24
# Join two siblings back into one
configure network 10.20.0.0/23 join
NIOS refuses a split if ranges/reservations straddle the new boundary - you'll get a validation error telling you exactly which range is in the way. Either resize the offending range first or split at a different prefix.
configure network <cidr> move is a DHCP-member swap (move member <ip>
or move failover <group>), not a cross-view move. NIOS doesn't support
changing a network's network_view after creation - to "move" across
views you delete in the source view and recreate in the target view
(see the zone-migration scenario for the same pattern).
Disambiguating when the same CIDR exists in multiple views¶
A network view is part of the composite key - the same CIDR can legally
exist in the default, External, and production views simultaneously.
Every configure network <cidr> … / show network <cidr> / delete
command accepts an optional view=<name> to pick which one you mean:
# Target a specific network view explicitly
configure network 10.10.1.0/24 modify comment="prod only" view=production
configure network 10.10.1.0/24 delete view=External
show network 10.10.1.0/24 view=production
Without view=… the handler targets the default network view, even if
the CIDR exists in other views too. If you're seeing "No network found"
errors when the CIDR is clearly present, add view=<name>.
List the views on the grid (and their network counts) to see what's out there:
For carving a container into subnets via a template:
configure template network add lab-net24 cidr 24 comment="Standard /24"
configure network container add 10.50.0.0/20 comment="/20 to subdivide"
configure network add 10.50.1.0/24 template=lab-net24
configure network add 10.50.2.0/24 template=lab-net24
Lock a DHCP range to approved MAC addresses only¶
A MAC filter is a named allow-list. Create the filter, populate it with known-good MACs, and attach it to a range:
# 1. Create the filter
configure network macfilter add trusted-printers
# 2. Populate with MAC entries
configure network filter trusted-printers add macaddress aa:bb:cc:01:00:01 \
comment="Printer 1"
configure network filter trusted-printers add macaddress aa:bb:cc:01:00:02 \
comment="Printer 2"
# 3. Inspect
show network filter trusted-printers
# 4. Attach the filter to a range (via range modify - add `filter=` alongside
# member/failover). The underlying WAPI field is mac_filter_rules; ibcli's
# range modify will accept `filter=<name>` where supported, otherwise set
# it via `configure network <cidr> range modify set mac_filter_rules ...`
configure network 10.10.1.0/24 range modify 10.10.1.100 10.10.1.200 set mac_filter_rules "<filter trusted-printers>"
Removing a MAC later:
Rename a host record¶
A host's FQDN is part of its _ref, so NIOS treats a name change as a
rename, not a field update. ibcli exposes this as a separate verb:
# Rename within the same zone (relative name → resolved to zone)
configure zone zone01.example.com rename host web01 web-prod01
# Cross-zone rename: pass the new name fully-qualified
configure zone zone01.example.com rename host web01 web-prod01.zone02.example.com
# Non-default view
configure zone ext01.example.net rename host ns1 dns1 view=External
The operation is a GET-then-PUT - IPs, aliases, EAs, and comment are all preserved across the rename.
Find every record pointing at a decommissioned IP¶
Before removing an IP from service, sweep for references. As with "Who has this IP?" above, ibcli itself doesn't expand variables - let bash do it.
Shell sweep (v4 + v6):
IP=10.10.1.145
V6=2001:db8:100:1::145
CRED=(-s "$GRID" -u "$USER" -p "$PASSWORD" -k)
for cmd in \
"show record host ipv4addr=$IP" \
"show record a ipv4addr=$IP" \
"show record ptr ipv4addr=$IP" \
"show fixed $IP" \
"show lease $IP" \
"show record host ipv6addr=$V6" \
"show record aaaa ipv6addr=$V6"
do
echo "=== $cmd ==="
ibcli "${CRED[@]}" -e "$cmd"
done
One-liner aggregator (simpler, but only shows summary fields - not full record details):
Pre-provision an HA member pair¶
Two-node HA member: both nodes share a VIP, and each node has its own
hardware profile. node=<hwtype>,<hwmodel>,<serial> is repeatable - first
occurrence is node 1, second is node 2. When ≥ 2 node= entries are
present, ibcli sets enable_ha=true automatically.
configure grid <grid> member add ibdns-ha01.example.com \
ipaddress=192.0.2.130/24 gateway=192.0.2.1 \
ipv6addr=2001:db8:64:40::130/64 ipv6gateway=2001:db8:64:40::1 \
mgmt_ipaddress=198.51.100.130/24 mgmt_gateway=198.51.100.1 \
platform=VNIOS \
node=IB-V1425,VNIOS,SER-NODE-1-12345 \
node=IB-V1425,VNIOS,SER-NODE-2-12346 \
license=dns license=nios license=enterprise
After the POST + PUT sequence the member shows up with
node_info=[{node 1 hwdetails}, {node 2 hwdetails}] and enable_ha=true.
Each physical node will try to join and one becomes active, one standby.
To promote a node or change HA state later, the commands live under
configure grid <grid> member <fqdn> preprovision … for pre-boot edits,
or via WAPI member?_function=promote_member_to_master once both nodes
are online.
Schedule a delayed service restart¶
ibcli supports relative-time restart via delay=<seconds>. Absolute-time
scheduling (change-window at 02:00) needs a scheduled task - ibcli lists
and cancels them but creating one is a WAPI scheduledtask POST.
# Relative: restart DNS in 30 minutes
restart dns delay=1800
# Absolute time - accepts epoch seconds or ISO-8601 (local TZ):
restart dns at=2026-05-01T02:00:00
restart dhcp at=1735689600
# Restart only one member immediately
restart dns member=ibdns01.example.com
# Restart everything with a specific mode (GROUPED, SIMULTANEOUS, SEQUENTIAL)
restart all mode=SEQUENTIAL
# List scheduled / pending restart requests
show grid <grid> restart request
# Cancel a scheduled task
show schedule # list by ID
configure schedule 12345 delete # cancel it
NIOS-version note: the delay/at= parameters require a NIOS build
that honors delay on the restartservices WAPI function. On older
releases the function returns Unknown argument/field: 'delay' - in that
case the restart fires immediately and you'll need the NIOS UI (or a
scheduledtask POST) to schedule for a future window.
Bulk-import host records via CSV¶
For anything more than a handful of records, CSV beats hand-typing.
# Export current state to use as a template
download csv /tmp/hosts.csv object record:host
# Edit /tmp/hosts.csv - each row is a host record
# Upload. The mode defaults to INSERT (error on duplicates). To upsert
# existing rows (common when re-syncing), pass operation=MERGE.
upload csv /tmp/hosts.csv object record:host operation=MERGE
# Monitor the import task
show csv task # lists all recent imports with status
show csv task 42 # specific task
# If anything failed, download the error report for that task
download csv_errors /tmp/hosts-errors.csv 42
Import operation modes¶
Pick one per upload via operation=<mode> (defaults to INSERT):
| Mode | Effect |
|---|---|
INSERT |
Create new objects; fail rows where the key already exists. |
MERGE |
Upsert - insert if absent, update fields in place if present. |
OVERRIDE |
Replace matching objects wholesale (see update_method below). |
DELETE |
Delete every matching row. |
CUSTOM |
Take the per-row action from the * column on each row (see table below). |
update_method (only with MERGE or OVERRIDE)¶
update_method=MERGE (default) keeps fields that aren't in the CSV;
update_method=OVERRIDE drops them. So "overwrite wholesale" is:
Per-row flags (only when operation=CUSTOM)¶
NIOS reads the * column on each row and applies that flag to just that
row - lets you mix create/modify/delete in one file:
* column |
Action for that row |
|---|---|
I or IR |
Insert (fail if exists) |
M |
Modify (fail if missing) |
IM |
Insert if absent, modify if present (per-row upsert) |
D |
Delete |
O |
Override (wholesale replace) |
Also on the upload command¶
| Keyword | Values | Default |
|---|---|---|
object=<type> |
record:host, network, etc. |
inferred from CSV header |
operation=<mode> |
See table above | INSERT (or CUSTOM if only object= is given) |
update_method=<mode> |
MERGE or OVERRIDE |
MERGE |
on_error=<action> |
STOP or CONTINUE |
STOP |
download csv without object= gets you every type - useful as a grid
backup you can diff. download csv with object=record:host (or any
other WAPI object type) scopes the dump.
Daily health-check batch file¶
A one-file smoke-test you can point at a cron or run before a change window. Redirect its output into a ticket or Slack.
Save as health-check.ibcli:
# ==== Grid service status ====
show grid <grid> restart status
show grid <grid> dns
show grid <grid> dhcp
# ==== Member status ====
show member
# ==== DHCP failover (anything not NORMAL is suspicious) ====
show network failover
# ==== DTC pool health ====
show dtc pool
show dtc lbdn
# ==== DNS zone discrepancies (zones with replication drift) ====
show zone discrepancy
Run it:
ibcli -s "$GRID" -u "$USER" -p "$PASSWORD" -k health-check.ibcli \
> /tmp/health-$(date +%F).log 2>&1
Batch output is plain-text line-oriented - easy to grep for specific
services or to diff between consecutive runs with diff or difft.
Notifications (outbound webhooks)¶
Ship NIOS events out to a webhook receiver - object-change feeds, DNS RPZ hits, ADP alerts, scheduled-task completions. Two objects are involved: endpoint (where to POST) and rule (which events and optional filters trigger the POST).
Create a REST endpoint¶
# Required: uri, outbound_member_type (GM or MEMBER). Defaults to GM if omitted.
configure notification endpoint add prod-webhook \
uri=https://events.corp.example.com/ibx \
outbound_member_type=GM
Create a rule bound to that endpoint¶
# endpoint=<name> is required. notification_action and expression_list
# get safe defaults (RESTAPI_TEMPLATE_INSTANCE + empty list = "match everything").
configure notification rule add dns-changes \
endpoint=prod-webhook \
event_type=DB_CHANGE_DNS_RECORD
List / delete¶
show notification endpoint
show notification rule
configure notification rule dns-changes delete
configure notification endpoint prod-webhook delete
Event types most people reach for¶
event_type= |
Fires on |
|---|---|
DB_CHANGE_DNS_RECORD |
any DNS record created/modified/deleted |
DB_CHANGE_DNS_ZONE |
zone mutations (add/modify/delete) |
DB_CHANGE_DHCP_NETWORK_IPV4 / _IPV6 |
network edits |
DB_CHANGE_DHCP_RANGE_IPV4 / _IPV6 |
range edits |
DB_CHANGE_DHCP_FIXED_ADDRESS_IPV4 / _IPV6 |
fixed-addr edits |
DNS_RPZ |
RPZ policy hit on a resolver |
DHCP_LEASES |
lease changes |
ANALYTICS_DNS_TUNNEL |
Threat Insight detection |
SECURITY_ADP |
ADP rule match |
SCHEDULE |
scheduled task completion |
Expression-list filters (per-field predicates like "only RPZ hits for clients in 10.0.0.0/8") are set after creation
via configure notification rule <name> set expression_list=…. The shape is event-type-specific - see the Infoblox
WAPI docs for the object schema.
Upgrade groups and upgrade status¶
Inspect status by type¶
The type selector is required - it maps to the WAPI type= filter.
show upgrade_status grid # grid-wide rollout state
show upgrade_status group # one row per upgrade group
show upgrade_status group <group-name> # one specific group
show upgrade_status vnode # every virtual member
show upgrade_status vnode <member-fqdn> # one virtual member
show upgrade_status pnode # physical appliances
show upgrade_status pnode <member-fqdn>
Group rows surface rollout progress, step counts, and schedule flags:
group=Default type=GROUP status=OFFLINE members=0/16
group=Grid Master type=GROUP status=WORKING members=0/1 steps=1/1
Manage upgrade groups¶
configure upgrade_group add night-maintenance \
upgrade_policy=SEQUENTIALLY distribution_policy=SIMULTANEOUSLY
configure upgrade_group night-maintenance set members="m1.example.com,m2.example.com"
configure upgrade_group night-maintenance delete
show upgrade_group
show upgrade_group night-maintenance
Schedules (singleton objects - one per grid)¶
show upgrade_schedule
configure upgrade_schedule set start_time=1776816000 time_zone=UTC
show distribution_schedule
configure distribution_schedule set start_time=1776729600 time_zone=UTC
DHCP request filters (all five types)¶
NIOS DHCP can match incoming requests against five filter categories. Each uses its own WAPI object type; CLI grammar is parallel across them.
Fingerprint filter - match by client OS/device¶
configure fingerprint add windows-10 vendor_id='MSFT 5.0'
configure filter fingerprint add office-windows fp=windows-10
show filter fingerprint
Option filter - match on DHCP option values¶
NAC filter - match on NAC posture¶
Relay-agent filter - match option-82 circuit/remote ID¶
# ANY + ANY is rejected by NIOS; at least one side must be non-ANY.
configure filter relayagent add floor3-ap \
is_circuit_id=ANY \
is_remote_id=MATCHES_VALUE \
remote_id_name=ap-floor3 \
is_remote_id_substring=false
show filter relayagent
IPv6 option filter¶
Attach filters to a MAC filter (for policy enforcement on a network)¶
configure network macfilter add office-floor3
configure network filter office-floor3 add macaddress aa:bb:cc:00:00:11
configure network filter office-floor3 add macaddress aa:bb:cc:00:00:12
show network macfilter
Option spaces and option definitions¶
Custom vendor-scoped DHCP options live under user-defined option spaces. Individual option codes are option definitions scoped to a space.
# Create a space for Cisco VoIP options.
configure option_space add cisco-voip
# Define option 150 (TFTP server list) inside that space.
configure optiondef add tftp-servers \
code 150 \
type array_of_ip \
space=cisco-voip
# Inspect.
show option_space
show optiondef
# Tear down (option defs must be deleted before their space).
configure optiondef tftp-servers delete
configure option_space cisco-voip delete
IPv6 equivalents live under separate grammar - configure ipv6optionspace add …, configure ipv6optiondef add ….
Network and range templates¶
Templates let you stamp out pre-configured DHCP networks or ranges. Useful when you need dozens of subnets that all share the same options / failover / members.
Network template¶
configure template network add office-subnet cidr 24
# options and extattrs get applied to networks that clone this template
configure template network office-subnet set comment "standard office /24"
show template network
Range template¶
Use a template when creating a network¶
configure network add 10.10.7.0/24 template=office-subnet
configure network 10.10.7.0/24 range add template=guest-range
DDNS principal clusters (GSS-TSIG)¶
Authorize Kerberos principals (typically AD Domain Controllers or DHCP relays) to perform authenticated dynamic DNS updates against NIOS zones.
Note
This is not grid DHCP DDNS behaviour (see configure grid <g> dhcp set ddns_…) and not per-zone update
ACLs (see configure zone <z> set allow_update=…). This subtree only configures who the GSS-TSIG principal
allowlists are.
# Create an allowlist ("cluster") of authorized principals.
configure ddns cluster add ad-prod \
principals=dhcpserver$@CORP.EXAMPLE.COM,dnsadmin@CORP.EXAMPLE.COM \
comment="AD production DCs authorized for DDNS"
# Create a group of clusters - a zone's update policy can evaluate them in order.
configure ddns cluster_group add prod-forest
# Inspect.
show ddns cluster
show ddns cluster_group
show ddns cluster ad-prod
Reference a cluster from a zone's update policy via configure zone <z> set update_forwarding=…. Shape depends on
your policy model; see the Infoblox WAPI docs for the update-policy schema.
Integrations and outbound¶
Forward NIOS telemetry to third-party platforms.
TAXII feed consumption¶
Syslog endpoints¶
configure integration syslog add primary-siem
configure integration syslog primary-siem set remote_server=10.0.0.100 local_severity=INFO
show integration syslog
PxGrid (Cisco ISE)¶
DXL (McAfee Data Exchange Layer)¶
Outbound cloud client (summary read-only)¶
All endpoints aggregated (read-only)¶
Discovery (NetMRI-lite)¶
Credential groups¶
SDN network registration (VMware / OpenStack)¶
Grid-wide discovery properties + per-member properties¶
show discovery grid_properties
show discovery member_properties
show discovery member_properties ibdns01.example.com
vDiscovery (cloud adaptors)¶
Read-only queries¶
show discovery device
show discovery device <device-name>
show discovery device <device-name> component
show discovery device <device-name> interface
show discovery device <device-name> neighbor
show discovery diagnostic
show discovery status <network-view> # network_view is required by WAPI
Threat Insight and ADP¶
Threat Insight configuration (DNS tunneling detection)¶
Threat Protection (ADP) rules¶
BFD templates, rulesets, and other ops objects¶
BFD (Bidirectional Forwarding Detection) templates¶
configure bfd_template add anycast-bfd set detection_multiplier=3 min_rx_interval=100
show bfd_template
configure bfd_template anycast-bfd delete
Rulesets (used by scavenging + notification filters)¶
configure ruleset add stale-hosts-30d type=SCAVENGING
show ruleset
configure ruleset stale-hosts-30d delete
Scavenging tasks (read-only)¶
TFTP-served directories¶
configure tftp_dir add /boot comment "PXE boot images"
show tftp_dir /boot # name is required by WAPI
configure tftp_dir /boot delete
Database snapshots (read-only)¶
Required-filter show commands¶
A handful of read-only queries require a filter argument - WAPI rejects the bare form. ibcli prints a friendly usage hint when you forget it.
| Command | Required argument |
|---|---|
show capacity_report <member> |
member host_name |
show dhcp_statistics <member> |
member host_name |
show ordered_range <n.n.n.n/mm> |
network CIDR |
show record all zone=<zone> |
zone FQDN ([<name>] optional extra filter) |
show rpz records zone=<zone> |
RPZ zone FQDN |
show rpz_order view=<view> |
DNS view name |
show superhostchild <parent> |
parent superhost name |
show tftp_dir <directory> |
directory name |
show dtc record a <dtc_server> |
DTC server name (same for aaaa / cname / srv / naptr) |
show dtc records <zone> |
DTC zone |
show discovery status <network-view> |
network view |
show upgrade_status {grid\|group\|vnode\|pnode} [<name>] |
type selector |
show db_objects |
optional object_types=<t> or version=<v>; default sends all_object_types_supported_in_version=2.13.7. |
Live-grid audit tooling¶
Two helpers in scripts/ complement the pytest suite by exercising the CLI against a real grid.
scripts/sweep-show.sh - show-command audit¶
Runs every no-arg show command from ibcli -l against the grid, classifies each error as friendly-usage /
grid-config / suspected CLI bug, and exits 1 on any suspected bug. Good as a CI gate after WAPI-surface changes.
scripts/sweep-show.sh -s 192.0.2.10 -u admin -p 'secret'
# Or via env:
IBCLI_HOST=192.0.2.10 IBCLI_USER=admin IBCLI_PASS='secret' \
scripts/sweep-show.sh
# Keep artifacts in a named directory:
scripts/sweep-show.sh -s gm -u admin -p pw -o /tmp/sweep-$(date +%F)
Artifacts per run:
| File | Contents |
|---|---|
sweep.ibcli |
the generated batch file |
sweep.out |
raw ibcli output, one command per block |
summary.tsv |
per-command status + first two lines of output |
errors.txt |
errored commands paired with their error message |
report.txt |
human-readable summary (shown on stdout too) |
scripts/smoke/ - object-build smoke harness¶
Parameterised build → verify → teardown across 11 phases, three scales.
# Quick plumbing check (~100 objects):
scripts/smoke/smoke.sh -s gm -u admin -p pw --scale tiny --tag v1 --all
# Full-surface (~10,000 objects), keep build artifacts:
scripts/smoke/smoke.sh -s gm -u admin -p pw --scale full --tag v1 --all \
-o /tmp/smoke-$(date +%F)
# Build only (leave on grid for manual inspection):
scripts/smoke/smoke.sh -s gm -u admin -p pw --scale small --build
# Run a subset of phases (zones + records only):
scripts/smoke/smoke.sh -s gm -u admin -p pw --scale full --phases 3,4 --build
Phases (all selectable via --phases):
| # | Phase |
|---|---|
| 0 | Pre-provisioned members |
| 1 | Views, NS groups, ACLs, EA definitions |
| 2 | DHCP - networks, ranges, fixed, MAC filters, failover |
| 3 | DNS zones (forward + reverse) |
| 4 | DNS records (A / AAAA / CNAME / MX / TXT / CAA / NAPTR / TLSA) |
| 5 | Host records + shared record groups |
| 6 | RPZ zones + records |
| 7 | DTC - servers, pools, LBDNs, monitors |
| 8 | Admin users, groups, roles |
| 9 | Notification endpoints |
| 10 | DHCP extras - option spaces, filters, templates |
All smoke objects carry a smoke- name prefix (and Smoke=<tag> EA on objects that support it). Teardown is opt-in
(--teardown / --all) and reverse-dependency ordered.
Audit: find commands that error against your grid¶
Run the show-sweep, then grep the report for suspected bugs:
scripts/sweep-show.sh -s "$GRID" -u "$USER" -p "$PASSWORD" -o /tmp/audit \
|| true # we want to inspect the output regardless of exit code
grep -E "^--- BUGS" -A100 /tmp/audit/report.txt | head -40
Anything in the BUGS block is worth filing; the USAGE HINTS and GRID-CONFIG blocks are expected on most grids.
Change-review diff between two grid states¶
Use the batch mode to dump state before and after, then diff:
# Before a change window
scripts/sweep-show.sh -s "$GRID" -u "$USER" -p "$PASSWORD" -o /tmp/before
# Apply changes
ibcli -s "$GRID" -u "$USER" -p "$PASSWORD" -k -i change-window.ibcli
# After
scripts/sweep-show.sh -s "$GRID" -u "$USER" -p "$PASSWORD" -o /tmp/after
# What changed
diff /tmp/before/sweep.out /tmp/after/sweep.out | less
summary.tsv is more diff-friendly than sweep.out because it's one line per command with a short preview: