可以将 cloudConfig 部分添加到 Cloud Assembly 模板代码中,在其中添加在部署时运行的计算机初始化脚本。

cloudConfig 命令格式

Linux cloud-init 和 Windows Cloudbase-init 不共享相同的语法。一个操作系统的 cloudConfig 部分在其他操作系统的计算机映像中不起作用。

cloudConfig 命令有何作用

您可以使用初始化命令在创建实例时自动应用数据或设置,以自定义用户、权限、安装或任何其他基于命令的操作。示例包括:

  • 设置主机名
  • 生成并设置 SSH 私钥
  • 安装软件包

可以在何处添加 cloudConfig 命令

可以在云模板代码中添加 cloudConfig 部分,但也可以在配置基础架构时提前在计算机映像中添加一个 cloudConfig 部分。之后,引用源映像的所有云模板都将进行相同的初始化。

您可能有一个映像映射和一个云模板,这两者都包含初始化命令。在部署时,这些命令将合并,Cloud Assembly 会运行合并的命令。

当两个位置中出现相同的命令但包含不同的参数时,系统只会运行映像映射命令。

有关更多详细信息,请参见了解有关 vRealize Automation 中的映像映射的更多信息

cloudConfig 命令中的语法

错误的 cloudConfig 命令可能会导致资源配置不正确或行为不可预测。

要在 #cloud-config 语句中出现语法错误时取消部署,请添加以下属性。

      cloudConfigSettings:
        deploymentFailOnCloudConfigRuntimeError: true

在以下云模板中,- mkdir 命令未按要求在 runcmd: 下显示为新的一行,因此永远不会创建目录。由于此错误,deploymentFailOnCloudConfigRuntimeError: true 属性将导致部署失败。

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

如果省略该属性或将其设置为 false,即使 cloudConfig 命令失败,部署也会继续进行。

此外,该属性需要具有 #cloud-config 行。如果省略该行,则无论该属性设置为何,部署都会继续进行。

正确:

      cloudConfigSettings:
        deploymentFailOnCloudConfigRuntimeError: true
      cloudConfig: |
        #cloud-config
        runcmd:- mkdir -p /tmp/test-dir

不正确:

      cloudConfigSettings:
        deploymentFailOnCloudConfigRuntimeError: true
      cloudConfig: |
        runcmd:- mkdir -p /tmp/test-dir

cloudConfig 命令示例

以下示例 cloudConfig 部分取自适用于基于 Linux 的 MySQL 服务器的 WordPress 用例云模板代码。

注:

为确保正确解释命令,请始终包括管道线字符 cloudConfig: |,如下所示。

      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

如果 cloud-init 脚本行为异常,请在故障排除时检查 /var/log/cloud-init-output.log 中捕获的控制台输出。有关 cloud-init 的详细信息,请参见 cloud-init 文档

命令和自定义规范不能混合使用

部署到 vSphere 时,如果尝试结合使用嵌入式 cloudConfig 命令和自定义规范初始化,请小心进行。两者未正式兼容,因此一起使用时可能会产生不一致或不需要的结果。

有关命令和自定义规范如何交互的示例,请参见 Cloud Assembly 中的 vSphere 静态 IP 地址