Example: Change the Configuration Using Python Op Scripts
Op scripts enable you to make controlled changes to the Junos OS configuration. Op scripts are advantageous, because they can gather operational information about a device and update the configuration based on that information. Experienced users who are familiar with Junos OS can write op scripts that prompt for the relevant configuration information and modify the configuration accordingly. Thus, users who have less experience configuring Junos OS can use the scripts to safely modify the configuration. This example demonstrates how to make changes to the Junos OS configuration using a Python op script that leverages Junos PyEZ APIs.
Requirements
This example uses the following hardware and software components:
Device running Junos OS or device running Junos OS Evolved.
Overview and Op Script
Python op scripts can make changes to the Junos OS configuration using the Junos PyEZ
jnpr.junos.utils.config.Config utility. The Junos PyEZ
Config utility provides instance methods to: lock the
configuration, load the configuration data and specify how to integrate it into the
configuration, commit the configuration, and unlock the configuration. For more
information about using Junos PyEZ to configure Junos devices, see Using Junos PyEZ to Configure Junos
Devices. The Python op script in this example demonstrates how to update
the configuration to disable an interface on the local device.
The Python op script imports the following:
Deviceclass—Handles the connection to the Junos deviceConfigclass—Performs configuration mode commands on the target devicejnpr.junos.exceptionmodule—Contains exceptions encountered when managing Junos devicesjcsmodule—Enables the script to execute supported extension functions
In this example, the usage variable includes a general description of the
script’s function. When you execute the script, the output includes the usage
description in the CLI so the user can verify the script's purpose.
The script calls the jcs.get_input() extension function, which prompts the user
to enter the name of the interface to disable. The script stores the interface name
in the interface variable. The config_xml variable
is an XML string that defines the configuration changes.
The script does not supply a host parameter when creating the Device instance,
which causes the open() method to establish a connection with the
local device. This example creates the Config instance by using a
context manager with mode='exclusive' to obtain an exclusive lock
on the configuration. In this mode, the context manager automatically handles
locking and unlocking the candidate configuration. The Config
utility methods load the configuration changes into the candidate configuration as a
load merge operation and commit the configuration. The
dev.close() method closes the connection.
Python Script
from jnpr.junos import Device
from jnpr.junos.utils.config import Config
from jnpr.junos.exception import *
import jcs
import sys
def main():
usage = """
This script disables the specified interface.
The script modifies the candidate configuration to disable
the interface and commits the configuration to activate it.
"""
print (usage)
interface = jcs.get_input("Enter interface to disable: ")
if not interface:
print ("invalid interface")
sys.exit(1)
config_xml = """
<configuration>
<interfaces>
<interface>
<name>{0}</name>
<disable/>
</interface>
</interfaces>
</configuration>
""".format(interface).strip()
dev = Device()
dev.open()
try:
with Config(dev, mode="exclusive") as cu:
print ("Loading and committing configuration changes")
cu.load(config_xml, format="xml", merge=True)
cu.commit()
except Exception as err:
print (err)
dev.close()
return
dev.close()
if __name__ == "__main__":
main()Configuration
Step-by-Step Procedure
To download, enable, and test the script:
-
Copy the script into a text file, name the file config-change.py, and copy it to the /var/db/scripts/op/ directory on the device.
Note:Unsigned Python scripts must be owned by either root or a user in the Junos OS
super-userlogin class, and only the file owner can have write permission for the file. -
In configuration mode, include the
file config-change.pystatement at the[edit system scripts op]hierarchy level.[edit system scripts] user@host# set op file config-change.py
-
Enable the execution of unsigned Python scripts on the device.
[edit system scripts] user@host# set language python3
-
Issue the
commit and-quitcommand to commit the configuration and to return to operational mode.[edit] user@host# commit and-quit
-
Before running the script, issue the
show interfaces interface-nameoperational mode command and record the current state of the interface that will be disabled by the script. -
Execute the op script by issuing the
op config-change.pyoperational mode command.user@host> op config-change.py This script disables the specified interface. The script modifies the candidate configuration to disable the interface and commits the configuration to activate it. Enter interface to disable: ge-0/0/0 Loading and committing configuration changes
Verification
Verify the Commit
Purpose
Verify that the commit succeeded.
Action
You should include code in your script that catches any warnings or errors associated with changing and committing the configuration. Including warnings and errors enables you to more easily determine whether the commit succeeded. If there are no warning or error messages, you can verify the success of the commit in several ways:
Check the commit log to verify that the commit was successful.
user@host> show system commit 0 2010-09-22 17:08:17 PDT by user via netconf
Check the log file to verify that the commit operation occurred. In this case, you also see an
SNMP_TRAP_LINK_DOWNmessage for the disabled interface. Depending on your configuration settings for traceoptions, this message might or might not appear in your log file.user@host> show log messages | last Sep 22 17:08:13 host file[7319]: UI_COMMIT: User 'user' requested 'commit' operation Sep 22 17:08:16 host xntpd[1386]: ntpd exiting on signal 1 Sep 22 17:08:16 host xntpd[1386]: ntpd 4.2.0-a Fri Jun 25 13:48:13 UTC 2010 (1) Sep 22 17:08:16 host mib2d[1434]: SNMP_TRAP_LINK_DOWN: ifIndex 526, ifAdminStatus down(2), ifOperStatus down(2), ifName ge-0/0/0
Verify the Configuration Changes
Purpose
Verify that the configuration contains the correct changes.
Action
Verify that the configuration includes the changes for the specified interface.
user@host> show configuration interfaces ge-0/0/0 disable;
For this example, you also can issue the
show interfaces interface-nameoperational mode command to check that the interface is disabled. In this case, the output captured before the interface is disabled shows that the interface isEnabled.user@host> show interfaces ge-0/0/0 Physical interface: ge-0/0/0, Enabled, Physical link is Up Interface index: 150, SNMP ifIndex: 537 ...
The output captured after running the script to disable the interface shows that the interface is now
Administratively down.user@host> show interfaces ge-0/0/0 Physical interface: ge-0/0/0, Administratively down, Physical link is Up Interface index: 150, SNMP ifIndex: 537 ...