Quick post today, more like a reminder for my future self than anything else 🙃
If you want to quickly change the value of a facter fact you can use ENV variables[*].
# show the operating system we are running (retrieved from facter) $ puppet apply -e 'notify { "We are running on ${::operatingsystem}": }' notice: We are running on Fedora # override $operatingsystem for testing purposes $ FACTER_operatingsystem=Debian puppet apply -e 'notify { "We are running on ${::operatingsystem}": }' notice: We are running on Debian
This works just fine but sometimes you cannot rely on environment variables and you need something consistent system-wide.
The solution™️
Create a new JSON file (YAML is also possible) under /opt/puppetlabs/facter/facts.d/ with the facts and the new values.
{"fact_name": "new_value"}
Changing kernel fact
[root@puppet ~]# facter kernel Linux [root@puppet ~]# cat /opt/puppetlabs/facter/facts.d/overwrite_kernel.json { "kernel": "Hurd" } [root@puppet ~]# facter kernel Hurd [root@puppet ~]#
Cool, what about structured facts
For structured facts you should to provide the whole JSON, otherwise you will lose those facts you don’t specify.
Example (note how release number was changed from v7.8 to v1.3):
[root@puppet ~]# cat /opt/puppetlabs/facter/facts.d/overwrite_os.json { "os": { "architecture": "x86_64", "distro": { "codename": "Maipo", "description": "Red Hat Enterprise Linux Server release 7.8 (Maipo)", "id": "RedHatEnterpriseServer", "release": { "full": "1.3", "major": "1", "minor": "3" }, "specification": ":core-4.1-amd64:core-4.1-noarch" }, "family": "RedHat", "hardware": "x86_64", "name": "RedHat", "release": { "full": "1.3", "major": "1", "minor": "3" }, "selinux": { "config_mode": "enforcing", "current_mode": "enforcing", "enabled": "true", "enforced": "false", "policy_version": "31" } } }
And that’s it, simple and effective 😀
[*] Updated example from: https://www.puppetcookbook.com/posts/override-a-facter-fact.html