:lastproofread: 2023-01-16

.. _vyos-napalm:

Napalm
======

VyOS supports some napalm_ functions for configuration and op-mode.
It requires more tests.

Install ``napalm-vyos`` module

.. code-block:: none

  apt install python3-pip
  pip3 install napalm
  pip3 install napalm-vyos


Op-mode
-------

.. code-block:: none

  #!/usr/bin/env python3

  import json
  from napalm import get_network_driver

  driver = get_network_driver('vyos')

  vyos_router = driver(
      hostname="192.0.2.1",
      username="vyos",
      password="vyospass",
      optional_args={"port": 22},
  )

  vyos_router.open()
  output = vyos_router.get_facts()
  print(json.dumps(output, indent=4))

  output = vyos_router.get_arp_table()
  print(json.dumps(output, indent=4))

  vyos_router.close()

Output op-mode

.. code-block:: none

  $ ./vyos-napalm.py
  {
      "uptime": 7185,
      "vendor": "VyOS",
      "os_version": "1.3.0-rc5",
      "serial_number": "",
      "model": "Standard PC (Q35 + ICH9, 2009)",
      "hostname": "r4-1.3",
      "fqdn": "vyos.local",
      "interface_list": [
          "eth0",
          "eth1",
          "eth2",
          "lo",
          "vtun10"
      ]
  }
  [
      {
          "interface": "eth1",
          "mac": "52:54:00:b2:38:2c",
          "ip": "192.0.2.2",
          "age": 0.0
      },
      {
          "interface": "eth0",
          "mac": "52:54:00:a2:b9:5b",
          "ip": "203.0.113.11",
          "age": 0.0
      }
  ]

Configuration
-------------

We need 2 files, commands.conf and script itself.

Content of commands.conf

.. code-block:: none

  set service ssh disable-host-validation
  set service ssh port '2222'
  set system name-server '192.0.2.8'
  set system name-server '203.0.113.8'
  set interfaces ethernet eth1 description 'FOO'

Script vyos-napalm.py

.. code-block:: none

  #!/usr/bin/env python3

  from napalm import get_network_driver

  driver = get_network_driver('vyos')

  vyos_router = driver(
      hostname="192.0.2.1",
      username="vyos",
      password="vyospass",
      optional_args={"port": 22},
  )

  vyos_router.open()
  vyos_router.load_merge_candidate(filename='commands.conf')
  diffs = vyos_router.compare_config()

  if bool(diffs) == True:
      print(diffs)
      vyos_router.commit_config()
  else:
      print('No configuration changes to commit')
      vyos_router.discard_config()

  vyos_router.close()

Output

.. code-block:: none

  $./vyos-napalm.py 
  [edit interfaces ethernet eth1]
  +description FOO
  [edit service ssh]
  +disable-host-validation
  +port 2222
  [edit system]
  +name-server 192.0.2.8
  +name-server 203.0.113.8
  [edit]

.. _napalm: https://napalm.readthedocs.io/en/latest/base.html