{"id":27937401,"url":"https://github.com/tmaestrini/easyprovisioning","last_synced_at":"2025-05-07T07:52:38.889Z","repository":{"id":227676817,"uuid":"727474939","full_name":"tmaestrini/easyProvisioning","owner":"tmaestrini","description":"resource provisioning for M365 - made as easy as possible","archived":false,"fork":false,"pushed_at":"2024-11-02T22:15:39.000Z","size":162,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-07T07:52:31.473Z","etag":null,"topics":["microsoft365","powershell","provisioning","sharepoint-online"],"latest_commit_sha":null,"homepage":"","language":"PowerShell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tmaestrini.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-12-04T23:54:40.000Z","updated_at":"2025-03-31T18:02:29.000Z","dependencies_parsed_at":"2024-03-21T13:47:43.832Z","dependency_job_id":"ed3acb0e-b089-4e46-abef-46c30948284c","html_url":"https://github.com/tmaestrini/easyProvisioning","commit_stats":null,"previous_names":["tmaestrini/easyprovisioning"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmaestrini%2FeasyProvisioning","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmaestrini%2FeasyProvisioning/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmaestrini%2FeasyProvisioning/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmaestrini%2FeasyProvisioning/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tmaestrini","download_url":"https://codeload.github.com/tmaestrini/easyProvisioning/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252839277,"owners_count":21812084,"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":["microsoft365","powershell","provisioning","sharepoint-online"],"created_at":"2025-05-07T07:52:38.152Z","updated_at":"2025-05-07T07:52:38.876Z","avatar_url":"https://github.com/tmaestrini.png","language":"PowerShell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# easyProvisioning – resource provisioning made as easy as possible\n\n_easyProvisioning_ offers a quick and easy way to provision site resources and a range of predefined assets in SharePoint Online (SPO). By defining a YAML template that contains all the information about the desired site resources, this method is both a straightforward approach to provisioning and also serves as documentation for the provisioned resources.\n\nUnder the hood, the provisioning engine is powered by the [PnP.Powershell](https://pnp.github.io/powershell/) module and the [PnPProvisioning concept](https://github.com/pnp/PnP-Provisioning-Schema). This provides us with a powerful toolset for setting up and managing all resources that need to be provisioned within M365 – driven by the power of PowerShell 😃.\n\nGive it a try – I'm sure you will like it! 💪\n\n\u003e [!NOTE]\n\u003e 👉 For now, SPO is currently the only targeted service in M365 – but other services can follow.\u003cbr\u003e\n\u003e Any contributors are welcome! 🙌\n\n## Dependencies\n\n![PowerShell](https://img.shields.io/badge/Powershell-7.4.1-blue.svg)\n![PnP.PowerShell](https://img.shields.io/badge/PnP.Powershell-2.4.0-blue.svg)\n![Microsoft.Graph](https://img.shields.io/badge/powershell--yaml-0.4.7-blue.svg)\n\n## Applies to\n\n- [SharePoint Online](https://learn.microsoft.com/en-us/office365/servicedescriptions/sharepoint-online-service-description/sharepoint-online-service-description)\n- [Microsoft 365 tenant](https://docs.microsoft.com/en-us/sharepoint/dev/spfx/set-up-your-developer-tenant)\n\n\u003e Get your own free development tenant by subscribing to [Microsoft 365 developer program](http://aka.ms/o365devprogram)\n\n## Solution\n\n| Solution         | Author(s)                                                      |\n| ---------------- | -------------------------------------------------------------- |\n| easyProvisioning | Tobias Maestrini [@tmaestrini](https://twitter.com/tmaestrini) |\n\n## Version history\n\n| Version | Date           | Comments                                              |\n| ------- | :------------- | :---------------------------------------------------- |\n| 1.0     | November, 2023 | Initial release                                       |\n| 1.1     | March, 2024    | Updated provisioning schema for tenants               |\n| 1.1.1   | April, 2024    | Add reference templates integration                   |\n| 1.1.2   | November, 2024 | Add support for multiple / nested extension templates |\n\n## Disclaimer\n\n**THIS CODE IS PROVIDED _AS IS_ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**\n\n---\n\n## Minimal path to awesome\n\n### Installation\n\n```powershell\nInstall-Module -Name powershell-yaml -Scope CurrentUser\nInstall-Module -Name PnP.PowerShell -RequiredVersion 2.4.0 -Scope CurrentUser\n```\n\n### Generate SharePoint structure\n\nThe resource provisioning generally follows the structure that is defined by the YAML structure within the _template file_ (for reference: see section below).\nSimply start the provisioning process by importing the `Provisioning.psm1` module and then calling the `Start-Provisioning` command as follows:\n\n```powershell\nImport-Module .\\src\\Provisioning.psm1 -Force\nStart-Provisioning -TemplateName \"standard.yml\" #-KeepConnectionsAlive\n\n# To test the \"consistency\" of your template, simply call:\nTest-Template -TemplateName \"standard.yml\"\n```\n\nThe resource provisioning process is idempotent; each defined resource or setting is only provisioned once. You can start the provisioning process as many times you want without expecting any side effects!\n\n### Sync hub navigation from template site\n\nYou can sync any given hub navigation to any given site. Although the provisioning process for creating the SharePoint structure includes this (if defined), the function can also be executed again in a separate step.\n\nThe hub navigation synchronization copies an existing navigation structure from a relative site url (e.g. `/sites/IntranetHome`) that is specified in the template attribute `CopyHubNavigation` in the _template file_ (see section below) and applies it to the target site (that is the site where the template attribute `CopyHubNavigation` was defined). Just make sure that the target site has a proper hub navigation and the relative path to the site url exists. This is really nice – it leads to a consistent navigation experience on all intranet sites!\n\nSimply start the provisioning process by importing the `Provisioning.psm1` module (if not already done so!) and then calling the `Sync-Hubnavigation` command as follows:\n\n```powershell\nImport-Module .\\src\\Provisioning.psm1 -Force\nSync-Hubnavigation -TemplateName \"standard.yml\"\n```\n\n\u003e [!NOTE]\n\u003e The resource provisioning process is idempotent; each defined resource or setting is only provisioned once. You can start the sync process as many times you want without expecting any side effects!\n\n### Create a folder structure for a given site\n\nYou can define any folder structure in a given site. While running the regular provisioning setup (see paragraph «Generate SharePoint structure»), a given folder structure will be created along its optional `Folder` definition in the site scope.\n\n\u003e [!WARNING]\n\u003e Before provisioning any specific folder structure, a connection to the according site (target site) must be established.\n\u003e The site (target site) must match the site identifier in the content structure of the tenant template!\n\nAlthough the provisioning process for creating the SharePoint structure includes this (if defined), the function can also be executed within a desired site in a separate step.\nMake sure to establish a connection to the destination site before you start the generation of the folder structure:\n\n```powershell\n$siteConn = Connect-PnPOnline \"https://yourtenant.sharepoint.com/sites/site\" -Interactive -ReturnConnection\nImport-Module .\\src\\Provisioning.psm1 -Force\nAdd-FolderStructureToLibrary -TemplateName \"standard.yml\" -siteConnection $siteConn\n```\n\n\u003e [!NOTE]\n\u003e The resource provisioning process is idempotent; each defined folder is only provisioned once. You can run the process as many times you want without expecting any side effects!\n\n## The template file (YAML)\n\nTo get your resources provisioned, just write down the structure in one single YAML file.\nAll you have to do is to make sure that your YAML file implements the following schema.\n\nAssuming the file is referenced as `standard.yml` (in the usage example above) and exists under the path `/templates`),\na new SharePoint Communication Site named `One` will be created:\n\n```yaml\nTenant: \u003cyour tenant name\u003e # name can be set according to your needs\n\n# Sharepoint Specific Settings\nSharePoint:\n  TenantId: \u003cthe SharePoint tenant name\u003e # the name of the Sharepoint tenant (e.g. contoso)\n  AdminUpn: \u003cthe admin's UPN\u003e\n\n  Structure:\n    # creates a new hub site ('Hub' is the site type; can also be set to 'Site') with the title 'One'\n    - Hub: One # declare the type either as 'Site' or 'Hub'\n        # the relative site url\n      Url: /sites/TestOne\n      # set to 'Communication', 'Team' or 'SPOTeam' (Modern Team Site w/o M365 Group)\n      Type: Communication\n      # only needed when type is 'Communication'; set it to 'Blank', 'Showcase' or 'Topic'\n      Template: Blank\n      Site Admins: # optional\n      Lcid: 1031  # optional; set to 1031 by default\n      HomepageLayout: Article # optional; set to 'Home' (default), 'Article' or 'SingleWebPartAppPage'\n      ConnectedHubsite:  # optional; set the relative path to the parent hub site\n      CopyHubNavigation: # optional; set the relative path to the hub site from where the navigation structure will be copied\n      Provisioning Template:  # optional; reference any PnP Site Template from your local machine\n      Provisioning Parameters: # optional; gives the possibility to set list template parameters that are used within the provisioning template (must be defined!)\n        # ParameterName1: ParameterOne\n        # ParameterName2: ParameterTwo\n      SharingCapability: # optional; set to 'Disabled', 'ExistingExternalUserSharingOnly', 'ExternalUserAndGuestSharing' or 'ExternalUserSharingOnly'\n      DisableCompanyWideSharingLinks: # optional; set to False (default) or True\n\n      # the content structure (aka assets) of your site\n      Content:\n        # creates a standard document library with title 'One'\n        - DocumentLibrary: One\n          Url: /One # optional; the desired relative url of the document library in the site. If not set, the 'title' of the library will be taken.\n          OnQuickLaunch: True # optional; places a link in the quick launch navigation\n          Provisioning Template:  # optional; reference any PnP List Template (and only list template!) from your local machine\n          Folders: # optional; generates a folder structure (items are folder names)\n            - Alpha:\n                - Alpha.One:\n                    - Alpha.One.1 [Demo 1]:\n                        - One\n                - Alpha.Two\n                - Alpha.Three\n            - Beta:\n                - Beta.One\n                - Beta.Two:\n                    - Beta.Two.1\n                    - Beta.Two.2\n                    - Beta.Two.3\n            - Gamma\n\n        # creates a standard document library with title 'Three'\n        - List: Three\n          Url: /Three # optional; the desired relative url of the document library in the site. If not set, the 'title' of the library will be taken.\n          OnQuickLaunch: True\n          Provisioning Template: # reference any PnP List Template (and only list template!) from your local machine (e.g. tenants/templates/pnp-list-template.xml)\n          Provisioning Parameters: # optional; gives the possibility to set list template parameters that are used within the provisioning template (must be defined!)\n            # ParameterNameA: ParameterOne\n            # ParameterNameB: ParameterTwo\n        # creates a calendar with title 'Four'\n        - EventsList: Four\n          Url: /Four # optional; the desired relative url of the document library in the site. If not set, the 'title' of the library will be taken.\n        # creates a specific media library to store media assets with title 'Five'\n        - MediaLibrary: Five\n          Url: /Five # optional; the desired relative url of the document library in the site. If not set, the 'title' of the library will be taken.\n          OnQuickLaunch: True\n          Folders: # optional; generates a folder structure (items are folder names)\n            - Alpha:\n                - Alpha.One:\n                    - Alpha.One.1 [Demo 1]:\n                        - One\n                - Alpha.Two\n                - Alpha.Three\n            - Beta:\n                - Beta.One\n                - Beta.Two:\n                    - Beta.Two.1\n                    - Beta.Two.2\n                    - Beta.Two.3\n            - Gamma\n    # define the next sites (as many sites as you like)...\n    # - Two: ...\n```\n\n### Support for PnP Provisioning templates\n\nWithin your provisioning template (.yml), you can reference any _PnP template_ according to your needs.\nBy defining an optional attribute `Provisioning Template`, you can pass a reference to a valid _PnP List Template_ or to a _PnP site template_, which resides inside your project structure. Optionally, _provisioning parameters_ can be passed to the provisioning template by defining objects within the `Provisioning Parameters` attribute.\n\nExample: pass aprovisioning template to a site (_PnP site template_):\n\n```yaml\nSharePoint:\n  # \u003ccontent intentionally omitted\u003e\n  Structure:\n    # creates a new hub site ('Hub' is the site type; can also be set to 'Site') with the title 'One'\n    - Hub: One # declare the type either as 'Site' or 'Hub'\n      # \u003ccontent intentionally omitted\u003e\n      Provisioning Template: tenants/templates/pnp-site-template.xml # reference any PnP Site Template from your local machine\n      Provisioning Parameters: # (optional) pass template parameters that are used within the provisioning template (must be defined!)\n        ParameterNameA: ParameterOne\n        ParameterNameB: ParameterTwo\n```\n\nExample: pass a provisioning template to a list or document library (_PnP site template_, especially with `\u003cList\u003e` definition):\n\n```yaml\nSharePoint:\n  # \u003ccontent intentionally omitted\u003e\n  Structure:\n    # \u003ccontent intentionally omitted\u003e\n    Content:\n      - DocumentLibrary: MyDocumentLibrary\n        Provisioning Template: tenants/templates/pnp-doclib-template.xml # reference any PnP Site Template from your local machine\n        Provisioning Parameters: # (optional) pass template parameters that are used within the provisioning template (must be defined!)\n          ParameterNameA: ParameterOne\n          ParameterNameB: ParameterTwo\n      - List: MyCustomList\n        OnQuickLaunch: True\n        Provisioning Template: tenants/templates/pnp-list-template.xml # reference any PnP Site Template from your local machine\n        Provisioning Parameters: # (optional) pass list template parameters that are used within the provisioning template (must be defined!)\n          ParameterNameA: ParameterOne\n          ParameterNameB: ParameterTwo\n```\n\nAn according list template could like the following:\n\n```xml\n\u003cpnp:Provisioning xmlns:pnp=\"http://schemas.dev.office.com/PnP/2021/03/ProvisioningSchema\"\u003e\n  \u003cpnp:Preferences Generator=\"PnP.Framework, Version=1.9.1.0, Culture=neutral, PublicKeyToken=0d501f89f11b748c\" /\u003e\n  \u003cpnp:Templates ID=\"CONTAINER-TEMPLATE-20383B78FCE94E9D95B574CF586C0576\"\u003e\n    \u003cpnp:ProvisioningTemplate ID=\"TEMPLATE-20383B78FCE94E9D95B574CF586C0576\" Version=\"1\" Scope=\"RootSite\"\u003e\n      \u003cpnp:Lists\u003e\n        \u003cpnp:ListInstance Title=\"Tickets\" Description=\"\" DocumentTemplate=\"\" TemplateType=\"100\" Url=\"Lists/Tickets\" EnableVersioning=\"true\" MinorVersionLimit=\"0\" MaxVersionLimit=\"50\" DraftVersionVisibility=\"0\" TemplateFeatureID=\"00bfea71-de22-43b2-a848-c05709900100\" EnableFolderCreation=\"false\" ImageUrl=\"/_layouts/15/images/itgen.gif?rev=47\" IrmExpire=\"false\" IrmReject=\"false\" IsApplicationList=\"false\" ValidationFormula=\"\" ValidationMessage=\"\"\u003e\n          \u003cpnp:ContentTypeBindings\u003e\n            \u003cpnp:ContentTypeBinding ContentTypeID=\"0x01\" Default=\"true\" /\u003e\n            \u003cpnp:ContentTypeBinding ContentTypeID=\"0x0120\" /\u003e\n          \u003c/pnp:ContentTypeBindings\u003e\n          \u003cpnp:Views\u003e\n            \u003cView Name=\"{40AD4F1C-26B8-497E-82AD-55A718663465}\" DefaultView=\"TRUE\" MobileView=\"TRUE\" MobileDefaultView=\"TRUE\" Type=\"HTML\" DisplayName=\"All Items\" Url=\"{site}/Lists/Tickets/AllItems.aspx\" Level=\"1\" BaseViewID=\"1\" ContentTypeID=\"0x\" ImageUrl=\"/_layouts/15/images/generic.png?rev=47\"\u003e\n              \u003cQuery\u003e\n                \u003cOrderBy\u003e\n                  \u003cFieldRef Name=\"DateReported\" Ascending=\"FALSE\" /\u003e\n                \u003c/OrderBy\u003e\n              \u003c/Query\u003e\n              \u003cViewFields\u003e\n                \u003cFieldRef Name=\"LinkTitle\" /\u003e\n                \u003cFieldRef Name=\"Description\" /\u003e\n                \u003cFieldRef Name=\"Priority\" /\u003e\n                \u003cFieldRef Name=\"Status\" /\u003e\n                \u003cFieldRef Name=\"Assignedto0\" /\u003e\n                \u003cFieldRef Name=\"DateReported\" /\u003e\n                \u003cFieldRef Name=\"IssueSource\" /\u003e\n                \u003cFieldRef Name=\"Images\" /\u003e\n                \u003cFieldRef Name=\"Attachments\" /\u003e\n                \u003cFieldRef Name=\"Issueloggedby\" /\u003e\n              \u003c/ViewFields\u003e\n              \u003cRowLimit Paged=\"TRUE\"\u003e30\u003c/RowLimit\u003e\n              \u003cJSLink\u003eclienttemplates.js\u003c/JSLink\u003e\n              \u003cCustomFormatter\u003e\n                \u003c![CDATA[{\n    \"additionalRowClass\": {\n        \"operator\": \":\",\n            \"operands\": [{\n                \"operator\": \"==\",\n                \"operands\": [{\n                    \"operator\": \"toLowerCase\",\n                    \"operands\": [\"[$Status]\"]\n                }, {\n                    \"operator\": \"toLowerCase\",\n                    \"operands\": [\"Blocked\"]\n                }]\n            }, \"sp-css-backgroundColor-errorBackground\", \"\"]\n    },\n    \"rowClassTemplateId\": \"ConditionalView\"\n}]]\u003e\n              \u003c/CustomFormatter\u003e\n              \u003cViewType2\u003eGRIDFIXED\u003c/ViewType2\u003e\n            \u003c/View\u003e\n            \u003cView Name=\"{F2E42828-F4D4-4F6D-85C5-FEAB2AD53CE2}\" Type=\"HTML\" DisplayName=\"Issues grouped by priority\" Url=\"{site}/Lists/Tickets/Issues grouped by priority.aspx\" Level=\"1\" BaseViewID=\"1\" ContentTypeID=\"0x\" ImageUrl=\"/_layouts/15/images/generic.png?rev=47\"\u003e\n              \u003cQuery\u003e\n                \u003cOrderBy\u003e\n                  \u003cFieldRef Name=\"ID\" /\u003e\n                \u003c/OrderBy\u003e\n                \u003cGroupBy\u003e\n                  \u003cFieldRef Name=\"Priority\" Ascending=\"TRUE\" /\u003e\n                \u003c/GroupBy\u003e\n              \u003c/Query\u003e\n              \u003cViewFields\u003e\n                \u003cFieldRef Name=\"LinkTitle\" /\u003e\n                \u003cFieldRef Name=\"Description\" /\u003e\n                \u003cFieldRef Name=\"Priority\" /\u003e\n                \u003cFieldRef Name=\"Status\" /\u003e\n                \u003cFieldRef Name=\"Assignedto0\" /\u003e\n                \u003cFieldRef Name=\"DateReported\" /\u003e\n                \u003cFieldRef Name=\"IssueSource\" /\u003e\n                \u003cFieldRef Name=\"Images\" /\u003e\n                \u003cFieldRef Name=\"Attachments\" /\u003e\n              \u003c/ViewFields\u003e\n              \u003cRowLimit Paged=\"TRUE\"\u003e30\u003c/RowLimit\u003e\n              \u003cJSLink\u003eclienttemplates.js\u003c/JSLink\u003e\n            \u003c/View\u003e\n            \u003cView Name=\"{CE428A11-5432-4DCE-89B9-66930D8AECFB}\" Type=\"HTML\" DisplayName=\"Issues grouped by status\" Url=\"{site}/Lists/Tickets/Issues grouped by status.aspx\" Level=\"1\" BaseViewID=\"1\" ContentTypeID=\"0x\" ImageUrl=\"/_layouts/15/images/generic.png?rev=47\"\u003e\n              \u003cQuery\u003e\n                \u003cOrderBy\u003e\n                  \u003cFieldRef Name=\"ID\" /\u003e\n                \u003c/OrderBy\u003e\n                \u003cGroupBy\u003e\n                  \u003cFieldRef Name=\"Status\" Ascending=\"TRUE\" /\u003e\n                \u003c/GroupBy\u003e\n              \u003c/Query\u003e\n              \u003cViewFields\u003e\n                \u003cFieldRef Name=\"LinkTitle\" /\u003e\n                \u003cFieldRef Name=\"Description\" /\u003e\n                \u003cFieldRef Name=\"Priority\" /\u003e\n                \u003cFieldRef Name=\"Status\" /\u003e\n                \u003cFieldRef Name=\"Assignedto0\" /\u003e\n                \u003cFieldRef Name=\"DateReported\" /\u003e\n                \u003cFieldRef Name=\"IssueSource\" /\u003e\n                \u003cFieldRef Name=\"Images\" /\u003e\n                \u003cFieldRef Name=\"Attachments\" /\u003e\n              \u003c/ViewFields\u003e\n              \u003cRowLimit Paged=\"TRUE\"\u003e30\u003c/RowLimit\u003e\n              \u003cJSLink\u003eclienttemplates.js\u003c/JSLink\u003e\n            \u003c/View\u003e\n            \u003cView Name=\"{5CD0E9E4-7765-4C75-B658-395D9F0959F8}\" Type=\"HTML\" DisplayName=\"Issues grouped by person assigned to\" Url=\"{site}/Lists/Tickets/Issues grouped by person assigned to.aspx\" Level=\"1\" BaseViewID=\"1\" ContentTypeID=\"0x\" ImageUrl=\"/_layouts/15/images/generic.png?rev=47\"\u003e\n              \u003cQuery\u003e\n                \u003cGroupBy\u003e\n                  \u003cFieldRef Name=\"Assignedto0\" Ascending=\"TRUE\" /\u003e\n                \u003c/GroupBy\u003e\n              \u003c/Query\u003e\n              \u003cViewFields\u003e\n                \u003cFieldRef Name=\"LinkTitle\" /\u003e\n                \u003cFieldRef Name=\"Description\" /\u003e\n                \u003cFieldRef Name=\"Priority\" /\u003e\n                \u003cFieldRef Name=\"Status\" /\u003e\n                \u003cFieldRef Name=\"Assignedto0\" /\u003e\n                \u003cFieldRef Name=\"DateReported\" /\u003e\n                \u003cFieldRef Name=\"IssueSource\" /\u003e\n                \u003cFieldRef Name=\"Images\" /\u003e\n                \u003cFieldRef Name=\"Attachments\" /\u003e\n              \u003c/ViewFields\u003e\n              \u003cRowLimit Paged=\"TRUE\"\u003e30\u003c/RowLimit\u003e\n              \u003cJSLink\u003eclienttemplates.js\u003c/JSLink\u003e\n            \u003c/View\u003e\n          \u003c/pnp:Views\u003e\n          \u003cpnp:Fields\u003e\n          \u003c!-- intentionally omitted --\u003e\n          \u003c/pnp:Fields\u003e\n          \u003cpnp:FieldRefs\u003e\n            \u003cpnp:FieldRef ID=\"76d13cd2-1bae-45a5-8b74-545b87b65037\" Name=\"_ColorTag\" DisplayName=\"Color Tag\" /\u003e\n          \u003c/pnp:FieldRefs\u003e\n        \u003c/pnp:ListInstance\u003e\n      \u003c/pnp:Lists\u003e\n    \u003c/pnp:ProvisioningTemplate\u003e\n  \u003c/pnp:Templates\u003e\n\u003c/pnp:Provisioning\u003e\n```\n\n### Integrate sub structures into your tenant templates\n\nIn order to structure or modularize your tenant structure, you can divide a basic structure into a _main definition template_ and one or many _extension template(s)_.\nTherefore, you simply have to integrate the _extension template(s)_ in the _main definition template_ by referencing all relative paths (from the project's root) as a list within the `contains` attribute.\n\n\u003e [!NOTE]\n\u003e Every _extension template_ is a fully functional tenant template file (.yml), which could work as a standalone template definition. As it will be included in the _main definition template_, the `AdminUpn` property will have no effect (you can drop this attribute).\n\nYour _main definition template_ must look like this in the first definition rows:\n\n```yaml\nTenant: \u003cyour tenant name\u003e # name can be set according to your needs\n\n# optional; define a list that contains the relative paths (from the root) to every settings file which contains additional provisioning settings that should be applied to the current site\nContains: \n  - tenants/templates/hr.yml\n\nSharePoint:\n  TenantId: \u003cthe SharePoint tenant name\u003e # the name of the Sharepoint tenant (e.g. contoso)\n# further structure omitted\n```\n\nThe _extension template_ file can contain any structure along your needs.\n\n\u003e [!NOTE]\n\u003e To make use of the _extension template(s)_, make sure that the name of the SharePoint tenant (`TenantId`) in the _extension template_ matches exactly the tenant's name in the main definition template.\n\nExample structure of the _extension template_ `tenants/templates/hr.yml`:\n\n```yaml\nTenant: \u003cyour tenant name\u003e # name can be set according to your needs\n\n# optionally could include further extension templates (remove the attribute if it does not contain any further templates)\nContains: \n  - tenants/templates/hr-subsites.yml\n\n# Sharepoint Specific Settings\nSharePoint:\n  TenantId: \u003cthe SharePoint tenant name\u003e # the name of the Sharepoint tenant (e.g. contoso) must match the tenant's name in the main definition template\n\n  Structure:\n    - Site: HR One\n      Url: /sites/HR-One\n      Type: SPOTeam\n      Template: Blank\n      ConnectedHubsite: /sites/HR\n\n    - Site: HR Two\n      Url: /sites/HR-Two\n      Type: SPOTeam\n      Template: Blank\n      ConnectedHubsite: /sites/HR\n\n    - Site: HR Three\n      Url: /sites/HR-Three\n      Type: SPOTeam\n      Template: Blank\n      ConnectedHubsite: /sites/HR\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftmaestrini%2Feasyprovisioning","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftmaestrini%2Feasyprovisioning","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftmaestrini%2Feasyprovisioning/lists"}