Exemple de piles Heat Fujitsu K5
2016-09-25
Machine-translated — the English original is authoritative.
Enfin, je peux publier quelques piles Heat pour la plateforme cloud public OpenStack Fujitsu K5. Les dernières semaines ont été frénétiques, avec très peu de temps pour blogger.
Heat est le projet d'orchestration d'OpenStack et est généralement ce qui doit être utilisé lorsque vous avez besoin de construire rapidement et de manière cohérente un modèle d'infrastructure (template) dans votre cloud IaaS OpenStack K5, ou tout autre cloud OpenStack d'ailleurs. L'avantage, comme vous pouvez le voir ci-dessous, est que le modèle est codé dans un fichier YAML que j'ai stocké sur Github. J'ai désormais la possibilité de contrôler la version de mon infrastructure ainsi que celle de mon code d'application, ce qui devrait se traduire par moins de surprises lors des déploiements de versions testées d'IaC (Infrastructure as Code). C'est une exigence si vous espérez passer à un modèle opérationnel d'intégration continue et de déploiement continu.
Le premier exemple ci-dessous, également disponible ici, construit « automatiquement » l'infrastructure suivante :
- 2 x réseaux L2
- 2 x sous-réseaux
- Note : Des routes supplémentaires ont été ajoutées aux sous-réseaux – elles ne sont pas nécessaires pour cet article
- 1 x serveur Windows
- avec un disque bloc supplémentaire
- script d'initialisation pour configurer et monter le nouveau disque en tant que « D:\ »
- adresse IP attribuée par DHCP
- utilisateur administrateur défini sur k5user
- connecté au réseau de gestion
- 1 x serveur Linux
- avec un disque bloc supplémentaire
- script d'initialisation pour configurer et monter le nouveau disque au moment du déploiement
- attribution d'adresse IP fixe
- utilisateur administrateur défini sur K5user
- connecté au réseau de services partagés
- 2 x groupes de sécurité (SG)
- Avertissement : Ces SG sont OUVERTS – Veuillez vous assurer de configurer ces SG de manière appropriée pour votre environnement.
Exemple – Pile Projet 1
Ce fichier contient des caractères Unicode cachés ou bidirectionnels qui peuvent être interprétés ou compilés différemment de ce qui apparaît ci-dessous. Pour examiner, ouvrez le fichier dans un éditeur qui révèle les caractères Unicode cachés.
En savoir plus sur les caractères Unicode bidirectionnels
Afficher les caractères cachés
| heat_template_version: 2013-05-23 | |
| # Auteur : Graham Land | |
| # Date : 25/09/2016 | |
| # Objectif : Modèle d'infrastructure HOT de démonstration du Projet 1 | |
| # Twitter : @allthingsclowd | |
| # Blog : https://allthingscloud.eu | |
| description : Modèle K5 pour créer un environnement au sein d'un Projet | |
| # Paramètres d'entrée | |
| parameters: | |
| red_image: | |
| type: string | |
| label: Nom ou ID de l'image | |
| description: Image Redhat 7.2 à utiliser pour l'instance de calcul | |
| default: "Red Hat Enterprise Linux 7.2 64bit (English) 01" | |
| win_image: | |
| type: string | |
| label: Nom ou ID de l'image | |
| description: Image Windows Server 2012 R2 SE à utiliser pour l'instance de calcul | |
| default: "Windows Server 2012 R2 SE 64bit (English) 01" | |
| az: | |
| type: string | |
| label: Zone de disponibilité | |
| description: Région AZ à utiliser | |
| default: "uk-1b" | |
| default-sshkey: | |
| type: string | |
| label: clé ssh injectée dans les systèmes linux | |
| description: clé ssh pour les builds linux | |
| default: "demostack" | |
| # Ressources d'infrastructure K5 à construire | |
| resources: | |
| # Créer un nouveau réseau privé | |
| management_net: | |
| type: OS::Neutron::Net | |
| properties: | |
| availability_zone: { get_param: az } | |
| name: "Management" | |
| # Créer un nouveau sous-réseau sur le réseau privé | |
| management_subnet: | |
| type: OS::Neutron::Subnet | |
| depends_on: management_net | |
| properties: | |
| availability_zone: { get_param: az } | |
| name: "Management_Subnet" | |
| network_id: { get_resource: management_net } | |
| cidr: "172.24.201.0/26" | |
| allocation_pools: | |
| – start: "172.24.201.1" | |
| end: "172.24.201.15" | |
| gateway_ip: "172.24.201.62" | |
| host_routes: [{"nexthop": "172.24.200.81", "destination": "172.24.202.0/23"}] | |
| # Créer un nouveau réseau privé | |
| shared_services_net: | |
| type: OS::Neutron::Net | |
| properties: | |
| availability_zone: { get_param: az } | |
| name: "Shared_Services" | |
| # Créer un nouveau sous-réseau sur le réseau privé | |
| shared_services_subnet: | |
| type: OS::Neutron::Subnet | |
| depends_on: shared_services_net | |
| properties: | |
| availability_zone: { get_param: az } | |
| name: "Shared_Services_Subnet" | |
| network_id: { get_resource: shared_services_net } | |
| cidr: "172.24.201.64/26" | |
| gateway_ip: "172.24.201.126" | |
| allocation_pools: | |
| – start: "172.24.201.90" | |
| end: "172.24.201.105" | |
| host_routes: [{"nexthop": "172.24.200.81", "destination": "172.24.202.0/23"}] | |
| # Créer un nouveau routeur | |
| project1_router: | |
| type: OS::Neutron::Router | |
| properties: | |
| availability_zone: { get_param: az } | |
| name: "Project2_Router" | |
| # Connecter une interface sur le sous-réseau du réseau privé au routeur | |
| project1_router_interface1: | |
| type: OS::Neutron::RouterInterface | |
| depends_on: project1_router | |
| properties: | |
| router_id: { get_resource: project1_router } | |
| subnet_id: { get_resource: management_subnet } | |
| # Connecter une interface sur le sous-réseau du réseau privé au routeur | |
| project1_router_interface2: | |
| type: OS::Neutron::RouterInterface | |
| depends_on: project1_router | |
| properties: | |
| router_id: { get_resource: project1_router } | |
| subnet_id: { get_resource: shared_services_subnet } | |
| # Créer un groupe de sécurité | |
| server_security_group1: | |
| type: OS::Neutron::SecurityGroup | |
| properties: | |
| description: Ajouter des règles de groupe de sécurité pour le serveur | |
| name: "Windows_SG" | |
| rules: | |
| – remote_ip_prefix: 0.0.0.0/0 | |
| protocol: udp | |
| – remote_ip_prefix: 0.0.0.0/0 | |
| protocol: tcp | |
| – remote_ip_prefix: 0.0.0.0/0 | |
| protocol: icmp | |
| # Créer un groupe de sécurité | |
| server_security_group2: | |
| type: OS::Neutron::SecurityGroup | |
| properties: | |
| description: Ajouter des règles de groupe de sécurité pour le serveur | |
| name: "Linux_SG" | |
| rules: | |
| – remote_ip_prefix: 0.0.0.0/0 | |
| protocol: udp | |
| – remote_ip_prefix: 0.0.0.0/0 | |
| protocol: tcp | |
| – remote_ip_prefix: 0.0.0.0/0 | |
| protocol: icmp | |
| ################################ Ajout d'un serveur Start ############################## | |
| # Créer un volume de données à utiliser avec le serveur | |
| data_vol_server1: | |
| type: OS::Cinder::Volume | |
| properties: | |
| availability_zone: { get_param: az } | |
| description: Volume de données | |
| name: "data-vol" | |
| size: 50 | |
| volume_type: "M1" | |
| # Créer un volume système à utiliser avec le serveur | |
| sys-vol_server1: | |
| type: OS::Cinder::Volume | |
| properties: | |
| availability_zone: { get_param: az } | |
| name: "boot-vol" | |
| size: 80 | |
| volume_type: "M1" | |
| image : { get_param: win_image } | |
| # Construire un serveur en utilisant le volume système défini ci-dessus | |
| server1: | |
| type: OS::Nova::Server | |
| properties: | |
| key_name: { get_param: default-sshkey } | |
| image: { get_param: win_image } | |
| flavor: "S-4" | |
| admin_user: "k5user" | |
| metadata: { "admin_pass": Password12345 } | |
| block_device_mapping: [{"volume_size": "80", "volume_id": {get_resource: sys-vol_server1}, "delete_on_termination": True, "device_name": "/dev/vda"}] | |
| name: "Hello_Windows_P1" | |
| user_data: | |
| #ps1 | |
| $d = Get-Disk | |
| $d | |
| $d | |
| $p = $d | |
| $p | |
| user_data_format: RAW | |
| networks: ["uuid": {get_resource: management_net} ] | |
| # Attacher le data-vol précédemment défini au serveur | |
| attach_vol1: | |
| type: OS::Cinder::VolumeAttachment | |
| depends_on: [ data_vol_server1, server1 ] | |
| properties: | |
| instance_uuid: {get_resource: server1} | |
| mountpoint: "/dev/vdb" | |
| volume_id: {get_resource: data_vol_server1} | |
| ################################ Ajout d'un serveur End ################################ | |
| ################################ Ajout d'un serveur Start ############################## | |
| # Créer un nouveau port pour l'interface du serveur, attribuer une adresse IP et un groupe de sécurité | |
| server2_port: | |
| type: OS::Neutron::Port | |
| depends_on: [ project1_router_interface2,server_security_group2 ] | |
| properties: | |
| availability_zone: { get_param: az } | |
| network_id: { get_resource: shared_services_net } | |
| security_groups: [{ get_resource: server_security_group2 }] | |
| fixed_ips: | |
| – subnet_id: { get_resource: shared_services_subnet } | |
| ip_address: '172.24.201.66' | |
| # Créer un volume de données à utiliser avec le serveur | |
| data_vol_server2: | |
| type: OS::Cinder::Volume | |
| properties: | |
| availability_zone: { get_param: az } | |
| description: Volume de données | |
| name: "data-vol" | |
| size: 40 | |
| volume_type: "M1" | |
| # Créer un volume système à utiliser avec le serveur | |
| sys-vol_server2: | |
| type: OS::Cinder::Volume | |
| properties: | |
| availability_zone: { get_param: az } | |
| name: "boot-vol" | |
| size: 40 | |
| volume_type: "M1" | |
| image : { get_param: red_image } | |
| # Construire un serveur en utilisant le volume système défini ci-dessus | |
| server2: | |
| type: OS::Nova::Server | |
| depends_on: [ server2_port ] | |
| properties: | |
| key_name: { get_param: default-sshkey } | |
| image: { get_param: red_image } | |
| flavor: "S-2" | |
| block_device_mapping: [{"volume_size": "40", "volume_id": {get_resource: sys-vol_server2}, "delete_on_termination": True, "device_name": "/dev/vda"}] | |
| name: "Hello_Linux_P1" | |
| admin_user: "k5user" | |
| user_data: | |
| str_replace: | |
| template: | |
| #cloud-config | |
| write_files: | |
| – content: | |
| #!/bin/bash | |
| voldata_id=%voldata_id% | |
| voldata_dev="/dev/disk/by-id/virtio-$(echo ${voldata_id} | |
| mkfs.ext4 ${voldata_dev} | |
| mkdir -pv /mnt/appdata | |
| echo "${voldata_dev} /mnt/appdata ext4 defaults 1 2" >> /etc/fstab | |
| mount /mnt/appdata | |
| chmod 0777 /mnt/appdata | |
| path: /tmp/format-disks | |
| permissions: '0700' | |
| runcmd: | |
| – /tmp/format-disks | |
| params: | |
| "%voldata_id%": { get_resource: data_vol_server2 } | |
| user_data_format: RAW | |
| networks: ["uuid": {get_resource: shared_services_net} ] | |
| # Attacher le data-vol précédemment défini au serveur | |
| attach_vol2: | |
| type: OS::Cinder::VolumeAttachment | |
| depends_on: [ data_vol_server2, server2 ] | |
| properties: | |
| instance_uuid: {get_resource: server2} | |
| mountpoint: "/dev/vdb" | |
| volume_id: {get_resource: data_vol_server2} | |
| ################################ Ajout d'un serveur End ################################ | |
voir le code brut
Fujitsu-K5-Example-Heat-Stack-Project1.YAML
hébergé avec ❤ par GitHub
Téléchargez le modèle Heat via l'option Stack dans l'interface graphique K5 IaaS comme suit :



Les piles Heat peuvent également être déployées via l'API – article à suivre.
Exemple – Pile Projet 2
Ce fichier contient des caractères Unicode cachés ou bidirectionnels qui peuvent être interprétés ou compilés différemment de ce qui apparaît ci-dessous. Pour examiner, ouvrez le fichier dans un éditeur qui révèle les caractères Unicode cachés.
En savoir plus sur les caractères Unicode bidirectionnels
Afficher les caractères cachés
| heat_template_version: 2013-05-23 | |
| # Auteur : Graham Land | |
| # Objectif : Démonstration du Projet 2 avec routage inter-projets | |
| # Date : 25/09/2016 | |
| # Twitter : @allthingsclowd | |
| # Blog : https://allthingscloud.eu | |
| description : Modèle Heat de démonstration Fujitsu K5 pour créer un environnement au sein d'un Projet | |
| # Paramètres d'entrée | |
| parameters: | |
| red_image: | |
| type: string | |
| label: Nom ou ID de l'image | |
| description: Image Redhat 7.2 à utiliser pour l'instance de calcul | |
| default: "Red Hat Enterprise Linux 7.2 64bit (English) 01" | |
| win_image: | |
| type: string | |
| label: Nom ou ID de l'image | |
| description: Image Windows Server 2012 R2 SE à utiliser pour l'instance de calcul | |
| default: "Windows Server 2012 R2 SE 64bit (English) 01" | |
| az: | |
| type: string | |
| label: Zone de disponibilité | |
| description: Région AZ à utiliser | |
| default: "uk-1b" | |
| default-sshkey: | |
| type: string | |
| label: clé ssh injectée dans les systèmes linux | |
| description: clé ssh pour les builds linux | |
| default: "demostack" | |
| # Ressources d'infrastructure K5 à construire | |
| resources: | |
| # Créer un nouveau réseau privé | |
| Application_Network_net: | |
| type: OS::Neutron::Net | |
| properties: | |
| availability_zone: { get_param: az } | |
| name: "Application_Network" | |
| # Créer un nouveau sous-réseau sur le réseau privé | |
| Application_Network_subnet: | |
| type: OS::Neutron::Subnet | |
| depends_on: Application_Network_net | |
| properties: | |
| availability_zone: { get_param: az } | |
| name: "Application_Subnet" | |
| network_id: { get_resource: Application_Network_net } | |
| cidr: "172.24.202.0/23" | |
| gateway_ip: "172.24.203.254" | |
| allocation_pools: | |
| – start: "172.24.203.200" | |
| end: "172.24.203.220" | |
| host_routes: [{"nexthop": "172.24.200.81", "destination": "172.24.201.0/26"}, {"nexthop": "172.24.200.81", "destination": "172.24.201.64/26"}] | |
| # Créer un nouveau réseau privé | |
| inter_project_transit_net: | |
| type: OS::Neutron::Net | |
| properties: | |
| availability_zone: { get_param: az } | |
| name: "Inter_Project_Transit" | |
| # Créer un nouveau sous-réseau sur le réseau privé | |
| inter_project_transit_subnet: | |
| type: OS::Neutron::Subnet | |
| depends_on: inter_project_transit_net | |
| properties: | |
| availability_zone: { get_param: az } | |
| name: "P2_Inter_Project_Transit_Subnet" | |
| network_id: { get_resource: inter_project_transit_net } | |
| cidr: "172.24.200.80/28" | |
| gateway_ip: "172.24.200.82" | |
| allocation_pools: | |
| – start: "172.24.200.85" | |
| end: "172.24.200.90" | |
| # Créer un nouveau routeur | |
| project2_router: | |
| type: OS::Neutron::Router | |
| properties: | |
| availability_zone: { get_param: az } | |
| name: "Project2_Router" | |
| # Créer un nouveau port pour les liens d'interface du routeur inter-projets, attribuer une adresse IP | |
| project2_inter_project_transit_port: | |
| type: OS::Neutron::Port | |
| depends_on: [ project2_router ] | |
| properties: | |
| availability_zone: { get_param: az } | |
| network_id: { get_resource: inter_project_transit_net } | |
| fixed_ips: | |
| – subnet_id: { get_resource: inter_project_transit_subnet } | |
| ip_address: '172.24.200.81' | |
| # Connecter une interface sur le sous-réseau du réseau privé au routeur | |
| project2_router_interface1: | |
| type: OS::Neutron::RouterInterface | |
| depends_on: [project2_router,inter_project_transit_subnet] | |
| properties: | |
| router_id: { get_resource: project2_router } | |
| subnet_id: { get_resource: inter_project_transit_subnet } | |
| # Connecter une interface sur le sous-réseau du réseau privé au routeur | |
| project2_router_interface2: | |
| type: OS::Neutron::RouterInterface | |
| depends_on: project2_router | |
| properties: | |
| router_id: { get_resource: project2_router } | |
| subnet_id: { get_resource: Application_Network_subnet } | |
| # Créer un groupe de sécurité | |
| server_security_group1: | |
| type: OS::Neutron::SecurityGroup | |
| properties: | |
| description: Ajouter des règles de groupe de sécurité pour le serveur | |
| name: "Windows_SG" | |
| rules: | |
| – remote_ip_prefix: 0.0.0.0/0 | |
| protocol: udp | |
| – remote_ip_prefix: 0.0.0.0/0 | |
| protocol: tcp | |
| – remote_ip_prefix: 0.0.0.0/0 | |
| protocol: icmp | |
| # Créer un groupe de sécurité | |
| server_security_group2: | |
| type: OS::Neutron::SecurityGroup | |
| properties: | |
| description: Ajouter des règles de groupe de sécurité pour le serveur | |
| name: "Linux_SG" | |
| rules: | |
| – remote_ip_prefix: 0.0.0.0/0 | |
| protocol: udp | |
| – remote_ip_prefix: 0.0.0.0/0 | |
| protocol: tcp | |
| – remote_ip_prefix: 0.0.0.0/0 | |
| protocol: icmp | |
| # Créer un groupe de sécurité | |
| server_security_group3: | |
| type: OS::Neutron::SecurityGroup | |
| properties: | |
| description: Ajouter des règles de groupe de sécurité pour le serveur | |
| name: "InterProject_SG" | |
| rules: | |
| – remote_ip_prefix: 0.0.0.0/0 | |
| protocol: udp | |
| – remote_ip_prefix: 0.0.0.0/0 | |
| protocol: tcp | |
| – remote_ip_prefix: 0.0.0.0/0 | |
| protocol: icmp | |
| ################################ Ajout d'un serveur Start ############################## | |
| # Créer un nouveau port pour l'interface du serveur, attribuer une adresse IP et un groupe de sécurité | |
| server1_port: | |
| type: OS::Neutron::Port | |
| depends_on: [ project2_router,server_security_group1 ] | |
| properties: | |
| availability_zone: { get_param: az } | |
| network_id: { get_resource: Application_Network_net } | |
| security_groups: [{ get_resource: server_security_group1 }] | |
| fixed_ips: | |
| – subnet_id: { get_resource: Application_Network_subnet } | |
| ip_address: '172.24.203.2' | |
| # Créer un volume de données à utiliser avec le serveur | |
| data_vol_server1: | |
| type: OS::Cinder::Volume | |
| properties: | |
| availability_zone: { get_param: az } | |
| description: Volume de données | |
| name: "data-vol" | |
| size: 50 | |
| volume_type: "M1" | |
| # Créer un volume système à utiliser avec le serveur | |
| sys-vol_server1: | |
| type: OS::Cinder::Volume | |
| properties: | |
| availability_zone: { get_param: az } | |
| name: "boot-vol" | |
| size: 40 | |
| volume_type: "M1" | |
| image : { get_param: red_image } | |
| # Construire un serveur en utilisant le volume système défini ci-dessus | |
| server1: | |
| type: OS::Nova::Server | |
| depends_on: [ server1_port ] | |
| properties: | |
| key_name: { get_param: default-sshkey } | |
| image: { get_param: red_image } | |
| flavor: "S-2" | |
| block_device_mapping: [{"volume_size": "40", "volume_id": {get_resource: sys-vol_server1}, "delete_on_termination": True, "device_name": "/dev/vda"}] | |
| name: "Hello_Linux_P2" | |
| admin_user: "k5user" | |
| user_data: | |
| str_replace: | |
| template: | |
| #cloud-config | |
| write_files: | |
| – content: | |
| #!/bin/bash | |
| voldata_id=%voldata_id% | |
| voldata_dev="/dev/disk/by-id/virtio-$(echo ${voldata_id} | |
| mkfs.ext4 ${voldata_dev} | |
| mkdir -pv /mnt/appdata | |
| echo "${voldata_dev} /mnt/appdata ext4 defaults 1 2" >> /etc/fstab | |
| mount /mnt/appdata | |
| chmod 0777 /mnt/appdata | |
| path: /tmp/format-disks | |
| permissions: '0700' | |
| runcmd: | |
| – /tmp/format-disks | |
| params: | |
| "%voldata_id%": { get_resource: data_vol_server1 } | |
| user_data_format: RAW | |
| networks: | |
| – port: { get_resource: server1_port } | |
| # Attacher le data-vol précédemment défini au serveur | |
| attach_vol1: | |
| type: OS::Cinder::VolumeAttachment | |
| depends_on: [ data_vol_server1, server1 ] | |
| properties: | |
| instance_uuid: {get_resource: server1} | |
| mountpoint: "/dev/vdb" | |
| volume_id: {get_resource: data_vol_server1} | |
| ################################ Ajout d'un serveur End ################################ | |
| ################################ Ajout d'un serveur Start ############################## | |
| # Créer un nouveau port pour l'interface du serveur, attribuer une adresse IP et un groupe de sécurité | |
| server2_port: | |
| type: OS::Neutron::Port | |
| depends_on: [ project2_router,server_security_group1 ] | |
| properties: | |
| availability_zone: { get_param: az } | |
| network_id: { get_resource: Application_Network_net } | |
| security_groups: [{ get_resource: server_security_group1 }] | |
| fixed_ips: | |
| – subnet_id: { get_resource: Application_Network_subnet } | |
| ip_address: '172.24.203.3' | |
| # Créer un volume de données à utiliser avec le serveur | |
| data_vol_server2: | |
| type: OS::Cinder::Volume | |
| properties: | |
| availability_zone: { get_param: az } | |
| description: Volume de données | |
| name: "data-vol" | |
| size: 50 | |
| volume_type: "M1" | |
| # Créer un volume système à utiliser avec le serveur | |
| sys-vol_server2: | |
| type: OS::Cinder::Volume | |
| properties: | |
| availability_zone: { get_param: az } | |
| name: "boot-vol" | |
| size: 80 | |
| volume_type: "M1" | |
| image : { get_param: win_image } | |
| # Construire un serveur en utilisant le volume système défini ci-dessus | |
| server2: | |
| type: OS::Nova::Server | |
| depends_on: [ server1,server2_port ] | |
| properties: | |
| key_name: { get_param: default-sshkey } | |
| image: { get_param: win_image } | |
| flavor: "S-4" | |
| admin_user: "k5user" | |
| metadata: { "admin_pass": Password12345 } | |
| block_device_mapping: [{"volume_size": "80", "volume_id": {get_resource: sys-vol_server2}, "delete_on_termination": True, "device_name": "/dev/vda"}] | |
| name: "Hello_Windows_P2" | |
| user_data: | |
| #ps1 | |
| $d = Get-Disk | |
| $d | |
| $d | |
| $p = $d | |
| $p | |
| user_data_format: RAW | |
| networks: | |
| – port: { get_resource: server2_port } | |
| # Attacher le data-vol précédemment défini au serveur | |
| attach_vol2: | |
| type: OS::Cinder::VolumeAttachment | |
| depends_on: [ data_vol_server2, server2 ] | |
| properties: | |
| instance_uuid: {get_resource: server2} | |
| mountpoint: "/dev/vdb" | |
| volume_id: {get_resource: data_vol_server2} | |
| ################################ Ajout d'un serveur End ################################ |
voir le code brut
K5_Project2.yml
hébergé avec ❤ par GitHub
Happy Stacking !
Originally published on allthingscloud.eu (2016-09-25).