diff --git a/bundle-windows-rds/FicheWeb.md b/bundle-windows-rds/FicheWeb.md new file mode 100644 index 0000000..a6d86e6 --- /dev/null +++ b/bundle-windows-rds/FicheWeb.md @@ -0,0 +1,31 @@ +--- +############ TODO ################## +layout: applications-fiche +pictonic: true +title: "MyStart" +url: mystart.html +date: 2016-08-11 00:00:00 +date-creation: "11 Aout 2016" +date-maj: "11 Aout 2016" +description: "Cette stack vous permet d'intialiser votre tenant par la création rapide d'une keypair, d'un réseau et d'un security group. Ces ressources sont des pré-requis pour la création d'instances dans le cloud." +github: https://github.com/cloudwatt/applications/tree/master/blueprint-mystart +siteofficiel: https://www.cloudwatt.com/fr/ +sitesupport: https://support.cloudwatt.com/ +composants: + - logo: "" + version: "" +solutions: "MyStart est particulièrement utile pour les solutions Cloudwatt suivantes :" +solutions-list: + - text: "Développement et test" + - text: "Sites et applications à fort trafic" + - text: "Hébergement d'applications métiers" + - text: "Hybridation" + - text: "Big data" +prix: "Gratuit pour le modèle de déploiement + consommation à l'usage" +logo: +blogpost-url: http://dev.cloudwatt.com/fr/blog/MyStart.html +install-url: +comingsoon: false +type: blueprint +categories: ["admin"] +--- diff --git a/bundle-windows-rds/FicheWeb_EN.md b/bundle-windows-rds/FicheWeb_EN.md new file mode 100644 index 0000000..02a180c --- /dev/null +++ b/bundle-windows-rds/FicheWeb_EN.md @@ -0,0 +1,23 @@ +--- +layout: applications-fiche +pictonic: true +title: "Windows RDS" +url: bundle-windows-rds.html +date: 2016-12-23 00:00:00 +date-creation: "December 23, 2016" +date-maj: "December 23, 2016" +description: "This stack helps you initiate a ." +github: https://github.com/cloudwatt/applications/tree/master/bundle-windows-rds +siteofficiel: https://www.cloudwatt.com/en/ +sitesupport: https://support.cloudwatt.com/ +composants: + - logo: "" + version: "" +prix: "Windows Software under Microsoft licensing + Cloudwatt usage fees" +logo: +blogpost-url: http://dev.cloudwatt.com/en/blog/bundle-windows-rds.html +install-url: +comingsoon: false +type: bundle +categories: ["admin"] +--- diff --git a/bundle-windows-rds/README.md b/bundle-windows-rds/README.md new file mode 100644 index 0000000..7d69f89 --- /dev/null +++ b/bundle-windows-rds/README.md @@ -0,0 +1,192 @@ +# 5 Minutes Stacks, épisode XX : Bundle Windows RDS # + +Remote Desktop Services (RDS) est une solution logiciel provenant de Microsoft pour exposer des applications à des utilisateurs sans avoir besoin de les installer sur les ordinateurs des utilisateurs. + +Les applications peuvent être exposées soit à partir des bureaux virtuels (fonctionnalité "Remote Desktops") accédés par le protocole RDP, soit individuellement dans leur propres fenêtres, par le mécanisme de virtulization aplicative (fonctionnalité "RemoteApp"). + + RDS se compose des rôles et fonctionnalités de Windows Server et se base une architecture flexible et puissante. Un ferme RDS implique en même temps un déploiement distribué sur plusieurs serveurs. Pour plus de détails sur les principes et l'architecture RDS, aller à [cet article](https://blogs.technet.microsoft.com/yungchou/2010/01/04/remote-desktop-services-rds-architecture-explained). + +Afin de simplifier drastiquement ce déploiement sur Cloudwatt, nous avons préparé pour vous une stack Heat dédiée. + +Le scénario couvert est la publication (sur internet) de bureaux mobiles sécurisés via une ferme RDS d'essai. Cette configuration d'essai pourra ensuite se faire évoluer dans une ferme de production. + +La stack RDS préparée par Cloudwatt inclut 3 serveurs : + + 1. Contrôleur de Domaine (contenant aussi le rôle de Licence Server RDS) + 2. Serveur RDS Principal : contient les rôles Gateway, Web Access, and Connection Broker + 3. Session Host (hôte de session) #01: un premier serveur d'une pool de machines contenant le rôle Session Host, la configuration de bureau et les applications à exposer à distance. + +Dans la stack proposée, tous les trois serveurs sont basés sur des images Windows Server 2012 R2, avec entre 1 et 2 vCPUs et totalisant 4 vCPUs. En fonction des performances désirées (ex. nombre d'utilisateurs, complexité de l'applicatif), les serveurs sont sujet à une mise à l'échelle (changement de taille des machines). + +## Déploiement de la stack Remote Desktop Services + +Le déploiement se fait de manière très simple, comme pour n'importe quelle autre stack Cloudwatt : en sélectionnant le fichier de configuration de la stack [bundle-windows-rds.heat.yml](bundle-windows-rds.heat.yml) et en remplissant les paramètres associés : + + - key_name: + type: string + description: Le nom d'une KeyPair afin de pouvoir accéder individuellement à distances les instances Windows + - ad_srv_name: + type: string + description : Le nom du serveur Domain Controller (Active Directory) dans la ferme [NE PAS CHANGER, GARDER VALEUR DEFAUT] + default: rds-farm-ad + - rds_gw_name: + type: string + description: Le nom du serveur principal RDS dans la ferme [NE PAS CHANGER, GARDER VALEUR DEFAUT] + default: rds-farm-gw + - rds_shost_name: + type: string + description: Le nom du premier serveur Session Host dans la ferme [NE PAS CHANGER, GARDER VALEUR DEFAUT] + default: rds-farm-sh01 + - rds_shost_image: + type: string + description: L'ID de l'image pour le (premier) serveur Session Host + default: (l'ID de l'image Windows Server 2012 R2 EN) + - domain_name: + type: string + description: Le nom du domaine Active Directory qui sera configuré + default: rdsfarm.local + - domain_netbios: + type: string + description: Le nom NetBios du domaine Active Directory qui sera configuré + default: RDSFARM + - domain_password: + type: string + description: Le mot de passe administratif du domaine Active Directory qui sera configuré + default: Pa$$w0rd + - ad_ip: + type: string + description: L'IP du serveur Controlleur de Domaine (AD) + default: 10.0.250.100 + - floating_network_id: + type: string + description: L'ID du floating network à utiliser pour l'IP public qui sera provisionné + +Avertissement : à ce stade, il faudra garder les valeurs défaut pour certains paramétres dans la stack : ad_srv_name, rds_gw_name, rds_shost_name. + + +Autres valeurs importantes à connaître (utilisées en dur à ce stade) : + +- Nom du compte administrateur de domaine (case insensitive) : Administrator + (Utiliser combiné avec le nom du domaine; ex : rdsfarm\administrator) +- Le mode du domaine : Win2012R2 +- Collection RDS : RDS Demo Collection +- Base de données de domaine : uniquement sur le disque C (C:\Windows\SYSVOL) +- Utilisateur(s) de session RDP : le même = Administrator +- Mot de passe du certificat à installer (voir ci-dessous) : le même (par défaut: Pa$$w0rd) + +Le déploiement dure jusqu'à 10 minutes (attention, même si la stack est marquée comme terminée, la plupart des configurations se passe après cela, au niveau des serveurs). + +## Vérification du déploiement + +Comment vérifier l'état du déploiement ? + +### 1. Connection au portail web RDS de la ferme + +Dans un navigateur, se connecter à l'adresse : +https://[Cloudwatt-public-address]/RDWeb + où "Cloudwatt public address" est le sousdomaine d'adresse publique réservé par Cloudwatt; cela correspond à la valeur de l'IP public fourni par la plateforme Cloudwatt, transformée après le pattern suivant: ip-[N1]-[N2]-[N3]-[N4].rev.cloudwatt.com/RDWeb + +Exemple : https://ip-123-45-67-89.rev.cloudwatt.com/RDWeb + +(Note : vous pourrez accéder aussi l'endpoint via l'IP public directement, mais vous aurez un avertissement/erreur de certificat non valide.) + +A ce point, vous serez redirigé vers la page suivante: + +![RDS Login Page](img/RDSPublicLogin.png) + +Connectez-vous avec les credentiels configurés (par défaut : rdsfarm\administrator | Pa$$w0rd ) et vous arriveres sur le dashboard de RDS Web Access : + +![RDS Logged In Page](img/RDSPublicLogged.png) + +### 2. Installation locale de certificat + +Afin de pouvoir vous connecter à une session RDP de votre ferme RDS depuis une machine hors cloud (plus précisément hors domaine local de la ferme), vous devez installer localement un certificat (fourni par ferme, dans la version initiale). + +L'exemple suivant corespond à une configuration de machine Windows. Vous aurez besoin de droits d'administrateur local sur la machine. + +Une fois la session sur le portail web RDS ouverte, vous pouvez télécharger le certificat à l'adresse : + +https://[Cloudwatt-public-address]/RDWeb/RDSCertificate.pfx + +(adresse typique : +https://ip-123-45-67-89.rev.cloudwatt.com/RDWeb/RDSCertificate.pfx ) + + +Une fois ce fichier téléchargé localement, double-click sur le fichier certificat : + +![Wizard Cert 1](img/CertWiz1.png) + +ATTENTION : Sélectionnez "Ordinateur Local" ("Local Machine" en anglais) et pas "Utilisateur Local" ("Local User") : + +![Wizard Cert 2](img/CertWiz2.png) + +Vous aurez par la suite besoin de confirmer l'action en tant qu'administrateur de la machine. +Confirmez ensuite le chemin du certificat à importer (rien à changer) : + +![Wizard Cert 3](img/CertWiz3.png) + +Tapez ensuite le mot de passe du certificat (le même que celui administratif, par défaut: Pa$$w0rd ) + +![Wizard Cert 4](img/CertWiz4.png) + +Important : ensuite sélectionnez "Placer dans le magasin suivant", puis "Authorités de certification racines de confiance" ("Trusted Root Certificates" en anglais) + +![Wizard Cert 5](img/CertWiz5.png) + +A la fin confirmez tout le processus : + +![Wizard Cert 6](img/CertWiz6.png) + +Après l'importation du certificat, vous aurez la confirmation : + +![Wizard Cert 7](img/CertWiz7.png) + + + +### 3. Démarrage d'une session de bureau à distance (RDP) + +A ce stade vous pourrez profiter de la ferme RDS provisionnée. + +Dans le portail d'accès web RDS, cliquez sur l'icone de la collection "RDS Demo Collection" dans notre cas); vous téléchargerez alors un fichier RDP (nommé typiquement cpub-RDS_Demo_Collect-RDS_Demo_Collect-CmsRdsh.rdp ). + +Ouvrez ce fichier avec une application client RDP : + +![RDP Trust Popup](img/RDPTrustBox.png) + +Une fois sélectionner Connexion, vous devez saisir les credentiels d'utilisateur de session RDS : + +![RDP Logon Popup](img/RDPLogon.png) + +Pour simplicité on utilise les mêmes credentiels que ci-dessus. La première connexion prendra quelques minutes pour le provisionnement : + +![RDP Logon Connecting](img/RDPConnecting.png) + +Si le certificat n'est pas servi d'une authorité de confiance (le cas pour l'installation défaut de cette ferme), le message suivant apparaît : + +![RDP Logon Connecting](img/RDPCertError.png) + +Après ignorer cet avertissement, vous aurez une fenetre de connexion à distance à une session de bureau réservée pour vous dans la ferme : + +![RDP Logged](img/RDPLogged.png) + + + +## [NOTES INTERNES] Sujets en besoin de résolution + +Avant que la ferme soit completement fonctionnelle, un nombre de problèmes devront être résolus : + +1. Securiser les Network Security Groups (dans l'état actuel completement ouverts) +1. Configurer des utilisateurs / groupes / rôles séparés pour les cas d'utilisations (ex. utilisateur de session RDP) +1. Proposer une liste de choix d'images disponibles pour les Session Hosts +1. BUG : Le changement de mot de passe du domaine après le provisionnement ne peut être fait actuellement (erreur "Password must meet complexity requirements" lors de la tentative de changement) +1. Problème de sécurité : les valeurs choisies (les credentiels compris) sont journalisées dans les 'userdata' et logs Cloudbase. +Ceci pourrait être acceptable si le bug antérieur est résolu et si on avertit l'utilisateur dans la documentation de changer le mot de passe toute de suite après le provisionnement de la ferme. +1. Problème d'activation des serveurs AD et Session Host. Le serveur principal (GW) est correctement activé. + +Autres optimisations de la stack vers une utilisation de production seraient à prevoir : +- Adapter la structure de Session Host afin de créer un groupe de ressources élastique (et pouvoir déployer le nombre de serveurs Session Host voulu) +- Fléxibiliser les paramètres de déploiement : existants (noms des serveurs dans la ferme, pas complètement variabilisés) ou nouveaux : + - taille des machines (en dur actuellement), + - chemin de déploiement de la base de domaine, + - autres configurations RDS plus avancées (ex. inclure RemoteApp) + diff --git a/bundle-windows-rds/README_EN.md b/bundle-windows-rds/README_EN.md new file mode 100644 index 0000000..62af9c7 --- /dev/null +++ b/bundle-windows-rds/README_EN.md @@ -0,0 +1,171 @@ +# 5 Minutes Stacks, XX episode : Bundle Windows RDS # +############ TODO ################## + +Remote Desktop Services (RDS) est une solution logiciel provenant de Microsoft pour exposer des applications à des utilisateurs sans avoir besoin de les installer sur les ordinateurs des utilisateurs. + +Les applications peuvent être exposées soit à partir des bureaux virtuels (fonctionnalité "Remote Desktops") accédés par le protocole RDP, soit individuellement dans leur propres fenêtres, par le mécanisme de virtulization aplicative (fonctionnalité "RemoteApp"). + + RDS se compose des rôles et fonctionnalités de Windows Server et se base une architecture flexible et puissante. Un ferme RDS implique en même temps un déploiement distribué sur plusieurs serveurs. Pour plus de détails sur les principes et l'architecture RDS, aller à [cet article](https://blogs.technet.microsoft.com/yungchou/2010/01/04/remote-desktop-services-rds-architecture-explained). + +Afin de simplifier drastiquement ce déploiement sur Cloudwatt, nous avons préparé pour vous une stack Heat dédiée. + +Le scénario couvert est la publication (sur internet) de bureaux mobiles sécurisés via une ferme RDS d'essai. Cette configuration d'essai pourra ensuite se faire évoluer dans une ferme de production. + +La stack RDS inclut 3 serveurs : + + 1. Controller de Domaine (contenant aussi le rôle de Licence Server RDS) + 2. Serveur RDS Principal : contient les rôles Gateway, Web Access, and Connection Broker + 3. Session Host (hôte de session) #01: un premier serveur d'une pool de machines contenant le rôle Session Host, la configuration de bureau et les applications à exposer à distance. + +Dans la stack proposée, tous les trois serveurs sont basés sur des images Windows Server 2012 R2, avec entre 1 et 2 vCPUs et totalisant 4 vCPUs. En fonction des performances désirées (ex. nombre d'utilisateurs, complexité de l'applicatif), les serveurs sont sujet à une mise à l'échelle (changement de taille des machines). + +## Déploiement de la stack Remote Desktop Services + +Le déploiement se fait de manière très simple, comme pour n'importe quelle autre stack Cloudwatt : en sélectionnant le fichier de configuration de la stack [bundle-windows-rds.heat.yml](bundle-windows-rds.heat.yml) et en remplissant les paramètres associés : + + - key_name: + type: string + description: Le nom d'une KeyPair afin de pouvoir accéder individuellement à distances les instances Windows + - ad_srv_name: + type: string + description : Le nom du serveur Domain Controller (Active Directory) dans la ferme [NE PAS CHANGER, GARDER VALEUR DEFAUT] + default: rds-farm-ad + - rds_gw_name: + type: string + description: Le nom du serveur principal RDS dans la ferme [NE PAS CHANGER, GARDER VALEUR DEFAUT] + default: rds-farm-gw + - rds_shost_name: + type: string + description: Le nom du premier serveur Session Host dans la ferme [NE PAS CHANGER, GARDER VALEUR DEFAUT] + default: rds-farm-sh01 + - rds_shost_image: + type: string + description: L'ID de l'image pour le (premier) serveur Session Host + default: (l'ID de l'image Windows Server 2012 R2 EN) + - domain_name: + type: string + description: Le nom du domaine Active Directory qui sera configuré + default: rdsfarm.local + - domain_netbios: + type: string + description: Le nom NetBios du domaine Active Directory qui sera configuré + default: RDSFARM + - domain_password: + type: string + description: Le mot de passe administratif du domaine Active Directory qui sera configuré + default: Pa$$w0rd + - ad_ip: + type: string + description: L'IP du serveur Controlleur de Domaine (AD) + default: 10.0.250.100 + - floating_network_id: + type: string + description: L'ID du floating network à utiliser pour l'IP public qui sera provisionné + +Avertissement : à ce stade, il faudra garder les valeurs défaut pour certains paramétres dans la stack : ad_srv_name, rds_gw_name, rds_shost_name. + + +Autres valeurs importantes à connaître (utilisées en dur à ce stade) : + +- Nom du compte administrateur de domaine (case insensitive) : Administrator + (Utiliser combiné avec le nom du domaine; ex : rdsfarm\administrator) +- Le mode du domaine : Win2012R2 +- Collection RDS : RDS Demo Collection +- Base de données de domaine : uniquement sur le disque C (C:\Windows\SYSVOL) +- Utilisateur(s) de session RDP : le même = Administrator +- Mot de passe du certificat à installer (voir ci-dessous) : le même (par défaut: Pa$$w0rd) + +Le déploiement dure jusqu'à 10 minutes (attention, même si la stack est marquée comme terminée, la plupart des configurations se passe après cela, au niveau des serveurs). + +## Vérification du déploiement + +Comment vérifier l'état du déploiement ? + +### 1. Connection au portail web RDS de la ferme + +Dans un navigateur, se connecter à l'adresse : +https://[Cloudwatt-public-address]/RDWeb + où "Cloudwatt public address" est le sousdomaine d'adresse publique réservé par Cloudwatt; cela correspond à la valeur de l'IP public fourni par la plateforme Cloudwatt, transformée après le pattern suivant: ip-[N1]-[N2]-[N3]-[N4].rev.cloudwatt.com/RDWeb + +Exemple : https://ip-123-45-67-89.rev.cloudwatt.com/RDWeb + +(Note : vous pourrez accéder aussi l'endpoint via l'IP public directement, mais vous aurez un avertissement/erreur de certificat non valide.) + +A ce point, vous serez redirigé vers la page suivante: + +![RDS Login Page](img/RDSPublicLogin.png) + +Connectez-vous avec les credentiels configurés (par défaut : rdsfarm\administrator | Pa$$w0rd ) et vous arriveres sur le dashboard de RDS Web Access : + +![RDS Logged In Page](img/RDSPublicLogged.png) + +### 2. Installation locale de certificat + +Afin de pouvoir vous connecter à une session RDP de votre ferme RDS depuis une machine hors cloud (plus précisément hors domaine local de la ferme), vous devez installer localement un certificat (fourni par ferme, dans la version initiale). + +L'exemple suivant corespond à une configuration de machine Windows. Vous aurez besoin de droits d'administrateur local sur la machine. + +Une fois la session sur le portail web RDS ouverte, vous pouvez télécharger le certificat à l'adresse : + +https://[Cloudwatt-public-address]/RDWeb/RDSCertificate.pfx + +(adresse typique : +https://ip-123-45-67-89.rev.cloudwatt.com/RDWeb/RDSCertificate.pfx ) + + +Une fois ce fichier téléchargé localement, double-click sur le fichier certificat : + +![Wizard Cert 1](img/CertWiz1.png) + +ATTENTION : Sélectionnez "Ordinateur Local" ("Local Machine" en anglais) et pas "Utilisateur Local" ("Local User") : + +![Wizard Cert 2](img/CertWiz2.png) + +Vous aurez par la suite besoin de confirmer l'action en tant qu'administrateur de la machine. +Confirmez ensuite le chemin du certificat à importer (rien à changer) : + +![Wizard Cert 3](img/CertWiz3.png) + +Tapez ensuite le mot de passe du certificat (le même que celui administratif, par défaut: Pa$$w0rd ) + +![Wizard Cert 4](img/CertWiz4.png) + +Important : ensuite sélectionnez "Placer dans le magasin suivant", puis "Authorités de certification racines de confiance" ("Trusted Root Certificates" en anglais) + +![Wizard Cert 5](img/CertWiz5.png) + +A la fin confirmez tout le processus : + +![Wizard Cert 6](img/CertWiz6.png) + +Après l'importation du certificat, vous aurez la confirmation : + +![Wizard Cert 7](img/CertWiz7.png) + + + +### 3. Démarrage d'une session de bureau à distance (RDP) + +A ce stade vous pourrez profiter de la ferme RDS provisionnée. + +Dans le portail d'accès web RDS, cliquez sur l'icone de la collection "RDS Demo Collection" dans notre cas); vous téléchargerez alors un fichier RDP (nommé typiquement cpub-RDS_Demo_Collect-RDS_Demo_Collect-CmsRdsh.rdp ). + +Ouvrez ce fichier avec une application client RDP : + +![RDP Trust Popup](img/RDPTrustBox.png) + +Une fois sélectionner Connexion, vous devez saisir les credentiels d'utilisateur de session RDS : + +![RDP Logon Popup](img/RDPLogon.png) + +Pour simplicité on utilise les mêmes credentiels que ci-dessus. La première connexion prendra quelques minutes pour le provisionnement : + +![RDP Logon Connecting](img/RDPConnecting.png) + +Si le certificat n'est pas servi d'une authorité de confiance (le cas pour l'installation défaut de cette ferme), le message suivant apparaît : + +![RDP Logon Connecting](img/RDPCertError.png) + +Après ignorer cet avertissement, vous aurez une fenetre de connexion à distance à une session de bureau réservée pour vous dans la ferme : + +![RDP Logged](img/RDPLogged.png) diff --git a/bundle-windows-rds/bundle-windows-rds.heat.yml b/bundle-windows-rds/bundle-windows-rds.heat.yml new file mode 100644 index 0000000..fd86e4c --- /dev/null +++ b/bundle-windows-rds/bundle-windows-rds.heat.yml @@ -0,0 +1,296 @@ +# +## +### Written by the CAT (Cloudwatt Automation Team) +## +# +heat_template_version: 2013-05-23 + + +description: RDS test installation + +parameters: + + key_name: + type: string + description: The Name of a KeyPair to enable access to the instances + ad_srv_name: + type: string + description : The name of the Domain Controller (Active Directory) server in the farm + default: rds-farm-ad + rds_gw_name: + type: string + description: The name of the main RDS server in the farm + default: rds-farm-gw + rds_shost_name: + type: string + description: The name of the (first) Session Host server in the farm + default: rds-farm-sh01 + rds_shost_image: + type: string + description: The ID of the image for the Session Host server + default: 2de643b8-3a67-4806-91e6-ec7b221ef22b + domain_name: + type: string + description: The name of the Active Directory domain to be configured + default: rdsfarm.local + domain_netbios: + type: string + description: The NetBios name of the Active Directory domain to be configured + default: RDSFARM + domain_password: + type: string + description: The administrative password of the Active Directory domain to be configured + default: Pa$$w0rd + ad_ip: + type: string + description: The IP of the Domain Controller (AD) server + default: 10.0.250.100 + floating_network_id: + type: string + description: The ID of the floating network to be used for the public (floating) IP which will be provisionned + +resources: + net: + type: OS::Neutron::Net + + subnet: + type: OS::Neutron::Subnet + properties: + network_id: { get_resource: net } + ip_version: 4 + cidr: 10.0.250.0/24 + allocation_pools: + - { start: 10.0.250.100, end: 10.0.250.199 } + dns_nameservers: [ { get_param: ad_ip} ] + + ad_nsg: + type: OS::Neutron::SecurityGroup + properties: + rules: + - { direction: ingress, protocol: TCP } + - { direction: ingress, protocol: UDP } + - { direction: ingress, protocol: ICMP } + - { direction: egress, protocol: ICMP } + - { direction: egress, protocol: TCP } + - { direction: egress, protocol: UDP } + rds_gw_nsg: + type: OS::Neutron::SecurityGroup + properties: + rules: + - { direction: ingress, protocol: TCP } + - { direction: ingress, protocol: UDP } + - { direction: ingress, protocol: ICMP } + - { direction: egress, protocol: ICMP } + - { direction: egress, protocol: TCP } + - { direction: egress, protocol: UDP } + rds_shost_nsg: + type: OS::Neutron::SecurityGroup + properties: + rules: + - { direction: ingress, protocol: TCP } + - { direction: ingress, protocol: UDP } + - { direction: ingress, protocol: ICMP } + - { direction: egress, protocol: ICMP } + - { direction: egress, protocol: TCP } + - { direction: egress, protocol: UDP } + + floating_ip: + type: OS::Neutron::FloatingIP + properties: + floating_network_id: { get_param: floating_network_id } + + + + ad_srv: + type: OS::Nova::Server + properties: + name: { get_param: ad_srv_name } + image: 2de643b8-3a67-4806-91e6-ec7b221ef22b + flavor: n2.cw.standard-1 + key_name: { get_param: key_name } + networks: + - { network: { get_resource: net }, fixed_ip: {get_param: ad_ip } } + security_groups: + - { get_resource: ad_nsg } + user_data: + str_replace: + template: | + #ps1_sysnative + $ErrorActionPreference = 'Stop' + if ((Get-WmiObject Win32_ComputerSystem).domain -eq "WORKGROUP") { + Install-WindowsFeature -Name AD-domain-services -IncludeManagementTools + $user = [ADSI]'WinNT://./Administrator' + $user.SetPassword('domain_password') + Import-Module ADDSDeployment + $safedomainpwd = "domain_password" | ConvertTo-SecureString -AsPlainText -Force + Install-AddsForest ` + -CreateDnsDelegation:$false ` + -DatabasePath "C:\Windows\NTDS" ` + -DomainMode "Win2012R2" ` + -DomainName "domain_name" ` + -DomainNetbiosName "domain_netbios" ` + -ForestMode "Win2012R2" ` + -InstallDns:$true ` + -LogPath "C:\Windows\NTDS" ` + -NoRebootOnCompletion ` + -SysvolPath "C:\Windows\SYSVOL" ` + -SafeModeAdministratorPassword $safedomainpwd ` + -Force:$true + exit 1003 + } + + params: + domain_name: { get_param: domain_name } + domain_netbios: { get_param: domain_netbios } + domain_password: { get_param: domain_password } + + + + + + + rds_shost_srv: + type: OS::Nova::Server + depends_on: ad_srv + properties: + name: { get_param: rds_shost_name } + image: { get_param: rds_shost_image } + flavor: n2.cw.standard-1 + key_name: { get_param: key_name } + networks: + - network: { get_resource: net } + security_groups: + - { get_resource: rds_shost_nsg } + user_data: + str_replace: + template: | + #ps1_sysnative + $ErrorActionPreference = 'Stop' + if ((Get-WmiObject Win32_ComputerSystem).domain -eq "WORKGROUP") { + echo "Waiting for the domain to come up..." + Sleep 240 + echo "Joining domain..." + $password = "domain_password" | ConvertTo-SecureString -asPlainText -Force + $username = "domain_netbios\Administrator" + $credential = New-Object System.Management.Automation.PSCredential($username,$password) + Add-Computer -DomainName "domain_name" -Credential $credential + echo "Domain joined. Will reboot next." + exit 1003 + } + params: + domain_name: { get_param: domain_name } + domain_netbios: { get_param: domain_netbios } + domain_password: { get_param: domain_password } + + + rds_gw_srv: + type: OS::Nova::Server + depends_on: rds_shost_srv + properties: + name: { get_param: rds_gw_name } + image: 2de643b8-3a67-4806-91e6-ec7b221ef22b + flavor: n2.cw.standard-2 + key_name: { get_param: key_name } + networks: + - network: { get_resource: net } + security_groups: + - { get_resource: rds_gw_nsg } + user_data: + str_replace: + template: | + #ps1_sysnative + $ErrorActionPreference="Stop" + + $domain = "domain_name" + $password = "domain_password" + $securePassword = $password | ConvertTo-SecureString -asPlainText -Force + $username = "domain_netbios\Administrator" + $credential = New-Object System.Management.Automation.PSCredential($username,$securePassword) + + if ((Get-WmiObject Win32_ComputerSystem).domain -eq "WORKGROUP") { + echo "Waiting for the domain to come up..." + Sleep 240 + echo "Joining domain..." + Add-Computer -DomainName $domain -Credential $credential + echo "Domain joined. Will reboot next." + exit 1003 + } else { + echo "After joining domain. Waiting for the session host server to come online..." + #Sleep 120 + echo "Schedule execution of the RDP deployment script (in task scheduler)..." + $taskName = "Setup RDS Farm" + $psScript = ` + ' + $ErrorActionPreference="Stop" + import-module RemoteDesktop + + New-SessionDeployment ` + -ConnectionBroker rds-farm-gw.rdsfarm.local ` + -WebAccessServer rds-farm-gw.rdsfarm.local ` + -SessionHost rds-farm-sh01.rdsfarm.local + + $externalFQDN = "ip-" + "ip_floating".Replace(".","-") + ".rev.cloudwatt.com" + + Add-RDServer -Server rds-farm-ad.rdsfarm.local -Role RDS-LICENSING -ConnectionBroker rds-farm-gw.rdsfarm.local + Set-RDLicenseConfiguration -LicenseServer rds-farm-ad.rdsfarm.local -Mode PerUser -ConnectionBroker rds-farm-gw.rdsfarm.local -Force + + Add-RDServer -Server rds-farm-gw.rdsfarm.local -Role RDS-GATEWAY -ConnectionBroker rds-farm-gw.rdsfarm.local -GatewayExternalFqdn $externalFQDN + Set-RDDeploymentGatewayConfiguration -GatewayMode Custom -GatewayExternalFqdn $externalFQDN -LogonMethod Password -UseCachedCredentials $True -BypassLocal $True -ConnectionBroker rds-farm-gw.rdsfarm.local -Force + + $certPath = "C:\Windows\Temp\RDSCertificate.pfx" + + $password = "domain_password" + $securePassword = $password | ConvertTo-SecureString -asPlainText -Force + New-RDCertificate -Role RDWebAccess -DnsName $externalFQDN -Password $securePassword -ExportPath $certPath -ConnectionBroker rds-farm-gw.rdsfarm.local -Force + Set-RDCertificate -Role RDPublishing -Password $securePassword -ImportPath $certPath -ConnectionBroker rds-farm-gw.rdsfarm.local -Force + Set-RDCertificate -Role RDGateway -Password $securePassword -ImportPath $certPath -ConnectionBroker rds-farm-gw.rdsfarm.local -Force + # Set-RDCertificate -Role RDRedirector -Password $securePassword -ImportPath $certPath -ConnectionBroker rds-farm-gw.rdsfarm.local -Force + + $collectionName = "RDS Demo Collection" + + New-RDSessionCollection ` + -CollectionName $collectionName ` + -SessionHost rds-farm-sh01.rdsfarm.local ` + -CollectionDescription "Collection exemple pour RDS sur Cloudwatt" ` + -ConnectionBroker rds-farm-gw.rdsfarm.local; + + ## how to publish a RemoteApp application + #New-RDRemoteApp ` + # -Alias Wordpad ` + # -DisplayName WordPad ` + # -FilePath "C:\Program Files\Windows NT\Accessories\wordpad.exe" ` + # -ShowInWebAccess 1 ` + # -collectionname $collectionName ` + # -ConnectionBroker rds-farm-gw.rdsfarm.local; + + ## how to publish the Remote Desktop connection + Set-RDRemoteDesktop -CollectionName $collectionName -ConnectionBroker rds-farm-gw.rdsfarm.local -ShowInWebAccess $True -Force + + cp $certPath C:\windows\Web\RDWeb\Pages + ' + + $scriptPath = "C:\Windows\Temp\installRDS.ps1" + $psScript > $scriptPath + $cmdArgument = "/C ""powershell.exe -NoProfile -Executionpolicy bypass -file $scriptPath""" + $action = New-ScheduledTaskAction -Execute "cmd.exe" -Argument "$cmdArgument > C:\Windows\Temp\installRDS.log 2>&1" + $execTime = (get-date).AddMinutes(1) + $trigger = New-ScheduledTaskTrigger -Once -At $execTime + $settings = New-ScheduledTaskSettingsSet + $task = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings + Register-ScheduledTask -TaskName $taskName -InputObject $task -User $username -Password $password + echo "Task scheduled after a minute. Check the execution in the task Scheduler." + } + + params: + domain_name: { get_param: domain_name } + domain_netbios: { get_param: domain_netbios } + domain_password: { get_param: domain_password } + ip_floating: { get_attr: [floating_ip, floating_ip_address]} + + + + floating_ip_link: + type: OS::Nova::FloatingIPAssociation + properties: + floating_ip: { get_resource: floating_ip } + server_id: { get_resource: rds_gw_srv } \ No newline at end of file diff --git a/bundle-windows-rds/img/CertWiz1.png b/bundle-windows-rds/img/CertWiz1.png new file mode 100644 index 0000000..d55645e Binary files /dev/null and b/bundle-windows-rds/img/CertWiz1.png differ diff --git a/bundle-windows-rds/img/CertWiz2.png b/bundle-windows-rds/img/CertWiz2.png new file mode 100644 index 0000000..d56e15b Binary files /dev/null and b/bundle-windows-rds/img/CertWiz2.png differ diff --git a/bundle-windows-rds/img/CertWiz3.png b/bundle-windows-rds/img/CertWiz3.png new file mode 100644 index 0000000..77d0768 Binary files /dev/null and b/bundle-windows-rds/img/CertWiz3.png differ diff --git a/bundle-windows-rds/img/CertWiz4.png b/bundle-windows-rds/img/CertWiz4.png new file mode 100644 index 0000000..f1d9cf6 Binary files /dev/null and b/bundle-windows-rds/img/CertWiz4.png differ diff --git a/bundle-windows-rds/img/CertWiz5.png b/bundle-windows-rds/img/CertWiz5.png new file mode 100644 index 0000000..034d293 Binary files /dev/null and b/bundle-windows-rds/img/CertWiz5.png differ diff --git a/bundle-windows-rds/img/CertWiz6.png b/bundle-windows-rds/img/CertWiz6.png new file mode 100644 index 0000000..ccdad30 Binary files /dev/null and b/bundle-windows-rds/img/CertWiz6.png differ diff --git a/bundle-windows-rds/img/CertWiz7.png b/bundle-windows-rds/img/CertWiz7.png new file mode 100644 index 0000000..0ebf57f Binary files /dev/null and b/bundle-windows-rds/img/CertWiz7.png differ diff --git a/bundle-windows-rds/img/RDPCertError.png b/bundle-windows-rds/img/RDPCertError.png new file mode 100644 index 0000000..1d7b0a8 Binary files /dev/null and b/bundle-windows-rds/img/RDPCertError.png differ diff --git a/bundle-windows-rds/img/RDPConnecting.png b/bundle-windows-rds/img/RDPConnecting.png new file mode 100644 index 0000000..8df5cd9 Binary files /dev/null and b/bundle-windows-rds/img/RDPConnecting.png differ diff --git a/bundle-windows-rds/img/RDPLogged.png b/bundle-windows-rds/img/RDPLogged.png new file mode 100644 index 0000000..f360781 Binary files /dev/null and b/bundle-windows-rds/img/RDPLogged.png differ diff --git a/bundle-windows-rds/img/RDPLogon.png b/bundle-windows-rds/img/RDPLogon.png new file mode 100644 index 0000000..888fb3b Binary files /dev/null and b/bundle-windows-rds/img/RDPLogon.png differ diff --git a/bundle-windows-rds/img/RDPTrustBox.png b/bundle-windows-rds/img/RDPTrustBox.png new file mode 100644 index 0000000..979f280 Binary files /dev/null and b/bundle-windows-rds/img/RDPTrustBox.png differ diff --git a/bundle-windows-rds/img/RDSPublicLogged.png b/bundle-windows-rds/img/RDSPublicLogged.png new file mode 100644 index 0000000..7845974 Binary files /dev/null and b/bundle-windows-rds/img/RDSPublicLogged.png differ diff --git a/bundle-windows-rds/img/RDSPublicLogin.png b/bundle-windows-rds/img/RDSPublicLogin.png new file mode 100644 index 0000000..d71ee95 Binary files /dev/null and b/bundle-windows-rds/img/RDSPublicLogin.png differ