Linux Apache with Network selectorΒΆ

This is an example of a template which launches a stack and deploys an Apache Web Server. The Apache Web Server is installed without using Chef or Puppet. This sample template has a Network selector which allows the Dell Cloud Manager user to select the virtual private cloud Network and Subnet to launch the stack server into. You can download it at this link apache_web_server_network_selector_no_cm.yaml. Refer to the Linux Apache Web Server with Network selector (No Config Mgmt) tutorial in this document for a detailed step by step hands on tutorial which uses this template.

####################################################################################################################################################
# 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