Writing custom tasks

To create custom NETCONF tasks that use the edgeops library, you need to include the task helper and configure your task metadata properly.

  1. Create a JSON metadata file for your task, for example, tasks/my_task.json:

    {
      "description": "My custom NETCONF task",
      "input_method": "stdin",
      "files": [
        "edgeops/files/task_helper.rb",
        "edgeops/lib/puppet_x/puppetlabs/netconf/client.rb",
        "edgeops/lib/puppet_x/puppetlabs/netconf/session.rb",
        "edgeops/lib/puppet_x/puppetlabs/netconf/redactor.rb"
      ],
      "remote": false,
      "parameters": {
        "interface": {
          "description": "Interface to configure",
          "type": "String"
        },
        "source_datastore": {
          "description": "Source datastore override",
          "type": "Optional[Enum[running, candidate, startup]]"
        }
      }
    }
    The "files": ["edgeops/files/task_helper.rb"] entry is required to bundle the edgeops library with your task.
  2. Create your task implementation, for example, tasks/my_task.rb:

    #!/usr/bin/env ruby
    require_relative '../../edgeops/files/task_helper.rb'
    require 'puppet_x/puppetlabs/netconf/session'
    require 'json'
    
    result = PuppetX::Puppetlabs::Netconf::Session.with_session do |session|
      # Access parameters
      interface = session.task_params['interface']
      
      # Get configuration
      config = session.get_config
      
      # Make changes
      new_config = "<config>...</config>"
      session.edit_config(new_config)
      
      # Commit if using candidate
      session.commit if session.supports_candidate?
      
      # Report results
      session.report_result({
        'status' => 'success',
        'interface' => interface,
        'message' => 'Configuration updated'
      })
    end
    
    # Output result as JSON (required!)
    puts result.to_json

     

    • Always declare required files in task metadata

    • Capture the session result: result = Session.with_session

    • Output JSON: puts result.to_json

    • Use session helpers: session.supports_candidate? and session.task_params

  3. Add the task to an existing or new module in your control repo and deploy to an environment. See Writing tasks.

  4. Add a node with the NETCONF transport to your inventory. See Add agentless nodes to the inventory.