建立並測試範例應用程式的基本 Cloud Assembly 範本後,將其擴充到多層應用程式,該應用程式可部署至開發、測試環境,並最終部署到生產環境。

若要擴充雲端範本,請新增下列增強功能。

  • 用於叢集化應用程式伺服器以增加容量的選項
  • 應用程式伺服器前方的公用網路和負載平衡器
  • 具有封存儲存區的備份伺服器

必要條件

建立基本雲端範本,並對其進行測試。請參閱建立基本雲端範本測試基本雲端範本

程序

  1. 按一下雲端範本,然後開啟 WordPress-BP 雲端範本。
    將在設計畫布和代碼編輯器中顯示基本範本。
  2. 請使用用於指引的代碼範例和圖進行新增和變更。
    您可以使用 GUI 將新資源拖曳至畫布 (例如負載平衡器),然後在代碼編輯器中完成組態。
    1. 新增 count 輸入提示,以使 WordPress 應用程式伺服器加入叢集。
    2. 新增非雲端負載平衡器。
    3. 將負載平衡器連線到 WordPress 應用程式伺服器叢集。
    4. 新增非雲端備份機器。
    5. 將備份機器連線到私人/內部網路。
    6. 新增非雲端公用/外部網路。
    7. 將負載平衡器連線到公用網路。
    8. 新增非雲端儲存磁碟區,以用作封存磁碟。
    9. 將封存磁碟連線到備份機器。
    10. 為儲存區磁碟速度新增 archiveusage 輸入提示。
    11. 為儲存區磁碟大小新增 archiveDiskSize 輸入提示。
      所有資源
  3. 部署、測試和變更的方式與為基本雲端範本執行的操作相同。
    您可以更新現有部署,甚至部署新的執行個體,以便可以比較部署。

    目標是取得可用於生產部署的可靠、可重複的範本。

範例: 擴充的雲端範本代碼已完成的範例

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
  databaseDiskSize:
    type: number
    default: 4
    maximum: 10
    title: MySQL Data Disk Size
    description: Database Disk Size
  count: type: integer default: 2 maximum: 5 minimum: 2 title: WordPress Cluster Size description: WordPress Cluster Size (Number of Nodes) archiveDiskSize: type: number default: 4 maximum: 10 title: WordPress Archive Disk Size description: Archive Storage Disk Speed archiveusage: type: string enum: - 'usage:general' - 'usage:fast' description: Archive Storage Disk Speed title: Archive Disk Speed
resources:
  DBTier:
    type: Cloud.Machine
    properties:
      name: mysql
      image: ubuntu-16
      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 "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'mysqlpassword';"
         - mysql -e "FLUSH PRIVILEGES;"
      attachedDisks: []
  WebTier:
    type: Cloud.Machine
    properties:
      name: wordpress
      flavor: '${input.size}'
      image: 'ubuntu-16'
      count: '${input.count}'
      constraints:
        - tag: '${input.env}'
      networks:
        - network: '${resource["WP-Network-Private"].id}'
          assignPublicIpAddress: true
      storage: disks: - capacityGb: '${input.archiveDiskSize}' name: ArchiveDisk
      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 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
         - 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 -e s/"define('DB_HOST', 'localhost');"/"define('DB_HOST', '${DBTier.networks[0].address}');"/ /var/www/html/mywordpresssite/wp-config.php
         - service apache2 reload
  LoadBalancer: type: Cloud.LoadBalancer properties: name: myapp-lb network: '${resource["WP-Network-Public"].id}' instances: - '${WebTier.id}' routes: - protocol: HTTP port: '80' instanceProtocol: HTTP instancePort: '80' healthCheckConfiguration: protocol: HTTP port: '80' urlPath: /mywordpresssite/wp-admin/install.php intervalSeconds: 6 timeoutSeconds: 5 unhealthyThreshold: 2 healthyThreshold: 2 internetFacing: true
  WP-Network-Private:
    type: Cloud.Network
    properties:
      name: WP-Network-Private
      networkType: existing
      constraints:
        - tag: 'type:isolated-net'
        - tag: '${input.env}'
  WP-Network-Public: type: Cloud.Network properties: name: WP-Network-Public networkType: public constraints: - tag: 'type:public-net' - tag: '${input.env}' backup: type: Cloud.Machine properties: name: backup flavor: '${input.size}' image: 'ubuntu-16' networks: - network: '${resource["WP-Network-Private"].id}' constraints: - tag: '${input.env}' attachedDisks: - source: '${ArchiveDisk.id}' ArchiveDisk: type: Cloud.Volume properties: name: ArchiveDisk capacityGb: 5 constraints: - tag: '${input.archiveusage}' - tag: '${input.env}'

後續步驟

定義您自己的基礎結構,並建立您自己的雲端範本。

請參閱建置 Cloud Assembly 資源基礎結構設計 Cloud Assembly 部署