Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

header-navigation
keyboard_arrow_up
close
keyboard_arrow_left
Automation Scripting User Guide
Table of Contents Expand all
list Table of Contents
file_download PDF
{ "lLangCode": "en", "lName": "English", "lCountryCode": "us", "transcode": "en_US" }
English
keyboard_arrow_right

Example: Change the Configuration Using Python Op Scripts

date_range 29-Nov-23

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. This enables users who have less experience with Junos OS to safely modify the configuration using the script. 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:

  • MX Series router running Junos OS Release 16.1R3 or later release that includes the Python extensions package.

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:

  • Device class—handles the connection to the Junos device

  • Config class—performs configuration mode commands on the target device

  • jnpr.junos.exception module—contains exceptions encountered when managing Junos devices

  • jcs module—enables the script to execute supported extension functions

In this example, the usage variable is initialized with a general description of the script’s function. When the script is executed, the script outputs the usage description on the CLI so that the user can verify the purpose for that script.

The script calls the jcs.get_input() extension function, which prompts the user to enter the name of the interface to disable, and 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 while it’s being modified. 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

content_copy zoom_out_map
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:

  1. 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-user login class, and only the file owner can have write permission for the file.

  2. In configuration mode, include the file config-change.py statement at the [edit system scripts op] hierarchy level.

    content_copy zoom_out_map
    [edit system scripts]
    user@host# set op file config-change.py
    
  3. Enable the execution of unsigned Python scripts on the device.

    content_copy zoom_out_map
    [edit system scripts]
    user@host# set language python
    
    Note:

    Configure the language python3 statement to use Python 3 to execute Python scripts, or configure the language python statement to use Python 2.7 to execute Python scripts. For more information, see language.

  4. Issue the commit and-quit command to commit the configuration and to return to operational mode.

    content_copy zoom_out_map
    [edit]
    user@host# commit and-quit
    
  5. Before running the script, issue the show interfaces interface-name operational mode command and record the current state of the interface that will be disabled by the script.

  6. Execute the op script by issuing the op config-change.py operational mode command.

    content_copy zoom_out_map
    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: so-0/0/0
    Loading and committing configuration changes
    

Verification

Verifying 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. This 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.

    content_copy zoom_out_map
    user@host> show system commit
    0   2010-09-22 17:08:17 PDT by user via netconf
  • Check the syslog message file to verify that the commit operation was logged. In this case, you also see an SNMP_TRAP_LINK_DOWN message for the disabled interface. Depending on your configuration settings for traceoptions, this message might or might not appear in your log file.

    content_copy zoom_out_map
    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 so-0/0/0
    

Verifying the Configuration Changes

Purpose

Verify that the correct changes are integrated into the configuration.

Action

  • Display the configuration and verify that the changes are visible for the specified interface.

    content_copy zoom_out_map
    user@host> show configuration interfaces so-0/0/0
    disable;
  • For this example, you also can issue the show interfaces interface-name operational mode command to check that the interface was disabled. In this case, the output captured before the interface was disabled shows that the interface is Enabled.

    content_copy zoom_out_map
    user@host> show interfaces so-0/0/0
    Physical interface: so-0/0/0, Enabled, Physical link is Up
      Interface index: 128, SNMP ifIndex: 526
      Link-level type: PPP, MTU: 4474, Clocking: Internal, SONET mode, Speed: OC3, Loopback: None, FCS: 16,
      Payload scrambler: Enabled
      Device flags   : Present Running
      Interface flags: Point-To-Point SNMP-Traps Internal: 0x4000
      Link flags     : Keepalives
      CoS queues     : 4 supported, 4 maximum usable queues
      Last flapped   : 2010-09-14 10:33:25 PDT (1w1d 06:27 ago)
      Input rate     : 0 bps (0 pps)
      Output rate    : 0 bps (0 pps)
      SONET alarms   : None
      SONET defects  : None
    

    The output captured after running the script to disable the interface shows that the interface is now Administratively down.

    content_copy zoom_out_map
    user@host> show interfaces so-0/0/0
    Physical interface: so-0/0/0, Administratively down, Physical link is Up
      Interface index: 128, SNMP ifIndex: 526
      Link-level type: PPP, MTU: 4474, Clocking: Internal, SONET mode, Speed: OC3, Loopback: None, FCS: 16,
      Payload scrambler: Enabled
      Device flags   : Present Running
      Interface flags: Down Point-To-Point SNMP-Traps Internal: 0x4000
      Link flags     : Keepalives
      CoS queues     : 4 supported, 4 maximum usable queues
      Last flapped   : 2010-09-14 10:33:25 PDT (1w1d 06:40 ago)
      Input rate     : 0 bps (0 pps)
      Output rate    : 0 bps (0 pps)
      SONET alarms   : None
      SONET defects  : None
    
footer-navigation