You are browsing a read-only backup copy of Wikitech. The primary site can be found at


From Wikitech-static
Revision as of 16:28, 17 December 2019 by imported>Ayounsi (→‎Usage 🚀)
Jump to navigation Jump to search

Homer (previously jnt) is our homemade network configuration manager.

It takes variables from Netbox and yaml files, run them through jinja templates to generate Juniper compatible configuration.

Homer can then send those configurations to selected network devices, for a diff or a safe commit.

The tool is written to not be Wikimedia specific. It only supports Junos but can easily be extended to other platforms.

Its doc is available on

Its code on Gerrit

Its bug and feature requests on Phabricator:

This page focuses on Wikimedia's deployment.


Homer is deployed via Puppet and Scap to the cumin (fleet management) hosts.

You can find its deploy repository here

And its Puppet module there

In addition it's available on Pypi:

Releasing a new version

  • Make a release patch updating the changelog (see this example patch).
  • Once it's merged, update the local checkout and make a git tag. Ideally an annotated one (requires a GPG key and have git configured to use it, see signingkey):
$ RELEASE=v0.1.0
$ git tag -s -a "${RELEASE}" -m "${RELEASE}" -m "[Release Notes](CHANGELOG.rst)"
  • Push the generated tag: git push origin "${RELEASE}"
  • Move to the homer-deploy checkout:
$ cd src/
$ git pull
$ git log -1  # to check to be at the right commit
$ cd ..
# At this point git status would show that there is a diff for the 'src' path, indicating the different SHA1 of the git submodule
# Ensure that docker is running
$ make -f all
# Verify that the generated wheels are correct
# At this point the frozen-requirements.txt file will most likely have some changes and the artifacts/artifacts.stretch.tar.gz will be different
git add .
git commit -m "Release ${RELEASE}"
git review
  • Once the above patch has been merged (C+2, V+2 + submit), move to the deployment server in /srv/deployment/homer/deploy
  • Pull the latest changes: git pull
  • Verify that in the src/ directory we're at the correct commit (check also with git status)
  • Deploy the new release: scap deploy --verbose "Homer release v... - T..."

Daily diffs (not ready yet)

A cron job will run Homer every day to compare the live network configuration with our intended state. Any discrepancies will be emailed to someone (ideally a list) to be fixed.

Usage 🚀

Making changes

Note that Homer explicitly asks you when its about to modify the live network configuration (Type "yes" to commit, "no" to abort.) and will prompt you with a diff of the changes beforehand.

Editing the private repository

Manually edit then commit the files on ssh://cumin1001.eqiad.wmnet:/srv/homer/private .

git will sync them with the other cumin host. And will email a summary of the changes to Riccardo (TODO: change it to SREs).

Make sure to mirror all your changes on the mock-private repo:

This repository doesn't have CI, please be extra careful.

Editing the public repository

Similar to our other public repositories, send CRs to , try not to +2 your changes.

This repository doesn't have CI yet, please be extra careful.

Editing Netbox

Data is also pulled from Netbox, always make sure that Netbox accurate before using Homer.

Running Homer from cumin hosts (recommended)

Get familiar with the command line: everything else is taken care of.

The public repository is regularly updated by Puppet.

When pushing configurations, homer will ssh to the network devices using the Homer user. You need to be in the ops group to be able to use its private key.

Some examples:

  • homer "*" diff All devices
  • homer "cr*ams*" diff esams and knams core routers
  • homer "mr*" commit "My commit message" All management routers

Running Homer from your local machine (less recommended)

When pushing configurations, your machine will ssh directly to the network devices, which mean that you have to have an account there, with the proper permissions.

It's common to test a change locally with the "diff" option. Once satisfied with the result, please merge your change on Gerrit before pushing them with the "commit" action.

Style guides

YAML files



It's ok to give up on indentation.

Network configuration coverage



groups {}
system {}
logical-systems {}
services {}
snmp {}
forwarding-options {}
protocols {
    ospf {}
    ospf3 {}
    lldp {}
policy-options {}
firewall {}
routing-instances {}


interfaces {}  # (Partial)
routing-options {}  # (Partial)
apply-groups [ re0 re1 ];  #
chassis {}  # (Partial)
protocols {
    router-advertisement {}
    bgp {}  # Out of scope
    pim {}  #



system {}
snmp {}
protocols {}
routing-options {}
virtual-chassis {}
vlans {}


chassis {}  #
interfaces {}



groups {}
system {}
snmp {}
protocols {}
routing-options {}
policy-options {}
security {
    zones {}
    alg {}
    forwarding-options {}
    screen {}


interfaces {}
security {
    address-book {}  # Capirca?
    nat {}
    policies {}  # Capirca?
routing-instances {}
applications {}  # Capirca?



system {}
snmp {}
protocols {}
routing-options {}
vlans {}


interfaces {}

Common/known issues

(Almost) None.

  • The "commit" action doesn't work on the SRXs and the MX104, it will do the Juniper's "commit confirmed 2", but not the "commit check" to make the change permanent.
  • Ignore the "Unable to determine FQDN for device" errors.