You can add a cloudConfig section to Cloud Assembly template code, in which you add machine initialization commands that run at deployment time.
cloudConfig command formats
- Linux—initialization commands follow the open cloud-init standard.
- Windows—initialization commands use Cloudbase-init.
Linux cloud-init and Windows Cloudbase-init don't share the same syntax. A cloudConfig section for one operating system won't work in a machine image of the other operating system.
What cloudConfig commands can do
You use initialization commands to automate the application of data or settings at instance creation time, which can customize users, permissions, installations, or any other command-based operations. Examples include:
- Setting a hostname
- Generating and setting up SSH private keys
- Installing packages
Where cloudConfig commands can be added
You can add a cloudConfig section to cloud template code, but you can also add one to a machine image in advance, when configuring infrastructure. Then, all cloud templates that reference the source image get the same initialization.
You might have an image map and a cloud template where both contain initialization commands. At deployment time, the commands merge, and Cloud Assembly runs the consolidated commands.
When the same command appears in both places but includes different parameters, only the image map command is run.
See Learn more about image mappings in vRealize Automation for additional details.
Syntax in cloudConfig commands
Faulty cloudConfig commands can result in a resource that isn't correctly configured or behaves unpredictably.
To cancel a deployment when there is a syntax error in #cloud-config
statements, add the following property.
cloudConfigSettings: deploymentFailOnCloudConfigRuntimeError: true
In the following cloud template, the - mkdir
command isn't on a new line under runcmd:
as required, so the directory will never be created. The deploymentFailOnCloudConfigRuntimeError: true
property fails the deployment because of the error.
formatVersion: 1 inputs: {} resources: Cloud_vSphere_Machine_1: type: Cloud.vSphere.Machine properties: image: img1 cpuCount: 1 totalMemoryMB: 1024 cloudConfigSettings: deploymentFailOnCloudConfigRuntimeError: true cloudConfig: | #cloud-config runcmd:- mkdir -p /tmp/test-dir
If you omit the property or set it to false
, deployment continues even if cloudConfig commands fail.
In addition, the property requires the #cloud-config
line. If you omit the line, deployment continues regardless of the property setting.
Correct:
cloudConfigSettings: deploymentFailOnCloudConfigRuntimeError: true cloudConfig: | #cloud-config runcmd:- mkdir -p /tmp/test-dir
Incorrect:
cloudConfigSettings: deploymentFailOnCloudConfigRuntimeError: true cloudConfig: | runcmd:- mkdir -p /tmp/test-dir
Example cloudConfig commands
The following example cloudConfig section is taken from the WordPress use case cloud template code for the Linux-based MySQL server.
To ensure correct interpretation of commands, always include the pipe character cloudConfig: |
as shown.
cloudConfig: | #cloud-config repo_update: true repo_upgrade: all packages: - apache2 - php - php-mysql - libapache2-mod-php - php-mcrypt - mysql-client 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 5 ]; 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 - 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 - service apache2 reload
If a cloud-init script behaves unexpectedly, check the captured console output in /var/log/cloud-init-output.log
when troubleshooting. For more about cloud-init, see the cloud-init documentation.
Commands and customization specifications might not mix
When deploying to vSphere, proceed carefully if you attempt to combine embedded cloudConfig command and customization specification initialization. They aren't formally compatible and might produce inconsistent or unwanted results when used together.
For an example of how commands and customization specifications interact, see vSphere static IP addresses in Cloud Assembly.