In questo esempio di progetto di Cloud Assembly, si inizia con un modello cloud che contiene solo le risorse di base di WordPress, ad esempio un solo server applicazioni.

Cloud Assembly è uno strumento infrastructure-as-code. Si trascinano le risorse nella tela di progettazione per iniziare. Quindi, è possibile completare i dettagli utilizzando l'editor di codice a destra della tela.

L'editor di codice consente di digitare, tagliare e incollare direttamente il codice. Se si sta modificando la modifica del codice, è possibile selezionare una risorsa nella tela, fare clic sulla scheda Proprietà dell'editor di codice e immettere i valori. I valori immessi vengono visualizzati nel codice come se fossero stati digitati direttamente.

Procedura

  1. Passare a Progettazione > Modelli cloud e fare clic su Nuovo da > Tela vuota.
  2. Denominare il modello cloud Wordpress-BP.
  3. Selezionare il progetto WordPress e fare clic su Crea.
  4. Dalle risorse a sinistra della pagina di progettazione del modello cloud, trascinare due macchine indipendenti dal cloud sulla tela.
    Le macchine fungono da server applicazioni di WordPress (WebTier) e server di database MySQL (DBTier).
  5. A destra, modificare il codice YAML della macchina per aggiungere nomi, immagini, caratteristiche e tag di vincolo:
    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
    
  6. Trascinare una rete indipendente dal cloud nella tela e modificarne il codice:
     WP-Network-Private:
        type: Cloud.Network
        properties:
            name: WP-Network-Private
            networkType: existing
    
  7. Connettere le macchine alla rete:

    Nella tela, passare il puntatore del mouse sul blocco di rete, fare clic e tenere premuto il punto in cui la linea tocca il blocco di rete, trascinarlo in un blocco macchina e rilasciarlo.

    Quando si creano le linee di connessione, si noti che il codice di rete viene aggiunto automaticamente alle macchine nell'editor.

    Due macchine e una rete
  8. Aggiungere la richiesta di input dell'utente.

    In alcune posizioni, l'infrastruttura dell'esempio è stata configurata per più opzioni. Ad esempio:

    • Ambienti della zona cloud per lo sviluppo, il test e la produzione
    • Mappature delle caratteristiche per le macchine piccole, medie e grandi

    È possibile impostare un'opzione specifica direttamente nel modello cloud, ma un approccio migliore consiste nel permettere all'utente di selezionare l'opzione al momento della distribuzione del modello. La richiesta di input dell'utente consente di creare un modello che può essere distribuito in molti modi, anziché avere molti modelli hardcoded.

    1. Creare una sezione inputs nel codice, in modo che gli utenti possano selezionare la dimensione della macchina e l'ambiente di destinazione al momento della distribuzione. Definire i valori selezionabili:
      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
      
    2. Nella sezione resources del codice, aggiungere il codice ${input.input-name} per richiedere la selezione dell'utente:
      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
      
  9. Infine, migliorare il codice WebTier e DBTier utilizzando i seguenti esempi. Il codice WP-Network-Private non richiede modifiche aggiuntive.
    Si noti che i miglioramenti includono l'accesso al server del database e gli script di inizializzazione cloudConfig in fase di distribuzione.
    Componente Esempio
    Input DBTier aggiuntivi
      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
    
    Risorsa 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: []
    
    Risorsa 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
    

Esempio: Esempio di codice del modello cloud di base completato

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

Operazioni successive

Testare il modello cloud controllando la sintassi e distribuirlo.