Completed TemplateΒΆ

Here is the full completed template. You can download it at this link apache_web_server_network_selector_no_cm.yaml.

####################################################################################################################################################
# This sample deploys a single server stack with an Apache Web Server. It does not require Configuration Management (no Chef or Puppet).
####################################################################################################################################################
#
# This sample is intended for demonstrating the Blueprint function. It is not intended for "production" use and is unsupported. 
# Use it at your own risk.
#
# Note: This Blueprint launches servers from public Ubuntu machine images. You should verify that the machine images still exist before launching.
#
# Refer to the Dell Cloud Manager Blueprint Designer Guide for more details. 
# http://blueprint-designer-guide.enstratius.com/tutorials/no_cm/tutorial4/overview.html
#
####################################################################################################################################################
template_name: "Apache Web Server on Linux with Network Selector"
template_author: "Gary Forghetti"
template_version: "1.00"
description: "Deploys an Apache Web Server single server stack without Chef or Puppet"
long_description: "Deploys a stack with an Apache Web Server. This is a simple example which does not use Configuration Management to install Apache."

imports:
  - base_types.yaml                                                   # Import the DCM base type definitions that are referenced in this template

topology_template:  

  ##################################################################################################################################################
  # This defines the inputs that the Dell Cloud Manager user can select/enter when launching a stack from the Blueprint
  ##################################################################################################################################################

  inputs:                                                             # Define the inputs
    ################################################################################################################################################
    # This defines the AccountRegionSelector which allows the user to select the Cloud, Region and Datacenter
    ################################################################################################################################################
    account_region_zone_selector:                                     # Define the section for the Cloud, Region and Datacenter selection boxes
      type: dcm.inputs.AccountRegionSelector                          # Input type is dcm.inputs.accountRegionSelector 
      properties:
        regions:                                                      # Define the Cloud and Regions
          "Amazon":                                                   # Amazon
            "us-east-1": [ ]                                          # All data centers for the us-east-1 region
            "us-west-1": ["us-west-1a", "us-west-1c"]
            "us-west-2": ["us-west-2a", "us-west-2b", "us-west-2c"]
            "eu-west-1": ["eu-west-1a", "eu-west-1c"]

    ################################################################################################################################################
    # This defines the Network selector which allows the user to select the network and subnet
    ################################################################################################################################################            
    network_selector:                                                 # Define the section for the Network and Subnet selection boxes
      type: dcm.inputs.Network                                        # Input type is dcm.inputs.Network
      properties:
        accountRegionSelector: account_region_zone_selector           # Reference the Cloud, Region, and Datacenter selection

    ################################################################################################################################################
    # This defines the Product selector which allows the user to select the server product size
    ################################################################################################################################################        
    product_selector:                                                 # Define the product selector so the user can select the cloud and region
      type: dcm.inputs.Product                                        # Input type is dcm.inputs.Product
      properties:
        accountRegionSelector: account_region_zone_selector           # This connects the region_selector to the product_selector  
        platform: UNIX                                                # Virtual machine images are Linux
        architecture: I64                                             # 64 bit images
        productMappings:
          "Amazon":                                                   # Amazon cloud
            "us-east-1":                                              # us-east-1 Region
              image: "ami-c4edc0d3"                                   # Machine image identifier for an Ubuntu image in this region
              products: ['t1.micro', 'm1.small', 'm1.medium']         # The virtual machine product sizes for this region
            "us-west-1":                                              # us-west-1 Region
              image: "ami-e7035687"                                   # Machine image identifier for an Ubuntu image in this region
              products: ['t1.micro', 'm1.small', 'm1.medium']         # The virtual machine product sizes for this region
            "us-west-2":                                              # us-west-2 Region
              image: "ami-578c2f37"                                   # Machine image identifier for an Ubuntu image in this region
              products: ['t1.micro', 'm1.small', 'm1.medium']         # The virtual machine product sizes for this region
            "eu-west-1":                                              # eu-west-1 Region
              image: "ami-e6a1f795"                                   # Machine image identifier for an Ubuntu image in this region
              products: ['t1.micro', 'm1.small', 'm1.medium']         # The virtual machine product sizes for this region

  ##################################################################################################################################################
  # This defines the two outputs to appear on the DCM console Stack overview page (IP address and URL of the Apache Web Server)
  ##################################################################################################################################################
  outputs:                                                            # Define outputs

    application_group:                                                # Create a Group
      type: dcm.outputs.DisplayGroup                                  # It's a displayGroup
      properties:
        displayName: "Apache Web Server Information"                  # Set the display name for the group containing the outputs which appears on the Stack Overview page

    vm_ip:                                                            # Define an output
      type: string                                                    # It's a string output
      description: IP of the server                                   # Set the description for the string output
      value: {get_attribute: [web_vm, publicIpAddress]}               # Set the value to the public IP address of the server running in the stack
      properties:
        displayName: IP address                                       # Set the display name (label) for the string output
        displayGroup: application_group                               # Place this output in the displayGroup named application_group

    link:                                                             # Define another output
      type: dcm.outputs.Uri                                           # It's a URI output
      value: http://xxxxxxxxxxxxx/index.html                          # Set the initial value
      properties:
        host: {get_attribute: [web_vm, publicIpAddress]}              # Set the hostname/ipaddress of the URI to the public IP address of the server running in the stack
        displayName: Apache Server URL                                # Set the display name (label) for the URI output
        displayGroup: application_group                               # Place this output in the displayGroup named application_group

    tutorial_group:                                                   # Create a Group
      type: dcm.outputs.DisplayGroup                                  # It's a displayGroup
      properties:
        displayName: "Blueprint Designer Guide"                       # Set the display name for the group 

    tutorial_link:                                                    # Define an output
      type: dcm.outputs.Uri                                           # It's a URI output
      value: "http://blueprint-designer-guide.enstratius.com/tutorials/no_cm/tutorial4/overview.html"
      properties:
        displayName: "Tutorial Link:"                                 # Set the display name (label) for the URI output 
        displayGroup: tutorial_group                                  # Place this output in the displayGroup named application_group

  node_templates:

    ##################################################################################################################################################
    # This node_template defines a virtual machine named "web_vm" which will host the Apache Web Server
    ##################################################################################################################################################
    web_vm:
      type: dcm.nodes.Server                                                      # This is a Server node 
      properties:                                                 
        name: "apache-server"
        ############################################################################################################################################## 
        # Retrieve cloud, region and datacenter information from the region_selector
        ##############################################################################################################################################
        cloud: { get_input: [account_region_zone_selector , cloud] }              # Retrieve cloud from the inputs region_selector
        cloudAccountId: { get_input: [account_region_zone_selector , accountId] } # Retrieve the cloud account ID from the inputs region_selector
        region: { get_input: [account_region_zone_selector , region] }            # Retrieve region from the inputs region_selector
        zone: { get_input: [account_region_zone_selector , zone] }                # Retrieve zone from the inputs operator selection 
        ############################################################################################################################################## 
        # Retrieve server "product" information from the product_selector
        ##############################################################################################################################################
        platform: { get_input: [product_selector, platform] }                     # Retrieve platform from the inputs product_selector
        architecture: { get_input: [product_selector, architecture] }             # Retrieve architecture from the inputs product_selector
        product: { get_input: [product_selector, product] }                       # Retrieve product from the inputs product_selector 
        image: { get_input: [product_selector, image] }                           # Retrieve machine from the inputs product_selector
        serverProductId: { get_input: [product_selector, serverProductId] }       # Retrieve server product id from the inputs product_selector

        startupScript:  |                                                         # Startup script with commands to install and start the dcm agent
            #!/bin/bash
            ##########################################################################################################################################
            # Install curl on Debian/Ubuntu if necessary
            ##########################################################################################################################################
            which apt-get && apt-get update -qq && (which curl || apt-get install curl -y)

            ##########################################################################################################################################
            # Install curl on RHEL/CentOS if necessary
            ##########################################################################################################################################
            which yum && yum -q makecache && (which curl || yum install curl -y)

            ##########################################################################################################################################
            # Install the Dell Cloud Manager agent, point it to the Dell Cloud Manager server and configure it to startup at boot time.
            ##########################################################################################################################################
            export DCM_URL=${dcm.callback.url}

            ##########################################################################################################################################
            # The -Z argument configures the Dell Cloud Manager agent and allows it to accept unknown certificates. 
            # This is only recommended for testing and should not be done in a production environment.
            ##########################################################################################################################################
            curl -L --retry 10 https://linux-stable-agent.enstratius.com/installer.sh | bash -s - --url $DCM_URL --on-boot -Z

            ##########################################################################################################################################
            # Start the Dell Cloud Manager agent.
            ##########################################################################################################################################
            /etc/init.d/dcm-agent start

            if [[ $(which apt-get > /dev/null;echo $?) -eq 0 ]]; then
                ######################################################################################################################################
                # Install Apache
                ######################################################################################################################################
                apt-get install apache2 -y

                ######################################################################################################################################
                # Start Apache
                ######################################################################################################################################
                service apache2 start
            elif [[ $(which yum > /dev/null;echo $?) -eq 0 ]]; then
                ######################################################################################################################################
                # Install Apache
                ######################################################################################################################################
                yum install httpd -y

                ######################################################################################################################################
                # Start Apache
                ######################################################################################################################################
                service httpd start
            else
                echo "Unrecognized Linux distribution!"
                exit 1
            fi

            ##########################################################################################################################################
            # Create iptable rule to open http port 80 and save it
            ##########################################################################################################################################
            iptables -I INPUT -p tcp --dport 80 -j ACCEPT
            iptables-save

            ##########################################################################################################################################
            # Create a home page
            ##########################################################################################################################################
            home_page_location=""
            if [[ -d '/var/www/html' ]]; then
              home_page_location='/var/www/html'
            else
              home_page_location='/var/www'
            fi

            cat <<EOF > "${home_page_location}/index.html"
            <!DOCTYPE html>
            <html>
            <head>
            <title>ACME</title>
            </head>
            <body style='background-color:gainsboro;'>
            <h1><div style="text-align:center;">Welcome to ACME Anvil Corporation!</div></h1>
            <div style="text-align:center;"><img style="box-shadow: 8px 8px 5px #888888;" src="http://blueprint-designer-guide.enstratius.com/_static/acme_logo.jpg"></div>
            <p style='text-align:center;'>Thank you for visiting our website. We look forward to having your business!</p>
            </body>
            </html>
            EOF

      requirements:                                                   # This virtual machine node has a requirement on a firewall
        - firewall: vm_firewall_rules                                 # The firewall statement is named "vm_firewall_rules"
          relationship_type: tosca.relationships.DependsOn 

    ###################################################################################################################################################
    # This node_template defines a firewall which opens the HTTP port 80 for the Apache Web server
    ###################################################################################################################################################
    vm_firewall_rules:
      type: dcm.nodes.FirewallGroup                                              # This is a firewall
      properties:                                                                # Retrieve the cloud properties from the "inputs"
        name: "fw-apache-server"                                                 # Define a name for the firewall (it will get prefixed with the stack name)
        ############################################################################################################################################### 
        # Retrieve cloud, cloudAccountID, region and datacenter information from the region_selector
        ###############################################################################################################################################
        cloud: { get_input: [account_region_zone_selector, cloud] }              # Retrieve the cloud from the AccountRegionSelector 
        cloudAccountId: { get_input: [account_region_zone_selector, accountId] } # Retrieve the cloud account ID from the AccountRegionSelector  
        region: { get_input: [account_region_zone_selector, region] }            # Retrieve the region from the AccountRegionSelector 
        zone: { get_input: [account_region_zone_selector, zone] }                # Retrieve the zone from the AccountRegionSelector  
        rules:
          - remote_ip_prefix: 0.0.0.0/0
            port: 80                                                             # Define a rule to open port 80  (HTTP)  

      requirements:                                                              # Define a requirement for the Firewall to the virtual private cloud network 
        - network: int_network                                                   # Link this firewall to the vpc network section named int_network
          relationship_type: tosca.relationships.DependsOn                       # Define a DependsOn relationship to the vpc network       

    ###################################################################################################################################################
    # This node_template defines a Virtual Private Cloud Network
    ###################################################################################################################################################                 
    int_network:                                                                 # Network section name is int_network
      type: dcm.nodes.Network                                                    # Type is dcm.nodes.Network
      properties:                                                                # Retrieve the properties from the region_selector and network_selector
        ############################################################################################################################################### 
        # Retrieve cloud, cloudAccountId, region and datacenter information from the region_selector
        ############################################################################################################################################### 
        cloud: { get_input: [account_region_zone_selector, cloud] }              # Retrieve the cloud from the AccountRegionSelector 
        cloudAccountId: { get_input: [account_region_zone_selector, accountId] } # Retrieve the cloud account ID from the AccountRegionSelector  
        region: { get_input: [account_region_zone_selector, region] }            # Retrieve the region from the AccountRegionSelector 
        zone: { get_input: [account_region_zone_selector, zone] }                # Retrieve the zone from the AccountRegionSelector 
        ############################################################################################################################################### 
        # Retrieve networkId and subnetId information from the network_selector
        ############################################################################################################################################### 
        networkId: { get_input: [network_selector, networkId] }                  # Retrieve the network ID from the network_selector 
        subnetId: { get_input: [network_selector, subnetId] }                    # Retrieve the subnet ID from the network_selector 
        
    ###################################################################################################################################################
    # This node_template defines a Port
    ###################################################################################################################################################    
    port:
      type: dcm.nodes.Port                                            # Type is dcm.nodes.Port
      requirements:                                                   # Define a requirement to have the virtual machines launched in a vpc network
        - link: int_network                                           # Link this Port to the vpc network section with the label int_network
        - binding: web_vm                                             # Bind the virtual machine section with the label web_vm to to port