Skip to content

Commit

Permalink
Merge pull request #618 from nautobot/release-v3.3.0
Browse files Browse the repository at this point in the history
Release v3.3.0
  • Loading branch information
jdrew82 authored Dec 6, 2024
2 parents 5850f86 + ec6000c commit 2858221
Show file tree
Hide file tree
Showing 131 changed files with 9,246 additions and 1,062 deletions.
2 changes: 1 addition & 1 deletion .cookiecutter.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"max_nautobot_version": "2.9999",
"camel_name": "NautobotSSOTApp",
"project_short_description": "Nautobot Single Source of Truth",
"model_class_name": "None",
"model_class_name": "Sync",
"open_source_license": "Apache-2.0",
"docs_base_url": "https://docs.nautobot.com",
"docs_app_url": "https://docs.nautobot.com/projects/ssot/en/latest",
Expand Down
5 changes: 5 additions & 0 deletions .github/CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,12 @@
/nautobot_ssot/integrations/aci/ @chadell @nautobot/plugin-ssot
/nautobot_ssot/integrations/aristacv/ @qduk @jdrew82 @nautobot/plugin-ssot
/nautobot_ssot/integrations/bootstrap/ @bile0026 @nautobot/plugin-ssot
/nautobot_ssot/integrations/citrix_adm/ @jdrew82 @nautobot/plugin-ssot
/nautobot_ssot/integrations/device42/ @jdrew82 @nautobot/plugin-ssot
/nautobot_ssot/integrations/dna_center/ @jdrew82 @nautobot/plugin-ssot
/nautobot_ssot/integrations/infoblox/ @qduk @jdrew82 @nautobot/plugin-ssot
/nautobot_ssot/integrations/ipfabric/ @alhogan @nautobot/plugin-ssot
/nautobot_ssot/integrations/itential/ @jtdub @nautobot/plugin-ssot
/nautobot_ssot/integrations/meraki/ @jdrew82 @nautobot/plugin-ssot
/nautobot_ssot/integrations/servicenow/ @glennmatthews @qduk @nautobot/plugin-ssot
/nautobot_ssot/integrations/slurpit/ @lpconsulting321 @pietos @nautobot/plugin-ssot
18 changes: 18 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ The Nautobot SSoT app builds atop the [DiffSync](https://github.com/networktocod
This Nautobot application framework includes the following integrations:

- Cisco ACI
- Bootstrap
- Citrix ADM
- Arista CloudVision
- Device42
- Cisco DNA Center
Expand All @@ -35,6 +37,7 @@ This Nautobot application framework includes the following integrations:
- Itential
- Cisco Meraki
- ServiceNow
- Slurpit

Read more about integrations [here](https://docs.nautobot.com/projects/ssot/en/latest/user/integrations). To enable and configure integrations follow the instructions from [the install guide](https://docs.nautobot.com/projects/ssot/en/latest/admin/install/#integrations-configuration).

Expand Down Expand Up @@ -82,13 +85,16 @@ Full documentation for this app can be found over on the [Nautobot Docs](https:/
The SSoT framework includes a number of integrations with external Systems of Record:

* Cisco ACI
* Bootstrap
* Citrix ADM
* Arista CloudVision
* Device42
* Cisco DNA Center
* Infoblox
* Itential
* Cisco Meraki
* ServiceNow
* Slurpit

> Note that the Arista CloudVision integration is currently incompatible with the [Arista Labs](https://labs.arista.com/) environment due to a TLS issue. It has been confirmed to work in on-prem environments previously.
Expand All @@ -114,6 +120,12 @@ This project includes code originally written in separate Nautobot apps, which h
[@dnewood](https://github.com/dnewood),
[@progala](https://github.com/progala),
[@ubajze](https://github.com/ubajze)
- [nautobot-plugin-ssot-bootstrap](https://github.com/nautobot/nautobot-plugin-ssot-bootstrap):
Thanks
[@bile0026](https://github.com/bile0026)
- [nautobot-plugin-ssot-citrix-adm](https://github.com/nautobot/nautobot-plugin-ssot-citrix-adm):
Thanks
[@jdrew82](https://github.com/jdrew82)
- [nautobot-plugin-ssot-arista-cloudvision](https://github.com/nautobot/nautobot-plugin-ssot-arista-cloudvision):
Thanks
[@burnyd](https://github.com/burnyd),
Expand Down Expand Up @@ -151,6 +163,12 @@ This project includes code originally written in separate Nautobot apps, which h
[@pke11y](https://github.com/pke11y),
[@ubajze](https://github.com/ubajze)
[@whitej6](https://github.com/whitej6),
- [nautobot-plugin-ssot-device42](https://github.com/nautobot/nautobot-plugin-ssot-itential):
Thanks
[@jtdub](https://github.com/jtdub)
- [nautobot-plugin-ssot-meraki](https://github.com/nautobot/nautobot-plugin-ssot-meraki):
Thanks
[@jdrew82](https://github.com/jdrew82)
- [nautobot-plugin-ssot-servicenow](https://github.com/nautobot/nautobot-plugin-ssot-servicenow):
Thanks
[@chadell](https://github.com/chadell),
Expand Down
7 changes: 3 additions & 4 deletions development/creds.example.env
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ NAUTOBOT_ARISTACV_CVP_TOKEN="changeme"

NAUTOBOT_SSOT_DEVICE42_PASSWORD="changeme"

NAUTOBOT_SSOT_CITRIX_ADM_USERNAME="admin"
NAUTOBOT_SSOT_CITRIX_ADM_PASSWORD="changeme"

NAUTOBOT_SSOT_INFOBLOX_PASSWORD="changeme"

# ACI Credentials. Append friendly name to the end to identify each APIC.
Expand All @@ -49,9 +52,5 @@ SERVICENOW_PASSWORD="changeme"

IPFABRIC_API_TOKEN=secrettoken

NAUTOBOT_SSOT_ENABLE_BOOTSTRAP="False"
NAUTOBOT_BOOTSTRAP_SSOT_ENVIRONMENT_BRANCH=develop
NAUTOBOT_BOOTSTRAP_SSOT_LOAD_SOURCE=file # or git

MERAKI_ORG_ID='123456'
MERAKI_TOKEN='vtx01710aa0fn452740055y1hs60ns8c107ho168'
10 changes: 10 additions & 0 deletions development/development.env
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,10 @@ NAUTOBOT_ARISTACV_IMPORT_ACTIVE="False"
NAUTOBOT_ARISTACV_IMPORT_TAG="False"
NAUTOBOT_ARISTACV_VERIFY=True

NAUTOBOT_SSOT_ENABLE_BOOTSTRAP="False"
NAUTOBOT_BOOTSTRAP_SSOT_ENVIRONMENT_BRANCH=develop
NAUTOBOT_BOOTSTRAP_SSOT_LOAD_SOURCE=file # or git

NAUTOBOT_SSOT_ENABLE_DEVICE42="False"
NAUTOBOT_SSOT_DEVICE42_HOST=""
NAUTOBOT_SSOT_DEVICE42_USERNAME=""
Expand All @@ -80,6 +84,9 @@ NAUTOBOT_DNAC_SSOT_DNA_CENTER_IMPORT_MERAKIS="False"
NAUTOBOT_DNAC_SSOT_DNA_CENTER_UPDATE_LOCATIONS="True"
NAUTOBOT_DNAC_SSOT_DNA_CENTER_SHOW_FAILURES="True"

NAUTOBOT_SSOT_ENABLE_CITRIX_ADM="False"
NAUTOBOT_SSOT_CITRIX_ADM_UPDATE_SITES="True"

NAUTOBOT_SSOT_ENABLE_INFOBLOX="False"
NAUTOBOT_SSOT_INFOBLOX_DEFAULT_STATUS="Active"
NAUTOBOT_SSOT_INFOBLOX_ENABLE_SYNC_TO_INFOBLOX="True"
Expand All @@ -106,3 +113,6 @@ IPFABRIC_SSL_VERIFY="True"
IPFABRIC_TIMEOUT=15

NAUTOBOT_SSOT_ENABLE_ITENTIAL="True"

NAUTOBOT_SSOT_ENABLE_SLURPIT="False"
SLURPIT_HOST="https://sandbox.slurpit.io"
3 changes: 3 additions & 0 deletions development/nautobot_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,16 +219,19 @@
"vrf": True,
"prefix": True,
},
"citrix_adm_update_sites": is_truthy(os.getenv("NAUTOBOT_SSOT_CITRIX_ADM_UPDATE_SITES", "true")),
"enable_aci": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_ACI")),
"enable_aristacv": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_ARISTACV")),
"enable_bootstrap": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_BOOTSTRAP", "false")),
"enable_citrix_adm": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_CITRIX_ADM")),
"enable_device42": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_DEVICE42")),
"enable_dna_center": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_DNA_CENTER")),
"enable_infoblox": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_INFOBLOX")),
"enable_ipfabric": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_IPFABRIC")),
"enable_itential": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_ITENTIAL")),
"enable_meraki": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_MERAKI")),
"enable_servicenow": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_SERVICENOW")),
"enable_slurpit": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_SLURPIT")),
"hide_example_jobs": is_truthy(os.getenv("NAUTOBOT_SSOT_HIDE_EXAMPLE_JOBS")),
"device42_defaults": {
"site_status": "Active",
Expand Down
1 change: 1 addition & 0 deletions docs/admin/compatibility_matrix.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,4 @@ While that last supported version will not be strictly enforced--via the max_ver
| 3.0.1 | 2.1.0 | 2.99.99 |
| 3.1.0 | 2.1.0 | 2.99.99 |
| 3.2.0 | 2.1.0 | 2.99.99 |
| 3.3.0 | 2.1.0 | 2.99.99 |
1 change: 1 addition & 0 deletions docs/admin/install.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,3 +99,4 @@ Set up each integration using the specific guides:
- [Itential](./integrations/itential_setup.md)
- [Cisco Meraki](./integrations/meraki_setup.md)
- [ServiceNow](./integrations/servicenow_setup.md)
- [Slurpit](./integrations/slurpit_setup.md)
16 changes: 6 additions & 10 deletions docs/admin/integrations/bootstrap_setup.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
# Bootstrap


## Description

This App will sync data from YAML files into Nautobot to create baseline environments. Most items will receive a custom field associated with them called "System of Record", which will be set to "Bootstrap". These items are then the only ones managed by the Bootstrap SSoT App. Other items within the Nautobot instance will not be affected unless there's items with overlapping names. There is currently two exceptions to this and those are the ComputedField, and GraphQLQuery models since they can't have a custom field associated. If you choose to manage ComputedField or GraphQLQuery objects with the Bootstrap SSoT App, make sure to define them all within the YAML file, since any "locally defined" Computed Fields and GraphQL Queries within Nautobot will end up getting deleted when the job runs. If an item exists in Nautobot by it's identifiers but it does not have the "System of Record" custom field on it, the item will be updated with "Bootstrap" (or `SYSTEM_OF_RECORD` environment variable value) when the App runs. This way no duplicates are created, and the App will not delete any items that are not defined in the Bootstrap data but were manually created in Nautobot.
Expand All @@ -13,17 +12,17 @@ Before configuring the integration, please ensure, that `nautobot-ssot` app was
pip install nautobot-ssot[bootstrap]
```

## Configuration

### nautobot_config.py

The settings here are pretty straightforward, `nautobot_environment_branch` will be loaded from the environment variable `NAUTOBOT_BOOTSTRAP_SSOT_ENVIRONMENT_BRANCH`, or default to develop. The rest of the settings define which models/objects you want to have the App sync to Nautobot. There are a couple of caveats to these. For example, for DynamicGroup objects to sync, the filter criteria need to already exist in Nautobot. So, if you are going to have groups that are filtered on platforms/regions/sites/etc make sure not to include DynamicGroup objects in the "models_to_sync" until those items exist. Same for Git Repositories when you want to sync Golden Config-related repositories. The Golden Config App needs to be installed, for the `provided_contents` items to be able to be found. This also goes for the Lifecycle Management app with `Software/ValidatedSoftware` models.
Once the SSoT package has been installed you simply need to enable the integration by setting `enable_bootstrap` to True. There are additional settings that allow you to control which Nautobot objects are defined in your data. The settings are pretty straightforward. Assuming that you're copying the example settings below, the `bootstrap_nautobot_environment_branch` setting will be loaded from the environment variable `NAUTOBOT_BOOTSTRAP_SSOT_ENVIRONMENT_BRANCH`, or default to develop. The `bootstrap_models_to_sync` setting defines which models/objects you want to have the App sync to Nautobot. There are a couple of caveats to this functionality. For example, for DynamicGroup objects to sync, the filter criteria need to already exist in Nautobot. So, if you are going to have groups that are filtered on Platforms, Locations, etc, make sure not to include DynamicGroup objects in your Bootstrap Data until those items exist in Nautobot. If these items are also being synchronized in your Bootstrap Data, they will be created in the correct order. The same goes for Golden Config-related Git Repositories. It should go without saying, but the [Golden Config App](https://github.com/nautobot/nautobot-app-golden-config) must be installed, for the backup, intended, and template `provided_contents` items to be available options in your Bootstrap Data along with support of the `SoftwareLCM, SoftwareImageLCM, and ValidatedSoftware` models from the [Device Lifecycle Management app](https://github.com/nautobot/nautobot-app-device-lifecycle-mgmt).

```python
PLUGINS = ["nautobot_ssot"]

PLUGINS_CONFIG = {
"nautobot_ssot": {
# Other nautobot_ssot settings ommitted.
"enable_bootstrap": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_BOOTSTRAP", "true")),
"bootstrap_nautobot_environment_branch": os.getenv("NAUTOBOT_BOOTSTRAP_SSOT_ENVIRONMENT_BRANCH", "develop"),
"bootstrap_models_to_sync": {
"secret": True,
Expand Down Expand Up @@ -57,20 +56,17 @@ PLUGINS_CONFIG = {
"vrf": True,
"prefix": True,
},
"enable_bootstrap": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_BOOTSTRAP", "false")),
}
}
```

## Configuration

### Bootstrap data
### Bootstrap Data

Bootstrap data can be stored in 2 fashions.

1. (Recommended) Bootstrap data can be stored in a Git Repository and referenced in the app as a Git Datasource. A user should create a Git Repository in Nautobot (including any necessary Secrets and SecretsGroups for access) with the word "Bootstrap" in the name, and with a provided content type of `config contexts`. This is how the App will locate the correct repository. The data structure is flat files, and there is a naming scheme to these files. The first one required is `global_settings.yml`. This contains the main data structures of what data can be loaded `Secrets,SecretsGroups,GitRepository,DynamicGroup,Tag,etc`. You can then create additional `.yml` files with naming of your CI environments, i.e. production, development, etc for default values for specific items. This is where the environment variables described below would be matched to pull in additional data from the other YAML files defined in the directory.
1. __Recommended__ Bootstrap data can be stored in a Git Repository and referenced in the app as a Git Datasource. A user should create a Git Repository in Nautobot (including any necessary Secrets and SecretsGroups for access) with the word "Bootstrap" in the name, and with a provided content type of `config contexts`. This is how the App will locate the correct repository. The data structure is flat files, and there is a naming scheme to these files. The first one required is `global_settings.yml`. This contains the main data structures of what data can be loaded. ie `Secrets, SecretsGroups, GitRepository, DynamicGroup, Tag, etc`. You can then create additional `.yml` files with naming of your CI environments, ie `production`, `development`, etc for default values for specific items. This is where the environment variables described below would be matched to pull in additional data from the other YAML files defined in the directory.

2. Bootstrap data can be stored within the `nautobot_ssot/bootstrap/fixtures` directory. Using local files is not recommended as this requires a fork of the plugin and locally editing the YAML data files in the fixtures folder.
2. Bootstrap data can be stored within the `nautobot_ssot/integrations/bootstrap/fixtures` directory. Using local files is not recommended as this requires a fork of the plugin and locally editing the YAML data files in the fixtures folder.

A simple structure would look something like this:

Expand Down
52 changes: 52 additions & 0 deletions docs/admin/integrations/citrix_adm_setup.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# Citrix ADM Integration Setup

This guide will walk you through the steps to set up Citrix ADM integration with the `nautobot_ssot` app.

## Prerequisites

Before configuring the integration, please ensure, that the `nautobot-ssot` app was [installed with the Citrix ADM integration extra dependencies](../install.md#install-guide).

```shell
pip install nautobot-ssot[citrix-adm]
```

## Configuration

Access to your Citrix ADM instance is defined using the [ExternalIntegration](https://docs.nautobot.com/projects/core/en/stable/user-guide/platform-functionality/externalintegration/) model which allows you to utilize this integration with multiple instances concurrently. Please bear in mind that it will synchronize all data 1:1 with the specified instance to match exactly, meaning it will delete data missing from an instance. Each ExternalIntegration must specify a SecretsGroup with Secrets that contain the Citrix ADM Username and Password to authenticate with. You can find Secrets and SecretsGroups available under the Secrets menu.

![Citrix ADM Username](../../images/citrix_adm_username.png)

![Citrix ADM Password](../../images/citrix_adm_password.png)

![Citrix ADM SecretsGroup](../../images/citrix_adm_secretsgroup.png)

The Secrets Group linked to the Citrix ADM ExternalIntegration must contain Secrets defined as per the below:

| Access Type | Secret Type |
| ----------- | ----------- |
| HTTP(S) | Username |
| HTTP(S) | Password |

Once the SecretsGroup is created you'll need to create the ExternalIntegration. You'll find this under the Extensibility menu.

![Citrix ADM ExternalIntegration](../../images/citrix_adm_externalintegration.png)

> The only required portions are the Name, Remote URL, Verify SSL, and Secrets Group.
When utilizing multiple SSoT integrations that contain differing Locations you might want to ensure that your existing Locations aren't updated by another integration. You can control whether these updates are made with the `citrix_adm_update_sites` setting in your `nautobot_config.py` file.

| Configuration Variable | Type | Usage | Default |
| --------------------------------------------------- | ------- | ---------------------------------------------------------- | -------------------- |
| citrix_adm_update_sites | boolean | Whether to update loaded Datacenter Locations. | True |

Below is an example snippet from `nautobot_config.py` that demonstrates how to enable and configure the Citrix ADM integration:

```python
PLUGINS_CONFIG = {
"nautobot_ssot": {
"enable_citrix_adm": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_CITRIX_ADM", "true")),
"citrix_adm_update_sites": os.getenv("NAUTOBOT_SSOT_CITRIX_ADM_UPDATE_SITES", "true"),
}
```

Once the integration has been enabled you can find instructions on using it in the [Usage instructions](../../user/integrations/citrix_adm.md#usage).
2 changes: 2 additions & 0 deletions docs/admin/integrations/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ This Nautobot app supports the following integrations:

- [Cisco ACI](./aci_setup.md)
- [Bootstrap](./bootstrap_setup.md)
- [Citrix ADM](./citrix_adm_setup.md)
- [Arista CloudVision](./aristacv_setup.md)
- [Device42](./device42_setup.md)
- [Cisco DNA Center](./dna_center_setup.md)
Expand All @@ -12,3 +13,4 @@ This Nautobot app supports the following integrations:
- [Itential](./itential_setup.md)
- [Cisco Meraki](./meraki_setup.md)
- [ServiceNow](./servicenow_setup.md)
- [Slurpit](./slurpit_setup.md)
34 changes: 34 additions & 0 deletions docs/admin/integrations/slurpit_setup.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Slurpit Integration Setup

This guide will walk you through steps to set up Slurpit integration with the `nautobot_ssot` app.

## Prerequisites

Before configuring the integration, please ensure, that `nautobot-ssot` app was [installed with Slurpit integration extra dependencies](../install.md#install-guide).

```shell
pip install nautobot-ssot[slurpit]
```

## Configuration

Access to your Slurpit instance is defined using the [ExternalIntegration](https://docs.nautobot.com/projects/core/en/stable/user-guide/platform-functionality/externalintegration/) model which allows you to utilize this integration with multiple instances concurrently. Each ExternalIntegration must specify a SecretsGroup that contains Secrets that contain the Slurpit token to authenticate against that instance. You can find Secrets and SecretsGroups available under the Secrets menu.

![Slurpit Token](../../images/slurpit_token.png)

![Slurpit SecretsGroup](../../images/slurpit_secretsgroup.png)

Please note that is it imperative for the SecretsGroup used for Slurpit uses HTTP(S) Access type and Token. Also note that the name of the Secrets or SecretsGroup are irrelevant but are recommended to be relevant to the Slurpit instance in question.

Once the SecretsGroup is created you'll need to create the ExternalIntegration. You'll find this under the Extensibility menu.

![Slurpit ExternalIntegration](../../images/slurpit_externalintegration.png)

Below is an example snippet from `nautobot_config.py` that demonstrates how to enable and configure the Slurpit integration:

```python
PLUGINS_CONFIG = {
"nautobot_ssot": {
"enable_slurpit": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_SLURPIT")),
}
```
Loading

0 comments on commit 2858221

Please sign in to comment.