En tant que concepteur Cloud Assembly, vous commencez par un modèle de cloud contenant uniquement des ressources WordPress minimales, comme un seul serveur d'applications.

Cloud Assembly est un outil d'infrastructure programmable (Infrastructure as Code, IaC). Pour commencer, vous pouvez faire glisser des ressources jusqu'au canevas de conception. Ensuite, vous indiquez les détails en utilisant l'éditeur de code à droite du canevas.

L'éditeur de code vous permet de taper, couper et coller directement du code. Si vous n'avez pas l'habitude de manipuler du code, vous pouvez sélectionner une ressource dans le canevas, puis cliquer sur l'onglet Propriétés de l'éditeur de code pour y entrer les valeurs. Les valeurs que vous entrez dans cet onglet s'affichent dans le code comme si vous les aviez tapées directement.

Conditions préalables

Familiarisez-vous avec votre infrastructure. Les exemples présentés ici utilisent les valeurs d'infrastructure de la première partie du cas d'utilisation, que vous devez remplacer par les vôtres.

Procédure

  1. Accédez à Conception > Modèles de cloud et cliquez sur Nouveau à partir de > Canevas vide.
  2. Nommez le modèle de cloud WordPress-BP.
  3. Sélectionnez le projet WordPress, puis cliquez sur Créer.
  4. À partir des ressources se trouvant sur la gauche de la page de conception des modèles de cloud, faites glisser deux machines indépendantes du cloud jusqu'au canevas.
    Les machines servent de serveur d'applications WordPress (WebTier) et de serveur de base de données MySQL (DBTier).
  5. À droite, modifiez le code YAML de la machine pour y ajouter des noms, des images, des types et des balises de contrainte :
    resources:
      DBTier:    
        type: Cloud.Machine    
        properties:      
            name: mysql      
            image: 'ubuntu-16'      
            flavor: 'small'      
            constraints: - tag: env:dev
      WebTier:
        type: Cloud.Machine    
        properties:     
            name: wordpress      
            image: 'ubuntu-16'      
            flavor: 'small'      
            constraints: - tag: env:dev
    
  6. Faites glisser un réseau indépendant du cloud jusqu'au canevas et modifiez-en le code :
     WP-Network-Private:
        type: Cloud.Network
        properties:
            name: WP-Network-Private
            networkType: existing
            constraints: - tag: 'type:isolated-net' - tag: 'env:dev'
  7. Connectez les machines au réseau :

    Avec le bouton gauche de la souris, cliquez sur l'emplacement où la ligne touche le bloc réseau et, tout en maintenant le bouton enfoncé, faites glisser le pointeur jusqu'à un bloc machine avant de relâcher le bouton.

    Deux machines et un réseau

    Dans l'éditeur, notez que le code réseau est ajouté aux deux machines :

    resources:
      DBTier:    
        type: Cloud.Machine    
        properties:      
            name: mysql      
            image: 'ubuntu-16'      
            flavor: 'small'      
            constraints:        
                -   tag: env:dev
            networks: - network: '${resource["WP-Network-Private"].id}'
      WebTier:
        type: Cloud.Machine    
        properties:     
            name: wordpress      
            image: 'ubuntu-16'      
            flavor: 'small'      
            constraints:        
                - tag: env:dev
            networks: - network: '${resource["WP-Network-Private"].id}'
      
  8. Ajoutez une invite à la saisie utilisateur.

    En certains emplacements, l'infrastructure du cas d'utilisation a été configurée pour plusieurs options. Par exemple :

    • Environnements de zone de cloud pour le développement, le test et la production
    • Mappages de type pour les machines de petite, moyenne et grande taille
    • Vitesse des disques de stockage pour une utilisation générale et rapide

    Vous pouvez définir une option spécifique directement dans le modèle de cloud, mais une meilleure approche consiste à laisser l'utilisateur sélectionner l'option au moment du déploiement du modèle de cloud. L'invite à la saisie utilisateur vous permet de créer un modèle qui peut être déployé de plusieurs façons, au lieu d'avoir plusieurs modèles codés de manière irréversible.

    1. Dans le code, créez une section inputs afin que les utilisateurs puissent sélectionner la taille de la machine et l'environnement cible au moment du déploiement. Définissez les valeurs que les utilisateurs peuvent sélectionner :
      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. Dans la section resources du code, ajoutez le code ${input.input-name} pour inviter l'utilisateur à effectuer une sélection :
      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}'
        WebTier:
          type: Cloud.Machine    
          properties:     
              name: wordpress      
              image: 'ubuntu-16'      
              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
              constraints:
                  - tag: 'type:isolated-net'
                  - tag: '${input.env}'
  9. Enfin, améliorez les codes WebTier et DBTier en utilisant les exemples suivants. Le code WP-Network-Private n'a pas besoin de modifications supplémentaires.
    Notez que les améliorations incluent l'accès de connexion au serveur de base de données, un disque de base de données et des scripts d'initialisation cloudConfig au moment du déploiement.
    Composant Exemple
    Entrées DBTier supplémentaires
      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
    
    Ressource DBTier
      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: []
    Ressource WebTier
      WebTier:
        type: Cloud.Machine
        properties:
          name: wordpress
          flavor: '${input.size}'
          image: ubuntu-16
          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
             - 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
    

Exemple : Exemple de code de modèle de cloud de base terminé

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
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
      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
         - 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
  WP-Network-Private:
    type: Cloud.Network
    properties:
      name: WP-Network-Private
      networkType: existing
      constraints:
        - tag: 'type:isolated-net'
        - tag: '${input.env}'

Que faire ensuite

Pour tester le modèle de cloud, vérifiez la syntaxe et déployez-le.