Dans cet exemple de conception Cloud Assembly, vous commencez par un modèle de cloud contenant uniquement des ressources WordPress minimales, comme un seul serveur d'applications.
Cloud Assembly est un outil d'infrastructure programmable (Infrastructure as Code, IaC). Pour commencer, vous pouvez faire glisser des ressources jusqu'au canevas de conception. Ensuite, vous indiquez les détails en utilisant l'éditeur de code à droite du canevas.
L'éditeur de code vous permet de taper, couper et coller directement du code. Si vous n'avez pas l'habitude de manipuler du code, vous pouvez sélectionner une ressource dans le canevas, puis cliquer sur l'onglet Propriétés de l'éditeur de code pour y entrer les valeurs. Les valeurs que vous entrez dans cet onglet s'affichent dans le code comme si vous les aviez tapées directement.
Procédure
- Accédez à et cliquez sur .
- Nommez le modèle de cloud WordPress-BP.
- Sélectionnez le projet WordPress, puis cliquez sur Créer.
- À partir des ressources se trouvant sur la gauche de la page de conception des modèles de cloud, faites glisser deux machines indépendantes du cloud jusqu'au canevas.
Les machines servent de serveur d'applications WordPress (WebTier) et de serveur de base de données MySQL (DBTier).
- À droite, modifiez le code YAML de la machine pour y ajouter des noms, des images, des types et des balises de contrainte :
resources:
WebTier:
type: Cloud.Machine
properties:
name: wordpress
image: ubuntu
flavor: small
constraints:
- tag: env:dev
DBTier:
type: Cloud.Machine
properties:
name: mysql
image: ubuntu
flavor: small
constraints:
- tag: env:dev
- Faites glisser un réseau indépendant du cloud jusqu'au canevas et modifiez-en le code :
WP-Network-Private:
type: Cloud.Network
properties:
name: WP-Network-Private
networkType: existing
- Connectez les machines au réseau :
Dans le canevas, passez le curseur sur le bloc réseau, cliquez sur la bulle à l'emplacement où la ligne touche le bloc et, tout en maintenant le bouton enfoncé, faites glisser le pointeur jusqu'à un bloc machine avant de relâcher le bouton.
Lorsque vous créez les lignes de connexion, notez que le code réseau est automatiquement ajouté aux machines dans l’éditeur.
- Ajoutez une invite à la saisie utilisateur.
Dans certains emplacements, l'exemple d'infrastructure a été configuré pour plusieurs options. Par exemple :
- Environnements de zone de cloud pour le développement, le test et la production
- Mappages de type pour les machines de petite, moyenne et grande taille
Vous pouvez définir une option spécifique directement dans le modèle de cloud, mais une meilleure approche consiste à laisser l'utilisateur sélectionner l'option au moment du déploiement du modèle de cloud. L'invite à la saisie utilisateur vous permet de créer un modèle qui peut être déployé de plusieurs façons, au lieu d'avoir plusieurs modèles codés de manière irréversible.
- Dans le code, créez une section
inputs
afin que les utilisateurs puissent sélectionner la taille de la machine et l'environnement cible au moment du déploiement. Définissez les valeurs que les utilisateurs peuvent sélectionner :
inputs:
env:
type: string
enum:
- env:dev
- env:prod
- env:test
default: env:dev
title: Environment
description: Target Environment
size:
type: string
enum:
- small
- medium
- large
description: Size of Nodes
title: Tier Machine Size
- Dans la section
resources
du code, ajoutez le code ${input.input-name}
pour inviter l'utilisateur à effectuer une sélection :
resources:
WebTier:
type: Cloud.Machine
properties:
name: wordpress
image: ubuntu
flavor: '${input.size}'
constraints:
- tag: '${input.env}'
networks:
- network: '${resource["WP-Network-Private"].id}'
DBTier:
type: Cloud.Machine
properties:
name: mysql
image: ubuntu
flavor: '${input.size}'
constraints:
- tag: '${input.env}'
networks:
- network: '${resource["WP-Network-Private"].id}'
WP-Network-Private:
type: Cloud.Network
properties:
name: WP-Network-Private
networkType: existing
- Enfin, améliorez les codes
WebTier
et DBTier
en utilisant les exemples suivants. Le code WP-Network-Private
n'a pas besoin de modifications supplémentaires.
Notez que les améliorations incluent l’accès de connexion au serveur de base de données et les scripts d’initialisation cloudConfig au moment du déploiement.
Composant |
Exemple |
Entrées DBTier supplémentaires |
username:
type: string
minLength: 4
maxLength: 20
pattern: '[a-z]+'
title: Database Username
description: Database Username
userpassword:
type: string
pattern: '[a-z0-9A-Z@#$]+'
encrypted: true
title: Database Password
description: Database Password
|
Ressource DBTier |
DBTier:
type: Cloud.Machine
properties:
name: mysql
image: ubuntu
flavor: '${input.size}'
constraints:
- tag: '${input.env}'
networks:
- network: '${resource["WP-Network-Private"].id}'
assignPublicIpAddress: true
remoteAccess:
authentication: usernamePassword
username: '${input.username}'
password: '${input.userpassword}'
cloudConfig: |
#cloud-config
repo_update: true
repo_upgrade: all
packages:
- mysql-server
runcmd:
- sed -e '/bind-address/ s/^#*/#/' -i /etc/mysql/mysql.conf.d/mysqld.cnf
- service mysql restart
- mysql -e "CREATE USER 'root'@'%' IDENTIFIED BY 'mysqlpassword';"
- mysql -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';"
- mysql -e "FLUSH PRIVILEGES;"
attachedDisks: []
|
Ressource WebTier |
WebTier:
type: Cloud.Machine
properties:
name: wordpress
image: ubuntu
flavor: '${input.size}'
constraints:
- tag: '${input.env}'
networks:
- network: '${resource["WP-Network-Private"].id}'
assignPublicIpAddress: true
cloudConfig: |
#cloud-config
repo_update: true
repo_upgrade: all
packages:
- apache2
- php
- php-mysql
- libapache2-mod-php
- mysql-client
- gcc
- make
- autoconf
- libc-dev
- pkg-config
- libmcrypt-dev
- php-pear
- php-dev
runcmd:
- mkdir -p /var/www/html/mywordpresssite && cd /var/www/html && wget https://wordpress.org/latest.tar.gz && tar -xzf /var/www/html/latest.tar.gz -C /var/www/html/mywordpresssite --strip-components 1
- i=0; while [ $i -le 10 ]; do mysql --connect-timeout=3 -h ${DBTier.networks[0].address} -u root -pmysqlpassword -e "SHOW STATUS;" && break || sleep 15; i=$((i+1)); done
- mysql -u root -pmysqlpassword -h ${DBTier.networks[0].address} -e "create database wordpress_blog;"
- mv /var/www/html/mywordpresssite/wp-config-sample.php /var/www/html/mywordpresssite/wp-config.php
- pecl channel-update pecl.php.net
- pecl update-channels
- pecl install mcrypt
- sed -i -e s/"define( 'DB_NAME', 'database_name_here' );"/"define( 'DB_NAME', 'wordpress_blog' );"/ /var/www/html/mywordpresssite/wp-config.php && sed -i -e s/"define( 'DB_USER', 'username_here' );"/"define( 'DB_USER', 'root' );"/ /var/www/html/mywordpresssite/wp-config.php && sed -i -e s/"define( 'DB_PASSWORD', 'password_here' );"/"define( 'DB_PASSWORD', 'mysqlpassword' );"/ /var/www/html/mywordpresssite/wp-config.php && sed -i -e s/"define( 'DB_HOST', 'localhost' );"/"define( 'DB_HOST', '${DBTier.networks[0].address}' );"/ /var/www/html/mywordpresssite/wp-config.php
- sed -i '950i extension=mcrypt.so' /etc/php/7.4/apache2/php.ini
- service apache2 reload
|
Exemple : Exemple de code de modèle de cloud de base terminé
formatVersion: 1
inputs:
env:
type: string
enum:
- env:dev
- env:prod
- env:test
default: env:dev
title: Environment
description: Target Environment
size:
type: string
enum:
- small
- medium
- large
description: Size of Nodes
title: Tier Machine Size
username:
type: string
minLength: 4
maxLength: 20
pattern: '[a-z]+'
title: Database Username
description: Database Username
userpassword:
type: string
pattern: '[a-z0-9A-Z@#$]+'
encrypted: true
title: Database Password
description: Database Password
resources:
WebTier:
type: Cloud.Machine
properties:
name: wordpress
image: ubuntu
flavor: '${input.size}'
constraints:
- tag: '${input.env}'
networks:
- network: '${resource["WP-Network-Private"].id}'
assignPublicIpAddress: true
cloudConfig: |
#cloud-config
repo_update: true
repo_upgrade: all
packages:
- apache2
- php
- php-mysql
- libapache2-mod-php
- mysql-client
- gcc
- make
- autoconf
- libc-dev
- pkg-config
- libmcrypt-dev
- php-pear
- php-dev
runcmd:
- mkdir -p /var/www/html/mywordpresssite && cd /var/www/html && wget https://wordpress.org/latest.tar.gz && tar -xzf /var/www/html/latest.tar.gz -C /var/www/html/mywordpresssite --strip-components 1
- i=0; while [ $i -le 10 ]; do mysql --connect-timeout=3 -h ${DBTier.networks[0].address} -u root -pmysqlpassword -e "SHOW STATUS;" && break || sleep 15; i=$((i+1)); done
- mysql -u root -pmysqlpassword -h ${DBTier.networks[0].address} -e "create database wordpress_blog;"
- mv /var/www/html/mywordpresssite/wp-config-sample.php /var/www/html/mywordpresssite/wp-config.php
- pecl channel-update pecl.php.net
- pecl update-channels
- pecl install mcrypt
- sed -i -e s/"define( 'DB_NAME', 'database_name_here' );"/"define( 'DB_NAME', 'wordpress_blog' );"/ /var/www/html/mywordpresssite/wp-config.php && sed -i -e s/"define( 'DB_USER', 'username_here' );"/"define( 'DB_USER', 'root' );"/ /var/www/html/mywordpresssite/wp-config.php && sed -i -e s/"define( 'DB_PASSWORD', 'password_here' );"/"define( 'DB_PASSWORD', 'mysqlpassword' );"/ /var/www/html/mywordpresssite/wp-config.php && sed -i -e s/"define( 'DB_HOST', 'localhost' );"/"define( 'DB_HOST', '${DBTier.networks[0].address}' );"/ /var/www/html/mywordpresssite/wp-config.php
- sed -i '950i extension=mcrypt.so' /etc/php/7.4/apache2/php.ini
- service apache2 reload
DBTier:
type: Cloud.Machine
properties:
name: mysql
image: ubuntu
flavor: '${input.size}'
constraints:
- tag: '${input.env}'
networks:
- network: '${resource["WP-Network-Private"].id}'
assignPublicIpAddress: true
remoteAccess:
authentication: usernamePassword
username: '${input.username}'
password: '${input.userpassword}'
cloudConfig: |
#cloud-config
repo_update: true
repo_upgrade: all
packages:
- mysql-server
runcmd:
- sed -e '/bind-address/ s/^#*/#/' -i /etc/mysql/mysql.conf.d/mysqld.cnf
- service mysql restart
- mysql -e "CREATE USER 'root'@'%' IDENTIFIED BY 'mysqlpassword';"
- mysql -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';"
- mysql -e "FLUSH PRIVILEGES;"
attachedDisks: []
WP-Network-Private:
type: Cloud.Network
properties:
name: WP-Network-Private
networkType: existing
Que faire ensuite
Pour tester le modèle de cloud, vérifiez la syntaxe et déployez-le.