Exemple de piles Heat Fujitsu K5

2016-09-25

Exemple de piles Heat Fujitsu K5

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 :

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 :

stack1stack2stack3

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).

← All posts