In this Cloud Assembly design example, you start with a cloud template that contains only minimal WordPress resources, such as having only one application server.
Cloud Assembly is an infrastructure-as-code tool.You drag resources to the design canvas to get started.Then, you complete the details using the code editor to the right of the canvas.
The code editor allows you to type, cut, and paste code directly.If you’re uncomfortable editing code, you can select a resource in the canvas, click the code editor property tab, and enter values there.Values that you enter appear in the code as if you had typed them directly.
Procedure
- Go to and click .
- Name the cloud template WordPress - BP.
- Select the WordPress project, and click Create.
- From the resources on the left of the cloud template design page, drag two cloud agnostic machines onto the canvas.
The machines serve as WordPress application server (WebTier) and MySQL database server (dbtier).
- On the right, edit the machine YAML code to add names, images, flavors, and constraint tags:
resources: WebTier: type : Cloud . machine property : name: wordpress image: ubuntu flavor: small constraint : - tag : env : dev dbtier: type: Cloud.Machine properties: name: mysql image: ubuntu flavor: small constraint : - tag : env : dev - Drag a cloud agnostic network to the canvas, and edit its code:
WP-Network-Private: type : Cloud . network property : name: WP-Network-Private networkType: existing - Connect the machines to the network:
In thecanvas, hover over the network block, click and hold the bubble where the line touches the block, drag to a machine block, and release.
When you create the connection lines, note that network code is automatically added to the machines in the editor.
- Add user input prompting.
In some places, the example infrastructure was set up for multiple options.For example:
- Cloud zone environment for development , test , and production
- Flavor mappings for small, medium, and large machines
You might set a specific option directly in the cloud template, but a better approach is to let the user select the option at template deployment time.Prompting for user input lets you create one template that can be deployed many ways, instead of having many hard-coded templates.
- Create an
inputssection in the code so that users can select machine size and target environment at deployment time.Define the selectable values: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 - In the
resourcessection is add of the code , add${input.}code to prompt for the user selection:resources: WebTier: type : Cloud . machine property : name: wordpress image: ubuntu flavor : ' $ { input.size } ' constraint : -tag : ' $ { input.env } ' networks: - network: '${resource["WP-Network-Private"].id}' dbtier: type: Cloud.Machine properties: name: mysql image: ubuntu flavor : ' $ { input.size } ' constraint : -tag : ' $ { input.env } ' networks: - network: '${resource["WP-Network-Private"].id}' WP-Network-Private: type : Cloud . network property : name: WP-Network-Private networkType: existing
- Finally, enhance the
WebTieranddbtiercode using the following examples.TheWP-Network-Privatecode does not need additional changes.Note that the enhancements include login access to the database server and deployment-time cloudConfig initialization scripts.
Component Example Additional dbtier Inputs username : type : string minlength : 4 maxlength : 20 pattern : ' [ a - z]+ ' title : Database Username description : database username userpassword : type : string pattern : ' [ a - z0 - 9A - Z@#$]+ ' encrypt : true title : Database Password description : Database Passworddbtier Resource 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: []WebTier Resource 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
example : complete basic cloud template code example
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@#$]+ '
encrypt : 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
What to do next
Test the cloud template by checking the syntax and deploying it.
© Copyright notes
The copyright of the article belongs to the author, please do not reprint without permission.
Related posts
No comments...