Changing the Configuration =============================== NAPALM tries to provide a common interface and mechanisms to push configuration and retrieve state data from network devices. This method is very useful in combination with tools like `Ansible `_, which in turn allows you to manage a set of devices independent of their network OS. Connecting to the Device ------------------------ Use the appropriate network driver to connect to the device:: >>> from napalm import get_network_driver >>> driver = get_network_driver('eos') >>> device = driver('192.168.76.10', 'dbarroso', 'this_is_not_a_secure_password') >>> device.open() Configurations can be replaced entirely or merged into the existing device config. You can load configuration either from a string or from a file. Replacing the Configuration --------------------------- To replace the configuration do the following:: >>> device.load_replace_candidate(filename='test/unit/eos/new_good.conf') Note that the changes have not been applied yet. Before applying the configuration you can check the changes:: >>> print(device.compare_config()) + hostname pyeos-unittest-changed - hostname pyeos-unittest router bgp 65000 vrf test + neighbor 1.1.1.2 maximum-routes 12000 + neighbor 1.1.1.2 remote-as 1 - neighbor 1.1.1.1 remote-as 1 - neighbor 1.1.1.1 maximum-routes 12000 vrf test2 + neighbor 2.2.2.3 remote-as 2 + neighbor 2.2.2.3 maximum-routes 12000 - neighbor 2.2.2.2 remote-as 2 - neighbor 2.2.2.2 maximum-routes 12000 interface Ethernet2 + description ble - description bla If you are happy with the changes you can commit them:: >>> device.commit_config() On the contrary, if you don't want the changes you can discard them:: >>> device.discard_config() Merging Configuration --------------------- Merging configuration is similar, but you need to load the configuration with the merge method:: >>> device.load_merge_candidate(config='hostname test\ninterface Ethernet2\ndescription bla') >>> print(device.compare_config()) configure hostname test interface Ethernet2 description bla end If you are happy with the changes you can commit them:: >>> device.commit_config() On the contrary, if you don't want the changes you can discard them:: >>> device.discard_config() Committing the Configuration with a Required Confirmation --------------------------------------------------------- For certain platforms, you can also commit the configuration and set a revert timer. If you do not confirm the commit, by executing confirm_commit(), before the revert timer expires, then the configuration will be automatically rolled back to its previous state (and the candidate configuration will be discarded):: # Load new candidate config >>> device.load_replace_candidate(filename=filename) # Look at the pending changes >>> print(device.compare_config()) @@ -5,6 +5,8 @@ transceiver qsfp default-mode 4x10G ! hostname arista9-napalm +! +ntp server 130.126.24.24 ! spanning-tree mode rapid-pvst ! # Commit the changes with a 300 second revert timer. device.commit_config(revert_in=300) # You can now use the has_pending_commit() method to check for an in-process commit-confirm >>> device.has_pending_commit() True # To confirm the commit (i.e. ensure the change is permanently committed). >>> device.confirm_commit() # At this point there should be no pending commits. >>> device.has_pending_commit() False Immediately Canceling a Pending Commit-Confirm ---------------------------------------------- Alternatively, to immediately cancel a pending commit_config with the revert timer set, you can execute the rollback() method:: >>> device.load_replace_candidate(filename=filename) >>> device.commit_config(revert_in=300) >>> device.has_pending_commit() True >>> device.rollback() >>> device.has_pending_commit() False # At this point, our change would have been rolled-back (the change in this case added an 'ntp server'). >>> output = device.get_config()["running"] >>> "ntp" in output False Allowing the Revert Timer to Expire ----------------------------------- Finally, you can cancel a pending commit-confirm by letting the revert timer expire:: >>> device.load_replace_candidate(filename=filename) >>> device.commit_config(revert_in=60) >>> device.has_pending_commit() True # Sleeping 80 seconds >>> time.sleep(80) # The device has automatically rolled-back the config to its previous state. >>> device.has_pending_commit() False Rollback Changes ---------------- If for some reason you committed the changes and you want to rollback:: >>> device.rollback() Disconnecting ------------- To close the session with the device just do:: >>> device.close()