In diesem Cloud Assembly-Designbeispiel beginnen Sie mit einer Cloud-Vorlage, die nur ein Minimum an WordPress-Ressourcen enthält, zum Beispiel nur einen Anwendungsserver.

Cloud Assembly ist ein „Infrastruktur-als-Code“-Tool. Sie können Ressourcen auf die Design-Arbeitsfläche ziehen, um den Vorgang zu starten. Anschließend vervollständigen Sie die Details mit dem Code-Editor rechts neben der Arbeitsfläche.

Mit dem Code-Editor können Sie Code direkt eingeben, ausschneiden und einfügen. Wenn Sie nicht gern Code bearbeiten, können Sie eine Ressource in der Arbeitsfläche auswählen, auf die Registerkarte Eigenschaften im Code-Editor klicken und die Werte dort eingeben. Die von Ihnen eingegebenen Werte werden im Code so angezeigt, als hätten Sie sie direkt eingegeben.

Prozedur

  1. Gehen Sie zu Design > Cloud-Vorlagen und klicken Sie auf Neu von > Leere Arbeitsfläche.
  2. Benennen Sie die Cloud-Vorlage WordPress-BP.
  3. Wählen Sie das WordPress-Projekt aus und klicken Sie auf Erstellen.
  4. Ziehen Sie aus den Ressourcen links auf der Cloud-Vorlagen-Designseite zwei Cloud-unabhängige Maschinen auf die Arbeitsfläche.
    Die Maschinen dienen als WordPress-Anwendungsserver (WebTier) und MySQL-Datenbankserver (DBTier).
  5. Bearbeiten Sie auf der rechten Seite den Maschinen-YAML-Code, um Namen, Images, Konfigurationen und Einschränkungs-Tags hinzuzufügen:
    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. Ziehen Sie ein Cloud-unabhängiges Netzwerk auf die Arbeitsfläche und bearbeiten Sie den Code:
     WP-Network-Private:
        type: Cloud.Network
        properties:
            name: WP-Network-Private
            networkType: existing
    
  7. Verbinden Sie die Maschinen mit dem Netzwerk:

    Bewegen Sie auf der Arbeitsfläche den Mauszeiger über den Netzwerkblock, klicken Sie an der Stelle auf die Blase, wo die Linie den Block berührt, halten Sie den Mauszeiger gedrückt, ziehen Sie die Blase auf einen Maschinenblock und lassen Sie die Maustaste los.

    Beachten Sie beim Erstellen der Verbindungslinien, dass Netzwerkcode automatisch zu den Maschinen im Editor hinzugefügt wird.

    Zwei Maschinen und ein Netzwerk
  8. Fügen Sie eine Benutzereingabeaufforderung hinzu.

    An einigen Stellen wurde die Beispielinfrastruktur für mehrere Optionen eingerichtet. Beispiel:

    • Cloud-Zonen-Umgebungen für Entwicklung, Tests und Produktion
    • Konfigurationszuordnungen für kleine, mittlere und große Maschinen

    Sie können eine bestimmte Option direkt in der Cloud-Vorlage festlegen. Ein besserer Ansatz ist jedoch, dass der Benutzer die Option zur Bereitstellungszeit der Cloud-Vorlage auswählen kann. Durch die Eingabeaufforderung für die Benutzereingabe können Sie eine Vorlage erstellen, die auf viele Arten bereitgestellt werden kann, anstatt mit vielen hartcodierten Vorlagen zu arbeiten.

    1. Erstellen Sie einen inputs-Abschnitt im Code, damit Benutzer die Maschinengröße und die Zielumgebung zur Bereitstellungszeit auswählen können. Definieren Sie die auswählbaren Werte:
      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. Fügen Sie im resources-Abschnitt des Codes den Code ${input.input-name} hinzu, um die Benutzerauswahl zu bestätigen:
      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. Erweitern Sie schließlich den WebTier- und den DBTier-Code anhand der folgenden Beispiele. Der WP-Network-Private-Code benötigt keine zusätzlichen Änderungen.
    Beachten Sie, dass Anmeldezugriff auf die Datenbank und cloudConfig-Initialisierungsskripts zur Bereitstellungszeit zu den Verbesserungen gehören.
    Komponente Beispiel
    Zusätzliche DBTier-Eingaben
      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
    
    DBTier-Ressource
      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 "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'mysqlpassword';"
             - mysql -e "FLUSH PRIVILEGES;"
          attachedDisks: []
    
    WebTier-Ressource
      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
             - 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
             - service apache2 reload
    

Beispiel: Abgeschlossenes Codebeispiel für eine einfache Cloud-Vorlage

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
         - 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
         - 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 "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'mysqlpassword';"
         - mysql -e "FLUSH PRIVILEGES;"
      attachedDisks: []
  WP-Network-Private:
    type: Cloud.Network
    properties:
      name: WP-Network-Private
      networkType: existing

Nächste Maßnahme

Testen Sie die Cloud-Vorlage, indem Sie die Syntax überprüfen und die Vorlage bereitstellen.