{"id":26445585,"url":"https://github.com/cisco-open/ndfc-roles","last_synced_at":"2025-03-18T11:19:31.636Z","repository":{"id":46450975,"uuid":"484638273","full_name":"cisco-open/ndfc-roles","owner":"cisco-open","description":"Roles and example playbooks for creating fabrics with NDFC/DCNM","archived":false,"fork":false,"pushed_at":"2024-07-12T18:36:41.000Z","size":688,"stargazers_count":7,"open_issues_count":0,"forks_count":5,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-07-12T22:15:31.721Z","etag":null,"topics":["ansible","ansible-role","cisco","dcnm","ndfc"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cisco-open.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-04-23T03:44:51.000Z","updated_at":"2024-07-12T18:35:17.000Z","dependencies_parsed_at":"2023-12-11T21:39:54.946Z","dependency_job_id":null,"html_url":"https://github.com/cisco-open/ndfc-roles","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cisco-open%2Fndfc-roles","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cisco-open%2Fndfc-roles/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cisco-open%2Fndfc-roles/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cisco-open%2Fndfc-roles/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cisco-open","download_url":"https://codeload.github.com/cisco-open/ndfc-roles/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244208595,"owners_count":20416110,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ansible","ansible-role","cisco","dcnm","ndfc"],"created_at":"2025-03-18T11:19:30.446Z","updated_at":"2025-03-18T11:19:31.623Z","avatar_url":"https://github.com/cisco-open.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# ndfc-roles\n\nAutomating NDFC using Ansible\n\n## Getting started\n\nThis repo contains Ansible Roles and example playbooks that, together, implement a basic Spine/Leaf VXLAN/EVPN fabric using Cisco's DCNM/NDFC Controller.\n\nTwo identical child fabrics and a multisite domain (MSD) fabric are defined in the Ansible inventory.  The two child fabrics use non-overlapping underlay addressing to facilitate interconnection via a multi-site domain (MSD) fabric, which is also defined in the inventory; specifically, in ``./inventory/group_vars/ndfc/01_fabrics.yml``\n\nThe main playbooks, which create the two fabrics and the MSD fabric are located in this repo's the top-level directory.\n\nRef | Playbook | Description\n--- | -------- | -----------\n1 | ``example_ndfc_rest_fabric_create_easy_fabric_f1.yml`` | creates VXLAN/EVPN fabric f1 without connectivity to an MSD fabric (2x VPC pair per fabric)\n2 | ``example_ndfc_rest_fabric_create_easy_fabric_2.yml`` | creates VXLAN/EVPN fabric f2 without connectivity to an MSD fabric (2x VPC pair per fabric)\n3 | ``example_ndfc_rest_fabric_create_msd_with_children_vpc.yml`` | creates VXLAN/EVPN fabrics f1 and f2, connecting them through an MSD fabric\n4 | ``example_ndfc_rest_fabric_create_msd_with_children.yml`` | Same as 3, but with 2x non-VPC leaf per fabric\n\nYou should use either (1 and 2) OR 3 OR 4 (3 creates 1 and 2, but with MSD connectivity, and 4 creates 3 but with 2x non-VPC leafs instead of 4x leaf as 2x VPC-pairs).  That is, (1 and 2) are mutually exclusive to 3 and 4.\n\nThese playbooks leverage many of the included roles.\n\nThe remaining Roles are offered as examples which either provide extra functionality (e.g. create external fabrics, and service nodes) or facilitate various day2 ops, such as deleting a fabric, etc.\n\n## To clone this repo\n\n```bash\ngit clone https://github.com/allenrobel/ndfc-roles.git\n```\n\n## Dependencies\n\n### Cisco Nexus Dashboard (ND) + Nexus Dashboard Fabric Controller (NDFC)\n\nndfc-roles has been tested with the following ND+NDFC versions\n\nTested | ND       | NDFC        | cisco.dcnm | Result\n------ | -------- | ----------- | ---------- | ------\nYes    |  2.3(1c) | 12.1.2e     | 2.4.0      | [FAIL][2]\nYes    | 2.2(2d)  | 12.1.1e     | 2.4.0      | [FAIL][1]\nYes    | 2.2(1h)  | 12.1.1e     | 2.1.0      | PASS\nYes    | 2.1(2d)  | 12.0.2f     | 2.1.0      | PASS\nYes    | 2.1(2d)  | 12.0.2f     | 2.1.0      | PASS\n\n[1]: ./issues_1.md\n[2]: ./issues_2.md\n\n### cisco.dcnm Ansible Collection Version 2.1.0\n\nThe Ansible Roles in this repo require that version 2.1.0 of the cisco.dcnm Collection be installed.  A ``requirements.yml`` file is included in the top-level directory which will install this collection.  Or you may do so explicitly.  It's recommended to use ``requirements.yml`` as this file may be updated with other dependencies later.\n\nNOTE: Some earlier versions of the cisco.dcnm Ansible Collection are known not to work due to NDFC API changes involving VPC interfaces.\n\n#### Example using ``requirements.yml``\n\n```bash\nansible-galaxy collection install --requirements-file /path/to/this/repo/top-level/requirements.yml\n```\n\n#### Example using explicit Collection\n\n```bash\nansible-galaxy collection install cisco.dcnm\n```\n\n### jmespath\n\nThe Ansible Roles in this repo make extensive use of ``json_query()`` which requires that [jmespath](https://jmespath.org) be installed.  To install (preferably, you're running Ansible within a python virtual environment):\n\n```bash\npip install jmespath\n```\n\n## Ansible Custom Configuration\n\nDCNM/NDFC requires increasing the default timeout for persistent connections from the default of 30 seconds to \u003e= 1000 seconds.  We have provided an ansible.cfg file with the requisite changes in this repo's top-level directory.  If you would rather edit your existing ansible.cfg file (where ever it is), the changes are shown below.\n\n```bash\n[persistent_connection]\ncommand_timeout=1800\nconnect_timeout=1800\n```\n\n### Fabric Characteristics\n\nThe characteristics of the child/site fabrics are as follows (see also the included PDF for a topology).\n\n- 2 spine acting as Route Reflectors for all leaf and border_gateway\n- Either:\n  - 4 VPC leaf (2 VPC pairs using fabric-peering for their virtual peer-link)\n  - Or, 2 non-VPC leaf\n- 2 border_gateway\n- 2 VRF: v1 and v2\n- L3 (ipv4 / ipv6) connectivity between VRF v1 and v2 (symmetric import of route-targets)\n- L2 connectivity within each VRF\n- OSPF underlay\n- VXLAN/EVPN Replication Mode: Ingress\n\nspine and leaf can be added/removed by updating the Ansible inventory described below.\n\n## Ansible Inventory\n\nThe inventory's structure is given below:\n\n```bash\n(py311) ndfc-roles % tree inventory \ninventory\n├── group_vars\n│   ├── README.md\n│   └── ndfc\n│       ├── 00_connection.yml\n│       ├── 01_fabrics.yml\n│       ├── 02_devices.yml\n│       ├── 03_networks.yml\n│       ├── 04_vrfs.yml\n│       ├── 05_vpc.yml\n│       └── 06_service_nodes.yml\n└── hosts\n    └── hosts\n\n4 directories, 9 files\n(py311) ndfc-roles % \n```\n\n### group_vars\n\nTo use these Roles, and example playbooks, you'll update some common variables used across all Roles. These are maintained in ``./inventory/group_vars/ndfc/*.yml`` and include things like: IP addresses of your switches, VRF names, VLAN identifiers, port attachments for networks, VPC peering info and other basic information.\n\nSee the following for details around the modifications required:\n\n[./inventory/group_vars/ndfc/README.md](/inventory/group_vars/README.md)\n\nNext, you'll edit the following to add your NDFC username and password and the username/password for the switches comprising your fabric(s)\n\n[./inventory/group_vars/ndfc/00_connection.yml](/inventory/group_vars/ndfc/00_connection.yml)\n\nIt is recommended (but not mandatory) that you encrypt these passwords.  Below is one way to do this.\n\n### Modify ./inventory/group_vars/ndfc/00_connection.yml\n\n#### Edit ``ansible_password`` (password for NDFC controller) and ``device_password`` (password for NX-OS switches)\n\nAdd ``ansible_password`` and ``device_password`` in encrypted format (or non-encrypted, if you don't care about security).  These are the passwords you use to login to your DCNM/NDFC Controller, and NX-OS switches, respectively.\n\nTo add encrypted passwords for the NDFC controller and NX-OS devices, issue the following from this repo's top-level directory.  The lines containing ``echo`` are to ensure carraige returns are added after each line that ``ansible-vault`` adds.\n\n```bash\ncd /top/level/directory/for/this/repo\nansible-vault encrypt_string 'mySuperSecretNdfcPassword' --name 'ansible_password' \u003e\u003e ./inventory/group_vars/ndfc/00_connection.yml\necho \"\\n\" \u003e\u003e ./inventory/group_vars/ndfc/00_connection.yml\nansible-vault encrypt_string 'mySuperSecretNxosPassword' --name 'device_password' \u003e\u003e ./inventory/group_vars/ndfc/00_connection.yml\necho \"\\n\" \u003e\u003e ./inventory/group_vars/ndfc/00_connection.yml\n```\n\nansible-vault will prompt you for a vault password, which you'll use to decrypt these passwords (using ``ansible-playbook --ask-vault-pass``) when running the example playbooks.\n\nExample:\n\n```bash\n% ansible-vault encrypt_string 'mySuperSecretNdfcPassword' --name 'ansible_password' \u003e\u003e ./inventory/group_vars/ndfc/00_connection.yml\nNew Vault password: \nConfirm New Vault password: \n% echo \"\\n\" \u003e\u003e ./inventory/group_vars/ndfc/00_connection.yml\n% cat ./inventory/group_vars/ndfc/00_connection.yml\nansible_password: !vault |\n          $ANSIBLE_VAULT;1.1;AES256\n          35313565343034623966323832303764633165386439663133323832383336366362663431366565\n          6238373030393562363831616266336464353963393566300a316564663135323263653165393330\n          33353935396462663531323437336366653937326234313866623535313431366534363938633834\n          6563336634653963320a376364323430316134623430636265383561663631343763646465626365\n          36666366333438373537343033393939653830663061623362613439376161626439\n\n% \n```\n\nIf you don't care about security, you can add a non-encrypted password by editing the file directly.\nThe following are example unencrypted passwords for the NDFC controller and NX-OS devices added to this file:\n\n```bash\nansible_password: mySuperSecretNdfcPassword\ndevice_password: mySuperSecretNxosPassword\n```\n\n#### Edit ``ansible_user``\n\nChange ``ansible_user`` in the same file to the username associated with the above password that you're using on DCNM/NDFC.\nChange ``device_username`` in the same file to the username used to login to your NX-OS switches.\n\nExample:\n\n```bash\nansible_user: voldomort\ndevice_username: admin\n```\n\n#### Update ``./inventory/hosts/hosts`` with the IP address of your DCNM/NDFC Controller\n\n```bash\n% cat ./inventory/hosts/hosts \n---\nndfc:\n  hosts:\n    ndfc1:\n      ansible_host: 192.168.1.1\n```\n\n#### To run a playbook if you encrypted your NDFC password\n\n```bash\ncd /top/level/directory/for/this/repo\nansible-playbook example_ndfc_rest_fabric_switch_create_f1.yml --ask-vault-pass -i inventory\n```\n\nWhen prompted, enter the password you used in response to the ansible-vault command in step 1 above.\n\n#### Or, to run a playbook if you didn't encrypt the NDFC password\n\n```bash\ncd /top/level/directory/for/this/repo\nansible-playbook example_ndfc_rest_fabric_switch_create_f1.yml -i inventory\n```\n\n## Roles\n\nRole naming conventions used in this repo.\n\n1. If a Role pushes a specific Ansible state, that state is included in the Role's name.\n2. If a Role requires the user to provide the Ansible state, the Role's name does not include the state.\n3. If a Role uses the NDFC REST API, its name includes ``_rest_`` (e.g. ``ndfc_rest_device_rediscover``)\n\nRole                           | Description\n------------                   | -----------\n[ndfc_device_config_get] | Retrieve local configuration for device, given ``device_name``\n[ndfc_device_deleted] | Delete a device from a fabric, given ``device_name``\n[ndfc_device_deleted_all] | Delete all devices in a fabric, given ``fabric_name``\n[ndfc_device_generated_configs_all_get] | Query and display all populated generated_configs on all devices, given ``fabric_name``\n[ndfc_device_generated_configs_get] | Retrieve device generated configs, given ``device_name``\n[ndfc_device_info_get] | Return info on device from the NDFC controller in var ``device_info``, given ``device_name``\n[ndfc_device_interface_config_all_get] | Retrieve and display interface configuration on all devices in a fabric, given ``fabric_name``, ``interface_name``\n[ndfc_device_ipv4_address_local_get] | Retrieve device ipv4 address from local vars, given ``device_name``\n[ndfc_device_ipv4_address_remote_get] | Retrieve device ipv4 address from NDFC controller, given ``device_name``\n[ndfc_device_list_get] | Retrieve device configuration from the local inventory for all devices in fabric ``fabric_name``\n[ndfc_device_list_merged] | Merge a list of devices into a fabric.\n[ndfc_device_merged] | Merge a device into the topology, given ``device_name``\n[ndfc_device_merged_all] | Merge all devices into a fabric, given ``fabric_name``\n[ndfc_device_model_number_get] | Retrieve device model number ``device_model_number``, given ``device_name``\n[ndfc_device_names_get] | Set a list (``device_names``) of device names matching devices in fabric ``fabric_name`` with role ``role``\n[ndfc_device_serial_number_get] | Retrieve device serial number ``device_serial_number``, given ``fabric_name``, ``device_name``\n[ndfc_fabric_config_get] | Retrieve local configuration for fabric, given ``fabric_name``\n[ndfc_network_config_get] | Retrieve local configuration for network, given ``network_name``\n[ndfc_network_deleted] | Delete a network, given ``fabric_name``, ``network_name``\n[ndfc_network_deleted_all] | Delete all networks within a fabric, given ``fabric_name``\n[ndfc_network_info_get] | Retrieve ``network_info`` dictionary, given ``network_name``\n[ndfc_network_replaced] | Replace network on the NDFC controller with its current local definition, given ``network_name``\n[ndfc_network_replaced_all] | Replace all networks within a fabric with their current local definitions, given ``fabric_name``\n[ndfc_policy_vrf_rt_import_evpn] | Import a vrf's route-targets into another vrf on a single device, given ``device_name``\n[ndfc_policy_vrf_rt_import_evpn_loop] | Import a vrf's route-targets into another vrf on a list of devices, given a list of ``device_name``\n[ndfc_rest_config_deploy] | NDFC REST API POST calls to config-save and config-deploy for a device, given ``device_name``\n[ndfc_rest_config_deploy_all] | NDFC REST API POST calls to config-save and config-deploy for a fabric, given ``fabric_name``\n[ndfc_rest_device_intent_config_get] | Retrieve intended config for ``device_name``\n[ndfc_rest_device_list_by_fabric] | Retrieve list of devices in fabric, given ``fabric_name``\n[ndfc_rest_device_rediscover] | Rediscover device ``device_name`` in fabric ``fabric_name``\n[ndfc_rest_device_set_role] | Set a device's role, given ``device_name``, and ``role``\n[ndfc_rest_fabric_access_mode_get] | Retrieve a fabric's access mode, given ``fabric_name``\n[ndfc_rest_fabric_access_mode_set] | Set a fabric's access mode, given ``fabric_name``, and ``read_only``\n[ndfc_rest_fabric_active_fabrics_get] | Queries NDFC controller for list of active fabrics\n[ndfc_rest_fabric_asn_get] | Retrieve a fabric's BGP ASN, given ``fabric_name``\n[ndfc_rest_fabric_create_easy_fabric] | Create a VXLAN/EVPN (aka EasyFabric in NDFC-speak) fabric ``fabric_name``\n[ndfc_rest_fabric_create_easy_fabric_ebgp] | Create fabric VXLAN/EVPN (aka EasyFabric in NDFC-speak) ``fabric_name`` that supports non-nexus devices\n[ndfc_rest_fabric_create_external] | Create External fabric ``fabric_name``\n[ndfc_rest_fabric_create_lan_classic] | Create Classic LAN fabric ``fabric_name``\n[ndfc_rest_fabric_create_msd] | Create Multi-Site Domain (MSD) fabric ``fabric_name``\n[ndfc_rest_fabric_delete] | Delete a fabric, given ``fabric_name``\n[ndfc_rest_fabric_info_get] | Retrieve a fabric's information from the NDFC controller, given ``fabric_name``\n[ndfc_rest_fabric_msd_child_add] | Add a child fabric to an MSD fabric, given ``child_fabric``, and ``msd_fabric``\n[ndfc_rest_fabric_msd_child_remove] | Remove a child fabric from an MSD fabric, given ``child_fabric``, and ``msd_fabric``\n[ndfc_rest_interface_no_shutdown] | Administratively no shutdown interface, given ``device_name``, ``interface_name``\n[ndfc_rest_interface_shutdown] | Administratively shutdown interface, given ``device_name``, ``interface_name``\n[ndfc_rest_service_node_add] | Add a service node, given ``service_node_name``\n[ndfc_rest_vpc_create] | Create a VPC pair, given ``fabric_name``, ``vpc_name``\n[ndfc_rest_vpc_delete] | Delete a VPC pair, given ``fabric_name``, ``vpc_name``\n[ndfc_rest_vrf_list_by_fabric] | Return list of VRFs in a given fabric in var ``vrf_list``, given ``fabric_name``\n[ndfc_service_node_config_get] | Retrieve local configuration for service node, given ``service_node_name``\n[ndfc_service_node_deleted] | Delete a service node, given ``service_node_name``\n[ndfc_service_node_merged] | Create a service node, given ``service_node_name``\n[ndfc_service_route_peering_config_get] | Retrieve local configuration for service route peering, given ``service_route_peering_name``\n[ndfc_service_route_peering_intra_tenant_fw_merged] | Create intra-tenant service route peering. NOT TESTED.\n[ndfc_vpc_config_get] | Retrieve configuration for ``vpc_name`` from the local inventory\n[ndfc_vpc_interface_merged_all] | Create (merge) all vpc interfaces for a vpc pair, given ``vpc_name``\n[ndfc_vrf_all] | merge/delete all vrfs in a fabric, given ``fabric_name``\n[ndfc_vrf_config_get] | Retrieve local configuration for vrf in json object ``vrf_config``, given ``vrf_name``\n[ndfc_vrf_query] | Retrieve NDFC controller configuration for VRF in json object ``vrf_info``, given ``vrf_name``\n[ndfc_vrf_replaced] | Update (replaced) a vrf, given ``vrf_name``\n\n[ndfc_device_config_get]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_device_config_get\n[ndfc_device_deleted]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_device_deleted\n[ndfc_device_deleted_all]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_device_deleted_all\n[ndfc_device_generated_configs_all_get]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_device_generated_configs_all_get\n[ndfc_device_generated_configs_get]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_device_generated_configs_get\n[ndfc_device_info_get]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_device_info_get\n[ndfc_device_interface_config_all_get]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_device_interface_config_all_get\n[ndfc_device_ipv4_address_local_get]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_device_ipv4_address_local_get\n[ndfc_device_ipv4_address_remote_get]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_device_ipv4_address_remote_get\n[ndfc_device_list_get]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_device_list_get\n[ndfc_device_list_merged]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_device_list_merged\n[ndfc_device_merged]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_device_merged\n[ndfc_device_merged_all]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_device_merged_all\n[ndfc_device_model_number_get]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_device_model_number_get\n[ndfc_device_names_get]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_device_names_get\n[ndfc_device_serial_number_get]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_device_serial_number_get\n[ndfc_fabric_config_get]:  https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_fabric_config_get\n[ndfc_network_config_get]:  https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_network_config_get\n[ndfc_network_deleted]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_network_deleted\n[ndfc_network_deleted_all]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_network_deleted_all\n[ndfc_network_info_get]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_network_info_get\n[ndfc_network_replaced]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_network_replaced\n[ndfc_network_replaced_all]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_network_replaced_all\n[ndfc_policy_vrf_rt_import_evpn]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_policy_vrf_rt_import_evpn\n[ndfc_policy_vrf_rt_import_evpn_loop]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_policy_vrf_rt_import_evpn_loop\n[ndfc_rest_config_deploy]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_rest_config_deploy\n[ndfc_rest_config_deploy_all]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_rest_config_deploy_all\n[ndfc_rest_device_intent_config_get]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_rest_device_intent_config_get\n[ndfc_rest_device_list_by_fabric]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_rest_device_list_by_fabric\n[ndfc_rest_device_rediscover]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_rest_device_rediscover\n[ndfc_rest_device_set_role]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_rest_device_set_role\n[ndfc_rest_fabric_access_mode_get]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_rest_fabric_access_mode_get\n[ndfc_rest_fabric_access_mode_set]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_rest_fabric_access_mode_set\n[ndfc_rest_fabric_active_fabrics_get]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_rest_fabric_active_fabrics_get\n[ndfc_rest_fabric_asn_get]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_rest_fabric_asn_get\n[ndfc_rest_fabric_create_easy_fabric]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_rest_fabric_create_easy_fabric\n[ndfc_rest_fabric_create_easy_fabric_ebgp]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_rest_fabric_create_easy_fabric_ebgp\n[ndfc_rest_fabric_create_external]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_rest_fabric_create_external\n[ndfc_rest_fabric_create_lan_classic]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_rest_fabric_create_lan_classic\n[ndfc_rest_fabric_create_msd]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_rest_fabric_create_msd\n[ndfc_rest_fabric_delete]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_rest_fabric_delete\n[ndfc_rest_fabric_info_get]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_rest_fabric_info_get\n[ndfc_rest_fabric_msd_child_add]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_rest_fabric_msd_child_add\n[ndfc_rest_fabric_msd_child_remove]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_rest_fabric_msd_child_remove\n[ndfc_rest_interface_no_shutdown]: https:////github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_rest_interface_no_shutdown\n[ndfc_rest_interface_shutdown]: https:////github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_rest_interface_shutdown\n[ndfc_rest_service_node_add]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_rest_service_node_add\n[ndfc_rest_vpc_create]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_rest_vpc_create\n[ndfc_rest_vpc_delete]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_rest_vpc_delete\n[ndfc_rest_vrf_list_by_fabric]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_rest_vrf_list_by_fabric\n[ndfc_service_node_config_get]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_service_node_config_get\n[ndfc_service_node_deleted]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_service_node_deleted\n[ndfc_service_node_merged]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_service_node_merged\n[ndfc_service_route_peering_config_get]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_service_route_peering_config_get\n[ndfc_service_route_peering_intra_tenant_fw_merged]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_service_route_peering_intra_tenant_fw_merged\n[ndfc_vpc_config_get]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_vpc_config_get\n[ndfc_vpc_interface_merged_all]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_vpc_interface_merged_all\n[ndfc_vrf_all]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_vrf_all\n[ndfc_vrf_config_get]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_vrf_config_get\n[ndfc_vrf_query]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_vrf_query\n[ndfc_vrf_replaced]: https://github.com/allenrobel/ndfc-roles/tree/master/roles/ndfc_vrf_replaced\n\n### Code of Conduct\n\nThis repository follows the Contributor Covenant [Code of Conduct](https://github.com/allenrobel/ndfc-roles/blob/master/CODE_OF_CONDUCT.md). Please read and familiarize yourself with this document.\n\n### Licensing\n\nGNU General Public License v3.0 or later.\n\nSee [LICENSE](https://www.gnu.org/licenses/gpl-3.0.txt) for full text.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcisco-open%2Fndfc-roles","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcisco-open%2Fndfc-roles","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcisco-open%2Fndfc-roles/lists"}