Files
puppet-prod/site/profiles/manifests/netbox/facts.pp
T
Ben Vincent fe3c1a1410
ci/woodpecker/pr/ruby-validate Pipeline was successful
ci/woodpecker/pr/puppet-lint Pipeline was successful
ci/woodpecker/pr/yamllint Pipeline was successful
ci/woodpecker/pr/bolt-validate Pipeline was successful
ci/woodpecker/pr/erb-validate Pipeline was successful
ci/woodpecker/pr/epp-validate Pipeline was successful
ci/woodpecker/pr/puppet-validate Pipeline was successful
ci/woodpecker/pr/ruby-check Pipeline was successful
feat: add NetBox IP/interface facts with offline cache
Add a structured `netbox` fact that reads this node's IP/interface data
from NetBox, and profiles::netbox::facts to seed its credentials.

- netbox fact: queries NetBox (devices + VMs) by fqdn/hostname, emits
  interfaces (name, mac, ips, primary) and primary_ip.
- Caches every success to /var/cache/puppet-netbox/facts.json (0600).
  On any failure (short timeouts, DNS, non-200, parse) it serves the
  cached payload with cached=true; static IPs never change so stale is
  always safe. A never-cached host returns nothing; the fact never raises.
- profiles::netbox::facts: inert until $api_token is set; writes the
  root-only token/url files and the cache dir. Confined off (no-op) on
  hosts without the token. Included from profiles::base.

Claude-Session: https://claude.ai/code/session_01JUoARVdmhxKQHyyyp1pxeT
2026-08-05 00:45:15 +10:00

49 lines
1.5 KiB
Puppet

# profiles::netbox::facts
#
# Seeds the credentials the `netbox` custom fact needs to read this node's
# IP/interface data from NetBox. Inert until $api_token is set: with no token
# the fact is confined off (unenrolled hosts no-op).
#
# NetBox is authoritative and static IPs never change, so the fact caches every
# successful response under $cache_dir forever and reuses it during a NetBox
# outage - an outage can never fail a puppet run.
class profiles::netbox::facts (
Optional[Sensitive[String]] $api_token = undef,
Stdlib::HTTPSUrl $url = 'https://netbox.k8s.syd1.au.unkin.net',
Stdlib::AbsolutePath $token_file = '/etc/puppetlabs/netbox.token',
Stdlib::AbsolutePath $url_file = '/etc/puppetlabs/netbox.url',
Stdlib::AbsolutePath $cache_dir = '/var/cache/puppet-netbox',
) {
if $api_token =~ Undef {
notify { 'netbox-facts-inert':
message => 'profiles::netbox::facts: api_token unset; netbox fact disabled on this host.',
loglevel => 'info',
}
} else {
file { $token_file:
ensure => file,
owner => 'root',
group => 'root',
mode => '0600',
show_diff => false,
content => Sensitive("${api_token.unwrap}\n"),
}
file { $url_file:
ensure => file,
owner => 'root',
group => 'root',
mode => '0644',
content => "${url}\n",
}
file { $cache_dir:
ensure => directory,
owner => 'root',
group => 'root',
mode => '0700',
}
}
}