En este ejemplo de diseño de Cloud Assembly, comenzará con una plantilla de nube que contenga solo recursos de WordPress mínimos, como un solo servidor de aplicaciones.
Cloud Assembly es una herramienta de infraestructura como código. Puede arrastrar recursos al lienzo de diseño para comenzar. A continuación, complete los detalles con el editor de código a la derecha del lienzo.
El editor de código permite escribir, cortar y pegar código de forma directa. Si no se siente cómodo editando código, puede seleccionar un recurso en el lienzo, hacer clic en la pestaña Propiedades del editor de código e introducir los valores allí. Los valores que introduzca aparecerán en el código como si los hubiera escrito directamente.
Procedimiento
- Vaya a y haga clic en .
- Asigne el nombre WordPress-BP a la plantilla de nube.
- Seleccione el proyecto WordPress y haga clic en Crear.
- Desde los recursos de la izquierda de la página de diseño de plantillas de nube, arrastre dos máquinas independientes de la nube al lienzo.
Las máquinas funcionan como servidor de aplicaciones de WordPress (WebTier) y servidor de base de datos MySQL (DBTier).
- En la parte derecha, edite el código YAML de la máquinas para agregar nombres, imágenes, tipos y etiquetas de restricción:
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
- Arrastre una red independiente de la nube al lienzo y edite su código:
WP-Network-Private:
type: Cloud.Network
properties:
name: WP-Network-Private
networkType: existing
- Conecte las máquinas a la red:
En el lienzo, pase el cursor sobre el bloque de red, haga clic y sostenga la burbuja donde la línea toque el bloque, arrástrela hasta un bloque de máquina y suéltela.
Al crear las líneas de conexión, tenga en cuenta que el código de red se agrega automáticamente a las máquinas del editor.
- Agregue la solicitud de entrada del usuario.
En algunos lugares, la infraestructura de ejemplo se configuró para varias opciones. Por ejemplo:
- Entornos de zona de nube para desarrollo, prueba y producción.
- Asignaciones de tipo para máquinas pequeñas, medianas y grandes.
Puede establecer una opción específica directamente en la plantilla de nube, pero un mejor enfoque es permitir que el usuario seleccione la opción en el momento de la implementación de la plantilla. Solicitar la entrada del usuario permite crear una plantilla que se puede implementar de muchas maneras, en lugar de tener muchas plantillas codificadas de forma rígida.
- Cree una sección
inputs
en el código para que los usuarios puedan seleccionar el tamaño de la máquina y el entorno de destino en el momento de la implementación. Defina los valores que se pueden seleccionar:
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
- En la sección
resources
del código, agregue el código ${input.input-name}
para solicitar la selección del usuario:
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
- Por último, mejore el código de
WebTier
y DBTier
con los siguientes ejemplos. El código de WP-Network-Private
no necesita cambios adicionales.
Tenga en cuenta que las mejoras incluyen el acceso de inicio de sesión al servidor de base de datos y los scripts de inicialización de cloudConfig en el tiempo de implementación.
Componente |
Ejemplo |
Entradas de DBTier adicionales |
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
|
Recurso de 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: []
|
Recurso de 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
|
Ejemplo: Ejemplo de código de plantilla de nube básica completada
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
Qué hacer a continuación
Para probar la plantilla de nube, compruebe la sintaxis e impleméntela.