Presentación del motor de aprovisionamiento PnP

Este artículo presenta el motor de aprovisionamiento PnP, que se publicó en abril de 2015 dentro del proyecto OfficeDev PnP, y que se actualiza mensualmente de acuerdo con la programación de publicación de la biblioteca principal PnP de desarrolladores de Office.

Nota:

El marco de aprovisionamiento de PnP & motor de aprovisionamiento de PnP son soluciones de código abierto con una comunidad activa que proporciona soporte técnico para él. No hay ningún contrato de nivel de servicio para el soporte de la herramienta de código abierto de Microsoft.

El objetivo

Empezaremos desde el objetivo principal de tener un motor de aprovisionamiento. Con la introducción de Microsoft Office 365 y Microsoft SharePoint Online, los desarrolladores tienen el nuevo modelo de complemento de nube como una nueva forma de crear soluciones personalizadas de software para Microsoft SharePoint, SharePoint Online y Office 365 en general. Sin embargo, mientras que en el pasado los desarrolladores aprovisionaban objetos personalizados mediante el marco de características basado en XML y CAML, ya sea con soluciones de código de plena confianza (FTC) o soluciones de espacio aislado, el aprovisionamiento de objetos en el nuevo modelo de complemento de nube debería realizarse con la técnica de "aprovisionamiento remoto". ¿Qué significa hacer aprovisionamiento remoto? Significa usar una de las API disponibles (REST o CSOM) para aprovisionar artefactos en lugar de usar el marco de características.

¿Qué sucede si desea modelar y aprovisionar artefactos mediante un entorno de prueba y de producción, o si desea automatizar el aprovisionamiento de objetos, solo porque desea vender las personalizaciones a varios clientes? Del mismo modo, ¿qué sucede si desea definir una plantilla de sitio personalizada que pueda reutilizar en varias instancias de sitio, como sitios orientados a clientes o sitios de proyecto?

Con el nuevo motor de aprovisionamiento PnP, puede modelar un sitio configurando el diseño de las columnas del sitio, los tipos de contenido, las definiciones de lista, las instancias, las páginas y mucho más, a través del explorador Web. Cuando haya terminado con el diseño, puede exportar lo que ha efectuado en un formato de plantilla de aprovisionamiento (XML, JSON o un formato de contenedor llamado un archivo PnP), y puede aplicar dicha plantilla a tantos sitios de destino como prefiera.

Sin embargo, ¿qué sucede si quisiera aprovisionar otros artefactos como Microsoft Teams? ¿O usuarios de Azure AD? El motor de aprovisionamiento PnP puede hacer el trabajo por usted.

Dos tipos de plantillas

Básicamente, hay dos tipos de plantillas que el motor comprende: las Plantillas de sitio (también llamadas las plantillas de aprovisionamiento) y la versión extendida: las Plantillas de espacio empresarial.

Cuando se presentó el motor, el único tipo de plantilla disponible era la plantilla de sitio. Transcurridos unos años, se presentó la plantilla de espacio empresarial que se distingue de su capacidad para aprovisionar artefactos más allá del ámbito de los sitios de SharePoint. Una plantilla de espacio empresarial por ejemplo le permite aprovisionar un equipo de Microsoft Teams, los usuarios de Azure AD, los diseños de sitio y los scripts de sitio, los temas de ámbito empresarial, etc. A diferencia de las plantillas de sitio, puede crear una "secuencia" denominada en una plantilla de espacio empresarial y crear colecciones de sitios.

Para ser breves: una plantilla de espacio empresarial es una plantilla de sitio que puede contener artefactos para aprovisionar al nivel de espacio empresarial.

Crear una plantilla de sitio

Como ya se ha indicado, la manera más sencilla de crear una plantilla de aprovisionamiento personalizada es crear una nueva colección de sitios en SharePoint Online, configurar los artefactos (columnas de sitio, tipos de contenido, listas, páginas, etc.) y guardar el resultado como una plantilla de aprovisionamiento.

Supongamos que ha definido un sitio de ejemplo con una página principal personalizada:

La página principal de una plantilla de sitio

Además de la Página principal personalizada, creó algunos eventos en la lista de eventos lista para usar:

Eventos personalizados en la lista eventos

Para exportar el sitio como una plantilla de aprovisionamiento, puede usar código de PowerShell o CSOM, con algunos métodos de extensión, que proporciona la biblioteca principal PnP de desarrolladores de Office.

Usar los cmdlets de PowerShell

Nota:

Este artículo se centra en el uso de PowerShell de PnP para funcionar con el motor de aprovisionamiento. Si prefiere el usar C#, consulte motor PNP de aprovisionamiento y la biblioteca principal.

Nota:

PnP PowerShell es una solución de código abierto con una comunidad activa que ofrece su soporte. No hay ningún contrato de nivel de servicio para el soporte de la herramienta de código abierto de Microsoft.

Para usar los cmdlets de PowerShell para SharePoint Online o SharePoint, vaya a información general de PowerShell PnPe instale el módulo de PowerShell PnP de SharePoint.

Después de conectar el entorno de PowerShell a SharePoint Online con el cmdlet Connect-PnPOnline, puede usar el siguiente cmdlet de PowerShell:

Get-PnPSiteTemplate -Out "PnP-Provisioning-File.xml"

El argumento –Out indica al cmdlet dónde guardar la plantilla de aprovisionamiento.

El resultado de extraer y guardar la plantilla está en función de la extensión que utilizó en el cmdlet (admite. XML y . PNP en este momento), un archivo. Si ha seleccionado guardar la plantilla como un archivo XML, se mostrará con aspecto similar al que se muestra a continuación (Observe que la plantilla no se ha completado y es solo un ejemplo de la estructura XML):

Nota:

Hay muchas opciones de configuración para configurar para extraer una plantilla. Para obtener una explicación de esto, consulte Configuración del motor de aprovisionamiento PnP.

   <?xml version="1.0"?>
<pnp:Provisioning xmlns:pnp="http://schemas.dev.office.com/PnP/2019/09/ProvisioningSchema">
  <pnp:Preferences Generator="OfficeDevPnP.Core, Version=3.14.1910.1, Culture=neutral, PublicKeyToken=null" />
  <pnp:Templates ID="CONTAINER-TEMPLATE-8F4D883BE25B442FB9F889C351D3EA0B">
    <pnp:ProvisioningTemplate ID="TEMPLATE-8F4D883BE25B442FB9F889C351D3EA0B" Version="1" BaseSiteTemplate="SITEPAGEPUBLISHING#0" Scope="RootSite">
      <pnp:WebSettings RequestAccessEmail="" NoCrawl="false" WelcomePage="SitePages/Home.aspx" SiteLogo="{hosturl}{site}/SiteAssets/__sitelogo___sitelogo_theperspective.png"/>
      <pnp:Navigation AddNewPagesToNavigation="true" CreateFriendlyUrlsForNewPages="true">
        <pnp:CurrentNavigation NavigationType="StructuralLocal">
          <pnp:StructuralNavigation RemoveExistingNodes="true">
            <pnp:NavigationNode Title="Who we are" Url="http://linkless.header/" IsExternal="true"/>
            <pnp:NavigationNode Title="What's happening" Url="http://linkless.header/" IsExternal="true"/>
            <pnp:NavigationNode Title="Find it" Url="http://linkless.header/" IsExternal="true"/>
          </pnp:StructuralNavigation>
        </pnp:CurrentNavigation>
      </pnp:Navigation>
      <pnp:Lists>
        <pnp:ListInstance Title="Events" Description="" DocumentTemplate="" TemplateType="106" Url="Lists/Events" MinorVersionLimit="0" MaxVersionLimit="0" DraftVersionVisibility="0" TemplateFeatureID="00bfea71-ec85-4903-972d-ebe475780106" ContentTypesEnabled="true" EnableFolderCreation="false" DefaultDisplayFormUrl="{site}/Lists/Events/DispForm.aspx" DefaultEditFormUrl="{site}/Lists/Events/EditForm.aspx" DefaultNewFormUrl="{site}/Lists/Events/NewForm.aspx" ImageUrl="/_layouts/15/images/itevent.png?rev=44" IrmExpire="false" IrmReject="false" IsApplicationList="false" ValidationFormula="" ValidationMessage="">
        </pnp:ListInstance>
        <pnp:DataRows KeyColumn="Title" UpdateBehavior="Overwrite">
          <pnp:DataRow>
            <pnp:DataValue FieldName="Title">Thanksgiving</pnp:DataValue>
            <pnp:DataValue FieldName="fAllDayEvent">true</pnp:DataValue>
            <pnp:DataValue FieldName="EventDate">2019-11-28 00:00:00</pnp:DataValue>
            <pnp:DataValue FieldName="EndDate">2019-11-28 23:59:00</pnp:DataValue>
          </pnp:DataRow>
          <pnp:DataRow>
            <pnp:DataValue FieldName="Title">In the design lab with Carlos Slattery</pnp:DataValue>
            <pnp:DataValue FieldName="Location">Contoso HQ</pnp:DataValue>
            <pnp:DataValue FieldName="fAllDayEvent">false</pnp:DataValue>
            <pnp:DataValue FieldName="EventDate">2020-01-02 10:00:00</pnp:DataValue>
            <pnp:DataValue FieldName="EndDate">2020-01-02 12:00:00</pnp:DataValue>
          </pnp:DataRow>
        </pnp:DataRows>
      </pnp:Lists>
      <pnp:ClientSidePages>
        <pnp:ClientSidePage PromoteAsNewsArticle="false" PromoteAsTemplate="false" Overwrite="true" Layout="Home" EnableComments="false" Title="Home" ThumbnailUrl="" PageName="Home.aspx" LCID="0">
          <pnp:Header Type="Default" LayoutType="FullWidthImage" TextAlignment="Center" ShowTopicHeader="false" ShowPublishDate="false" TopicHeader="" AlternativeText="" Authors="[]" AuthorByLine="[]" AuthorByLineId="-1" />
          <pnp:Sections>
            <pnp:Section Order="1" Type="OneColumnVerticalSection" VerticalSectionEmphasis="Soft">
              <pnp:Controls>
                <pnp:CanvasControl WebPartType="News" JsonControlData="{&quot;id&quot;: &quot;8c88f208-6c77-4bdb-86a0-0c47b4316588&quot;, &quot;instanceId&quot;: &quot;1ac6db3e-eb95-4d5d-a991-28ee34772313&quot;, ..." ControlId="8c88f208-6c77-4bdb-86a0-0c47b4316588" Order="1" Column="1" />
                <pnp:CanvasControl WebPartType="News" JsonControlData="{&quot;id&quot;: &quot;8c88f208-6c77-4bdb-86a0-0c47b4316588&quot;, &quot;instanceId&quot;: &quot;e5fc83c0-3350-4eea-9606-6627646a0a4b&quot;, &quot;title&quot;: &quot;News&quot;, &quot;description&quot;: &quot;..." ControlId="8c88f208-6c77-4bdb-86a0-0c47b4316588" Order="2" Column="1" />
                <pnp:CanvasControl WebPartType="Custom" JsonControlData="{&quot;id&quot;: &quot;868ac3c3-cad7-4bd6-9a1c-14dc5cc8e823&quot;, &quot;instanceId&quot;: &quot;c1524d29-ab2a-44a3-809e-c01c3762c4ee&quot;, &quot;title&quot;: &quot;Weather&quot;, &quot;description&quot;:..." ControlId="868ac3c3-cad7-4bd6-9a1c-14dc5cc8e823" Order="1" Column="2" />
              </pnp:Controls>
            </pnp:Section>
            <pnp:Section Order="2" Type="OneColumn">
              <pnp:Controls>
                <pnp:CanvasControl WebPartType="CallToAction" JsonControlData="{&quot;id&quot;: &quot;df8e44e7-edd5-46d5-90da-aca1539313b8&quot;, &quot;instanceId&quot;: &quot;b022816d-c9de-4989-aa10-9b44bec4a872&quot;, &quot;title&quot;: &quot;Call to action&quot;, &quot;description&quot;: &quot;Call to action&quot;, &quot;dataVersion&..." Order="1" Column="1" />
              </pnp:Controls>
            </pnp:Section>
            <pnp:Section Order="3" Type="ThreeColumn">
              <pnp:Controls>
                <pnp:CanvasControl WebPartType="Image" JsonControlData="{&quot;id&quot;: &quot;d1d91016-032f-456d-98a4-721247c305e8&quot;, &quot;instanceId&quot;: &quot;984b089c-ca62-4f92-89c0-1ce0e1cb6c03&quot;, &quot;title&quot;: &quot;Image&quot;, &quot;description&quot;: &quot;Image&quot;, &quot;dataVersion&quot;: &quot;1.8&quot;, &quot;..." ControlId="d1d91016-032f-456d-98a4-721247c305e8" Order="1" Column="1" />
                <pnp:CanvasControl WebPartType="Text" ControlId="5755396c-b272-4c0f-8e8d-eb41d218a10e" Order="2" Column="1">
                  <pnp:CanvasControlProperties>
                    <pnp:CanvasControlProperty Key="Text" Value="&lt;p&gt;&lt;span class=&quot;fontColorThemePrimary&quot;&gt;&lt;span class=&quot;fontSizeMediumPlus&quot;&gt;&lt;strong&gt;BREATHTAKING VIDEOS &amp;amp; PHOTOS&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xA;&#xA;&lt;p&gt;..." />
                  </pnp:CanvasControlProperties>
                </pnp:CanvasControl>
                <pnp:CanvasControl WebPartType="Button" JsonControlData="{&quot;id&quot;: &quot;0f087d7f-520e-42b7-89c0-496aaf979d58&quot;, &quot;instanceId&quot;: &quot;deb39e2b-11a0-4141-8ac1-1078fe7cc392&quot;, &quot;title&quot;: &quot;..." ControlId="0f087d7f-520e-42b7-89c0-496aaf979d58" Order="3" Column="1" />
                <pnp:CanvasControl WebPartType="Image" JsonControlData="{&quot;id&quot;: &quot;d1d91016-032f-456d-98a4-721247c305e8&quot;, &quot;instanceId&quot;: &quot;e0b59b5b-8a5a-406e-9deb-6e6f9de4bd3b&quot;, &quot;title&quot;: &quot;Image&quot;, ..." ControlId="d1d91016-032f-456d-98a4-721247c305e8" Order="1" Column="2" />
               </pnp:Controls>
            </pnp:Section>
          </pnp:Sections>
        </pnp:ClientSidePage>
      </pnp:ClientSidePages>
      <pnp:Header Layout="Compact" MenuStyle="MegaMenu" BackgroundEmphasis="Strong" />
      <pnp:Footer Enabled="true" RemoveExistingNodes="false" />
    </pnp:ProvisioningTemplate>
  </pnp:Templates>
</pnp:Provisioning>

Como puede ver, los elementos XML son bastante fáciles de entender. El esquema XML que se usa en el ejemplo hace referencia a la versión 201909 del esquema PnP de aprovisionamiento, que se ha definido conjuntamente con la comunidad PnP de SharePoint y que puede encontrarse en GitHub en PnP-Provisioning-Schema. Dentro del mismo repositorio también encontrará un documento que se ha generado automáticamente con Markdown (MD) en el que se describen los principales elementos, tipos y atributos disponibles para definir una plantilla de aprovisionamiento de XML de forma manual.

Puede definir la ProvisioningTemplate manualmente mediante un modelo de sitio o redactando un documento XML que se valide con el esquema XSD de aprovisionamiento PnP, o simplemente escribiendo el código .NET y creando la jerarquía de objetos. Puede incluso realizar una combinación de estos métodos: puede diseñar la plantilla de aprovisionamiento mediante un modelo de sitio, guardarla como un archivo XML y realizar algunas personalizaciones en memoria, mientras maneja la instancia ProvisioningTemplate del código.

Aplicar una plantilla de aprovisionamiento

Ahora que ya sabe lo que es una plantilla de aprovisionamiento, está listo para aplicarla a un sitio de destino.

Supongamos que ya ha creado una nueva colección de sitios de comunicación en SharePoint Online, tal y como se muestra en la siguiente ilustración.

Página para crear una colección de sitios de SharePoint Online

De forma predeterminada, el sitio tendrá un aspecto similar al que se muestra en la siguiente ilustración, que es el diseño predeterminado de un sitio de comunicación.

Página principal de un nuevo sitio de destino

Ahora, puede aplicar una plantilla de sitio personalizada con un cmdlet de PowerShell PnP

Connect-PnPOnline -Url "https://yourtenant.sharepoint.com/sites/targetcommunicationsite"
Invoke-PnPSiteTemplate -Path "PnP-Provisioning-File.xml"

El argumento –Path se refiere al archivo de plantilla de origen, que el cmdlet aplica automáticamente al sitio conectado (implicado en el cmdlet de Connect-PnPOnline).

Nota:

La regla general es que, al aplicar una plantilla de sitio, se debe crear y trabajar en el sitio de destino. Si desea crear el sitio en la marcha por la plantilla, tendrá que crear una plantilla de espacio empresarial. Vea a continuación para obtener más información sobre las plantillas de espacio empresarial.

Aplicar una plantilla de espacio empresarial

Una plantilla de espacio empresarial es muy similar a una plantilla de sitio, con la más de algunos elementos más, de los cuales uno es fundamental: la secuencia.

Una secuencia es una configuración de una o varias colecciones de sitios para crear. Consulte la siguiente plantilla de extracto:

<pnp:Provisioning xmlns:pnp="http://schemas.dev.office.com/PnP/2019/09/ProvisioningSchema" Author="John White" Generator="Human being" Version="1.0" Description="Home Site" DisplayName="The Perspective">
  <pnp:Sequence ID="sequence">
    <pnp:SiteCollections>
      <pnp:SiteCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="pnp:CommunicationSite" ProvisioningId="MAIN" SiteDesign="Topic" Title="My New Site" Description="" Url="/sites/mynewsite" IsHubSite="false" Owner="user@domain.com">
        <pnp:Templates>
          <pnp:ProvisioningTemplateReference ID="MAIN-TEMPLATE"/>
        </pnp:Templates>
      </pnp:SiteCollection>
    </pnp:SiteCollections>
  </pnp:Sequence>
  <pnp:Templates ID="SITE-TEMPLATES">
    <pnp:ProvisioningTemplate ID="MAIN-TEMPLATE" Version="1" BaseSiteTemplate="SITEPAGEPUBLISHING#0" Scope="RootSite">
      <pnp:Header Layout="Compact" MenuStyle="MegaMenu" BackgroundEmphasis="Strong" />

Como puede ver, la secuencia se define en el mismo nivel que el <pnp:Templates /> elemento. Una secuencia puede contener uno o varios sitios, y también puede definir subsitios. Para cada sitio, puede hacer referencia a una o más plantillas para aplicarlas cuando se haya creado el sitio. Se refiere a una plantilla por su identificador y las plantillas se encuentran en este ejemplo en el mismo archivo XML.

Para aplicar una plantilla de espacio empresarial al espacio empresarial que especifique:

Connect-PnPOnline https://yourtenant.sharepoint.com
Invoke-PnPTenantTemplate -Path "yourtenanttemplate.xml"

Para obtener más información sobre las plantillas de espacio empresarial, consulte Plantillas de espacio empresarial de aprovisionamiento PnP.

Temas avanzados

Este es solo un artículo introductorio. Es importante comprender que al usar el motor PnP de aprovisionamiento, también puede aprovisionar taxonomías y usar variables y tokens que se pueden reemplazar en tiempo de ejecución, en función de lo que se aprovisiona (como Id. de lista, parámetros o Id. de términos). Es posible invocar el motor de aprovisionamiento desde servicios de trabajo de temporizador, complementos hospedados por el proveedor, sitios externos y mucho más. Por último, puede usar el motor de aprovisionamiento PnP para mover objetos de entornos prueba o ensayo a entornos de producción.

Asegúrese de consultar los otros artículos para ver más temas avanzados.

Requisitos y resumen

Para jugar con el motor PnP de aprovisionamiento local, tiene que tener como mínimo la actualización acumulativa SharePoint 2013 de marzo 2015 instalado, ya que el motor aprovecha algunas de las funciones del modelo de objetos del lado del cliente que no están disponibles en versiones anteriores del producto. Si el objetivo es SharePoint Online, los requisitos se cumplirán automáticamente gracias al Software como un modelo de servicio.

Juegue con el motor de aprovisionamiento PnP, envíenos sus comentarios y disfrute el futuro del modelo de complementos de SharePoint y el aprovisionamiento remoto.

Vea también