Top Banner
OpenStack Murano - an application catalog service
81

OpenStack Murano introduction

Jul 15, 2015

Download

Technology

Victor Zhang
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: OpenStack Murano introduction

OpenStack Murano- an application catalog service

Page 2: OpenStack Murano introduction

Agenda

Why Murano?

What is Murano?

Murano architecture

How to use Murano? Install and configure Murano push-a-button style deployment for end user Application Catalog Design in Murano

Murano best practices

Troubleshooting

Understand how Murano-agent works

2

Page 3: OpenStack Murano introduction

Why Murano?

4

This is how we buy product in Amazon.com.

This is how we will consume cloud service on OpenStack by Murano.

Page 4: OpenStack Murano introduction

What is Murano?

What is Murano Just like hardware will be useless without software, virtual machine is useless

without application. Murano is an application catalog service runs on the top of OpenStack IaaS

layer.

Goal compose and deploy composite environments on the Application abstraction

level via UI or rest API application life cycle management be an integration point for various applications and service in OpenStack

Source code https://git.openstack.org/cgit/?q=Murano https://launchpad.net/Murano

5

Page 5: OpenStack Murano introduction

Murano high level overview

6

Page 6: OpenStack Murano introduction

Murano architecture

7

❶ user send request via Murano dashboard to Murano python client❷ Murano python client send request to Murano API server❸ Murano api server send the request to rabbitmq❹ Murano conductor pick the request message from queue❺ Murano conductor parse the message and construct a heat template to heat engine❻Murano conductor send the really deployment execution plan to the rabbitmq as Murano agent task❼ heat deploy the whole IaaS level infrastructure via various OpenStack services❽ OpenStack services provision the vm instances with Murano-agent enabled.❾ on vms Murano-agent pick up the execution plan assigned by the Murano conductor and execute them via various scripts on certain OS

Page 7: OpenStack Murano introduction

Murano components

Murano API Service

• Murano API provides access to the Murano orchestration engine via API.

Conductor Service(Orchestration Engine)

• Conductor is a Murano orchestration engine that transforms object model sent by REST API service into a series of Heat and Murano-Agent commands.

Murano Repository Service

• Murano Repository provides access to metadata for Murano Conductor and Murano Dashboard. It also allows to manage metadata objects via API. Editing service definitions (and other data stored in Murano Repository) is made separately for each tenant.

Murano Dashboard

• Murano Dashboard provides Web UI for Murano Project.

8

Page 8: OpenStack Murano introduction

How to use Murano?

Murano personas

Install and configure Murano

push-a-button style deploy for end user

Application Catalog Design in Murano

9

Page 9: OpenStack Murano introduction

Murano personas

10

f

cloud catalog admincloud end user

3rd party cloud application provider

Murano

consumes

Maintain and set policy

integrate and publish

integrates

Page 10: OpenStack Murano introduction

Install and configure Murano

Using Devstack $ git clone https://github.com/openstack-dev/devstack.git

$git checkout stable/juno

$ wget https://raw.github.com/stackforge/Murano-deployment/release-0.4/

getting-started/localrc

$ wget https://raw.github.com/stackforge/Murano-deployment/release-0.4/

getting-started/local.sh

$ chmod +x local.sh

$ ./stack.sh

11

Page 11: OpenStack Murano introduction

Install Murano-Using devstack-Local.sh

12

Page 12: OpenStack Murano introduction

Murano.conf

13

Rabbit host

Keystone auth

Page 13: OpenStack Murano introduction

Push-a-button style deployment

14

❶create environment

❷add component from

the catalog services

❸deploy the environment

❹consume the cloud service

❺charge by billing system

❻delete the environment

start point

Page 14: OpenStack Murano introduction

Application Catalog Design in Murano

most complex and important part in Murano

generic workflow is build Murano-agent enabled vm image

create application package

specify the billing rules and usage metrics

test and verify

publish to Murano catalog

15

Page 15: OpenStack Murano introduction

Design an application catalog high level overview

16

apache

OS

Modelingin Murano

Apache Service

in OpenStack

Apache service

Linux Windows

Page 16: OpenStack Murano introduction

build Murano-agent enabled vm image

build Murano windows image Install Required Packages

Configure Shared Resource

Prerequisites

Additional Software

Build Windows Image (Automatic Way)

Build Windows Image (Manual Way)

Upload Image Into Glance

17

• build Murano Linux image• Install Required Packages

• Build Linux Image

• Guest VM Linux OS preparation

• Upload Image Into Glance

Page 17: OpenStack Murano introduction

Building Windows Image

Install Required Packages

Configure Shared Resource

Prerequisites

Additional Software

Build Windows Image (Automatic Way)

Build Windows Image (Manual Way)

Upload Image Into Glance

18

Page 18: OpenStack Murano introduction

Building Windows Image -Install Required Packages ipxe-qemu

kvm-ipxe

qemu-kvm

python-libvirt

libvirt-bin

libvirt0

virt-goodies

virt-manager

virt-top

virt-what

virtinst

python

19

# apt-get install ipxe-qemu kvm-ipxe qemu-kvm virt-goodies \virtinst virt-manager libvirt0 libvirt-bin \python python-libvirt \python-libxml2 python-minimal python-pycurl \python-pyorbit python-requests python-six \samba samba-common openssh-server virt-top virt-what

Page 19: OpenStack Murano introduction

Building Windows Image -Configure Shared Resource Configure samba based share

># mkdir -p /opt/samba/share># chown -R nobody:nogroup /opt/samba/share

Configure samba server (/etc/samba/smb.conf)....[global]

...security = user

...[share]

comment = Deployment Sharepath = /opt/samba/sharebrowsable = yesread only = nocreate mask = 0755guest ok = yesguest account = nobody

...

Restart services.># service smbd restart># service nmbd restart

20

Page 20: OpenStack Murano introduction

Building Windows Image -Prerequisites•${SHARE_PATH}/libvirt/images/ws-2012-eval.iso

•http://technet.microsoft.com/en-us/evalcenter/hh670538.aspxWindows 2012 Server ISO evaluation version

•${SHARE_PATH}/libvirt/images/virtio-win-0.1-52.iso

•http://alt.fedoraproject.org/pub/alt/virtio-win/stable/virtio-win-0.1-52.isoVirtIO drivers for Windows

•${SHARE_PATH}/share/files/CloudbaseInitSetup_Beta.msi

•http://www.cloudbase.it/downloads/CloudbaseInitSetup_Beta.msiCloudBase-Init for Windows

•${SHARE_PATH}/share/files/Far30b3367.x64.20130426.msi

•http://www.farmanager.com/files/Far30b3525.x64.20130717.msiFar Manager

•${SHARE_PATH}/share/files/Git-1.8.1.2-preview20130201.exe

•https://msysgit.googlecode.com/files/Git-1.8.3-preview20130601.exeGit client

•${SHARE_PATH}/share/files/SysinternalsSuite.zip

•http://download.sysinternals.com/files/SysinternalsSuite.zipSysinternals Suite

•${SHARE_PATH}/share/files/unzip.exe

•https://www.dropbox.com/sh/zthldcxnp6r4flm/-k1Om_V6XRunzip.exe tool

•${SHARE_PATH}/share/files/Windows6.1-KB2506143-x64.msu

•http://www.microsoft.com/en-us/download/details.aspx?id=34595PowerShell v3

•${SHARE_PATH}/share/files/dotNetFx40_Full_x86_x64.exe

•http://www.microsoft.com/en-us/download/details.aspx?id=17718.NET 4.0

•${SHARE_PATH}/share/files/dotNetFx45_Full_setup.exe

•http://www.microsoft.com/en-us/download/details.aspx?id=30653.NET 4.5

•${SHARE_PATH}/share/files/MuranoAgent.zip

•https://www.dropbox.com/sh/zthldcxnp6r4flm/-k1Om_V6XRMurano Agent 21

Page 21: OpenStack Murano introduction

Building Windows Image -Additional Software Windows ADK

${SHARE_PATH}/libvirt/images/ws-2012-eval.iso

Windows Assessment and Deployment Kit (ADK) for Windows® 8 is required to build your own answer files for auto unattended Windows installation.

http://technet.microsoft.com/en-us/evalcenter/hh670538.aspx

PuTTY PuTTY is a useful tool to manage your Linux boxes via SSH.

Windows Server 2012 ISO image Image Name: 9200.16384.WIN8_RTM.120725-1247_X64FRE_SERVER_EVAL_EN-US-HRM_SSS_X64FREE_EN-US_DV5.iso

URL: http://technet.microsoft.com/en-US/evalcenter/hh670538.aspx?ocid=&wt.mc_id=TEC_108_1_33

VirtIO Red Hat drivers ISO image Download drivers from http://alt.fedoraproject.org/pub/alt/virtio-win/stable/

Floppy Image With Unattended File Create empty floppy image in your home folder

># dd bs=512 count=2880 \

if=/dev/zero of=~/floppy.img \

mkfs.msdos ~/floppy.img

Mount the image to /media/floppy ># mkdir /media/floppy mount -o loop \

~/floppy.img /media/floppy

Download autounattend.xml file from https://raw.github.com/stackforge/Murano-deployment/master/image-builder/share/files/ws-2012-std/autounattend.xml ># cd ~

># wget https://raw.github.com/stackforge/Murano-deployment\

/master/image-builder/share/files/ws-2012-std/autounattend.xmlMurano Agent

Copy our autounattend.xml to /media/floppy ># cp ~/autounattend.xml /media/floppy

Unmount the image ># umount /media/floppy

22

Page 22: OpenStack Murano introduction

Building Windows Image- Build Windows Image (Automatic Way) Clone Murano-deployment repository

># git clone git://github.com/stackforge/Murano-deployment.git

Change directory to Murano-deployment/image-builder folder.

Create folder structure for image builder ># make build-root

Create shared resource Add to /etc/samba/smb.conf.

[image-builder-share]

comment = Image Builder Share

browsable = yes

path = /opt/image-builder/share

guest ok = yes

guest user = nobody

read only = no

create mask = 0755

Restart samba services. ># restart smbd && restart nmbd

Test that all required files are in place ># make test-build-files

Get list of available images ># make

Run image build process ># make ws-2012-std

Wait until process finishes

he image file ws-2012-std.qcow2 should be stored under /opt/image-builder/share/images folder. 23

Page 23: OpenStack Murano introduction

Building Windows Image- Build Windows Image (Manual Way) Get Post-Install Scripts

Download package installation script named wpi.ps1 from https://raw.github.com/stackforge/Murano-deployment/master/image-builder/share/scripts/ws-2012-std/wpi.ps1

Download Clean-up script Start-Sysprep.ps1 from https://raw.github.com/stackforge/Murano-deployment/master/image-builder/share/scripts/ws-2012-std/Start-Sysprep.ps1

Create a VM Using CLI Tools

Preallocate disk image ># qemu-img create -f raw /var/lib/libvirt/images/ws-2012.img 40G

Start the VM ># virt-install --connect qemu:///system --hvm --name WinServ \

--ram 2048 --vcpus 2 --cdrom /opt/samba/share/9200.16384.WIN8_RTM\.120725-1247_X64FRE_SERVER_EVAL_EN-US-HRM_SSS_X64FREE_EN-US_DV5.ISO \

--disk path=/opt/samba/share/virtio-win-0.1-52.iso,device=cdrom \--disk path=/opt/samba/share/floppy.img,device=floppy \--disk path=/var/lib/libvirt/images/ws-2012.qcow2\

,format=qcow2,bus=virtio,cache=none \--network network=default,model=virtio \--memballoon model=virtio --vnc --os-type=windows \--os-variant=win2k8 --noautoconsole \--accelerate --noapic --keymap=en-us --video=cirrus –force

24

Page 24: OpenStack Murano introduction

Building Windows Image- Build Windows Image (Manual Way)-cont Using virt-manager UI

Launch virt-manager from shell as root Set a name for VM and select Local install media Add one cdrom and attach Windows Server ISO image to it Select OS type Windows and it's version Windows Server 2008 Set CPU and RAM amount Deselect option Enable storage for this virtual machine Select option Customize configuration before install Add second cdrom for ISO image with virtio drivers Add a floppy drive and attach our floppy image to it Add (or create new) HDD image with Disk bus VirtIO and storage format RAW Set network device model VirtIO Start installation process and open guest vm screen through Console button

Convert the image from RAW to QCOW2 format. # qemu-img convert -O qcow2 /var/lib/libvirt/images/ws-2012.raw \ /var/lib/libvirt/images/ws-2012-ref.qcow2

25

Page 25: OpenStack Murano introduction

Building Windows Image -Upload Image Into Glance import your disk image to Glance

>$ glance image-create --name <NAME> \

--is-public true --disk-format qcow2 \

--container-format bare \

--file <IMAGE_FILE> \

--property <IMAGE_METADATA>

to update the exiting image meta data >$ glance image-update <IMAGE-ID> --property <IMAGE_MATADATA>

26

Page 26: OpenStack Murano introduction

Building Linux Image

Install Required Packages

Build Linux Image

Guest VM Linux OS preparation

Upload Image Into Glance

27

Page 27: OpenStack Murano introduction

Building Linux Image-Install Required Packages ipxe-qemu

kvm-ipxe

qemu-kvm

python-libvirt

libvirt-bin

libvirt0

virt-goodies

virt-manager

virt-top

virt-what

virtinst

python

28

># apt-get install ipxe-qemu kvm-ipxe qemu-kvm virt-goodies \virtinst virt-manager libvirt0 libvirt-bin \python python-libvirt \python-libxml2 python-minimal python-pycurl \python-pyorbit python-requests python-six \samba samba-common openssh-server virt-top virt-what

Page 28: OpenStack Murano introduction

Building Linux Image-Build Linux Image

Create a VM via CLI Preallocate disk image

># qemu-img create -f qcow2 /var/lib/libvirt/images/cloud-linux.img 10G

Start the VM># virt-install --connect qemu:///system --hvm --name cloud-linux \

--ram 2048 --vcpus 2 --cdrom /PATH_TO_YOUR_LINUX.ISO \

--disk path=/var/lib/libvirt/images/cloud-linux.img, \

format=qcow2,bus=virtio,cache=none \

--network network=default,model=virtio \

--memballoon model=virtio --vnc --os-type=linux \

--accelerate --noapic --keymap=en-us --video=cirrus --force

29

Page 29: OpenStack Murano introduction

Building Linux Image-Build Linux Image

Create a VM via virt-manager UI Launch virt-manager from shell as root Set a name for VM and select Local installation media Add one cdrom and attach your linux ISO image to it Select OS type Linux and it's version choose yours Set CPU and RAM amount Deselect option Enable storage for this virtual machine Select option Customize configuration before install Add (or create new) HDD image with Disk bus VirtIO and storage

format QCOW2 Set network device model VirtIO Start installation process and open guest vm screen

through Console button30

Page 30: OpenStack Murano introduction

Building Linux Image-Guest VM Linux OS preparation OS system required tools preparation

># apt-get -y update; apt-get -y dist-upgrade

># apt-get install -y git unzip make cmake gcc \

python-dev python-pip openssh-server

Murano-agent installation steps># mkdir -p /opt/git

># cd /opt/git

># git clone https://github.com/stackforge/Murano-agent.git

># cd Murano-agent/python-agent

># git checkout release-0.3

># chmod a+x setup*.sh

# To install Murano Agent on Ubuntu run:

># ./setup.sh install

# To install Murano Agent on CentOS run:

># ./setup-centos.sh install

cloud-init installation install cloud-init

># apt-get install -y cloud-init cloud-initramfs-growroot

# dpkg-reconfigure cloud-init

cloud-init configuration options># vi /etc/cloud/cloud.cfg

user: ec2-user

disable_root: 1

preserve_hostname: False

31

Page 31: OpenStack Murano introduction

Building Linux Image-Guest VM Linux OS preparation Security setup

># useradd -m -G sudo -s /bin/bash ec2-user># passwd ec2-user># echo "ec2-user ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/ec2-user># chmod 440 /etc/sudoers.d/ec2-user

Disable SSH password-based logins in the /etc/ssh/sshd_config....GSSAPIAuthentication noPasswordAuthentication noPermitRootLogin no...

Network handling # rm -f /etc/udev/rules.d/70-persistent-net.rules

Shutdown VM

Convert the image from RAW to QCOW2># qemu-img convert -O qcow2 /var/lib/libvirt/images/cloud-linux.img \

/var/lib/libvirt/images/cloud-linux.img.qcow232

Page 32: OpenStack Murano introduction

Building Linux Image-Upload Image Into Glance import image to glance

># glance image-create --disk-format=qcow2 --container-format=bare \

--is-public=true --file=cloud-linux.img --name=cloud-linux

33

Page 33: OpenStack Murano introduction

create application package

Step 1. Prepare Execution Plans

Step 2. Prepare MuranoPL class definitions

Step 3. Prepare Dynamic UI Form Definition

Step 4. Prepare application logo

Step 5. Prepare manifest file

Step 6. Compose a zip archive

34

Page 34: OpenStack Murano introduction

create application package

Step 1. Prepare Execution Plans FormatVersion - version of Execution Plan syntax format Version - version of Execution Plan Name - human-readable name of the Execution Plan Parameters - parameters received from MuranoPL Body - Python statement, should start with | symbol Scripts - dictionary that maps script names to script definitions.

Type: Deployment Platform name that script is targeted to. Version: optional minimum version of deployment platform/executor required by the

script. EntryPoint: relative path to the file that contains a script entry point Files: This is an optional array of additional files required for the script. Use <> to specify

a relative path to the file. The root directory is Resource/scripts. Options: an optional argument of type contains additional options

35

Page 35: OpenStack Murano introduction

Example - DeployTelnet.templateFormatVersion: 2.0.0

Version: 1.0.0

Name: Deploy Telnet

Parameters:

appName: $appName

Body: |

return deploy(args.appName).stdout

Scripts:

deploy:

Type: Application

Version: 1.0.0

EntryPoint: deployTelnet.sh

Files:

- installer.sh

- common.sh

Options:

captureStdout: true

captureStderr: false36

Like main func

Like sub func

Like 2>&1

Page 36: OpenStack Murano introduction

create application package Step 1. Prepare Execution Plans

Step 2. Prepare MuranoPL class definitions MuranoPL classes control application deployment workflow execution.

Namespaces:=: io.Murano.apps.linuxstd: io.Muranores: io.Murano.resources

Name: TelnetExtends: std:ApplicationProperties:

name:Contract: $.string().notNull()

instance:Contract: $.class(res:Instance).notNull()

Workflow:deploy:

Body:- $.instance.deploy()- $resources: new('io.Murano.system.Resources')- $template: $resources.json('DeployTelnet.template')- $.instance.agent.call($template, $resources) 37

Page 37: OpenStack Murano introduction

MuranoPL

Developed for managing complex compound applications with minimal code duplication.

Has YAML-based syntax.

Built on classes, composition and inheritance.

Safe enough to be used for execution of untrusted code

38

Page 38: OpenStack Murano introduction

Murano PL – YAQL(Yet Another Query Language) https://github.com/ativelkov/yaql query language designed as part of Murano project.

a language for expression evaluation

presence of ‘$’ sign

no built in list of functions

Everything YAQL can access is customizable 3* foo(3,6) depends on the implementation of ‘foo’ and operator ‘*’

$foo means get the value of $foo?

a lot of OOTB functions

no assignment operator in YAQL ‘=‘ means ‘==‘ in Python

39

Page 39: OpenStack Murano introduction

Murano PL – common class structure

Name: class name

Namespaces: namespaces specification

Extends: [list of parent classes]

Properties: properties declaration

Workflow:

methodName:

Arguments:

- list

- of

- arguments

Body:

- list

- of

- instructions

40

Murano.overview

class MyClass

(MyBase1, MyBase2,…):

name = ‘hello’

value = ‘world’

def say(self,*args,**kargs):

pass

def say_again(self, *args, **kargs):

pass

Page 40: OpenStack Murano introduction

Murano PL – common class structure-NamespacesNamespaces:

=: com.mirantis.Murano.services.windows

srv: com.mirantis.Murano.services

std: com.mirantis.Murano

srv:foo equals to com.mirantis.Murano.services.foo

‘=‘ means current namespace ‘MyClass’ equals com.mirantis.Murano.services.windows.MyClass

41

Page 41: OpenStack Murano introduction

Murano PL – common class structure- Extends

Extends: [base1, base2,..]

Extends: Base

Extends:

42

MyClass(base1,base2,..)

MyClass(Base)

MyClass(com.mirantis.Murano.Object)

Page 42: OpenStack Murano introduction

Murano PL – common class structure- Properties

propertyName:

Contract: property contract

Usage: property usage

Default: property default

43

Page 43: OpenStack Murano introduction

Murano PL – common class structure- Properties-Contract

YAQL expressions to define expected type of value and constraints imposed on this property.

44

Page 44: OpenStack Murano introduction

Murano PL – common class structure- Properties-contract

45

Page 45: OpenStack Murano introduction

Murano PL – common class structure-Properties-Usage Usage states purpose of the property.

indicates who and how can access the property

46

Page 46: OpenStack Murano introduction

Murano PL – common class structure-Properties-Default Specify the default value of the property

Conform to the constraints set by contract.

47

Page 47: OpenStack Murano introduction

Murano PL – common class structure-Workflow Workflows are the methods that together describe how the entities

that are represented by MuranoPL classes deployed.

48

methodName:Arguments:

- list- of- arguments

Body:- list - of- instructions

3 types of instructions

Expressions

Assignment

Block constructs

Page 48: OpenStack Murano introduction

Murano PL – common class structure-Workflow-Expression

49

• YAQL expressions

• in a syntax like $obj.methodName(arguments)

Page 49: OpenStack Murano introduction

Murano PL – common class structure-Workflow-Assignment

50

• YAQL expressions

• single-key dictionaries with YAQL expression as key and arbitrary structure as a value

Page 50: OpenStack Murano introduction

Murano PL – common class structure-Workflow-Blocks

51

• Block constructs control program flow.

Page 51: OpenStack Murano introduction

create application package

Step 1. Prepare Execution Plans

Step 2. Prepare MuranoPL class definitions

Step 3. Prepare Dynamic UI Form Definition

52

Page 52: OpenStack Murano introduction

Dynamic UI Goal

generate application creation forms "on-the-fly“

YAML format Version - points out to which syntax version is used, optional

Templates - optional, auxiliary section, using together with an Application section, optional

Application - object model description which will be used in application deployment, required

Forms - web form definitions, required

YAQL https://wiki.openstack.org/wiki/Murano/Documentation/DynamicUI#Dyna

mic_UI_Definition_specification

53

Page 53: OpenStack Murano introduction

Dynamic UI -telnet ui definition example

Version: 2

Templates:

instance:

?:

type: io.Murano.resources.Instance

name: generateHostname($.serviceConfiguration.unitNamingPattern, 1)

flavor: $.instanceConfiguration.flavor

image: $.instanceConfiguration.osImage

Application:

?:

type: io.Murano.apps.linux.Telnet

name: $.serviceConfiguration.name

instance: $instance54

Underline IAAS leve resource definition

Application modeling by MuranoPL

Page 54: OpenStack Murano introduction

Dynamic UI

55

UI elements is generated UI definition file

Page 55: OpenStack Murano introduction

Dynamic UI -telnet ui definition exampleForms:

- serviceConfiguration:

fields:

- name: title

type: string

required: false

hidden: true

description: Telnet service that can be installed at linux

- name: name

type: string

label: Service Name

description: >-

Enter a desired name for a service. Just A-Z, a-z, 0-9, dash and

underline are allowed.

minLength: 2

maxLength: 64

regexpValidator: '^[-\w]+$'

errorMessages:

invalid: Just letters, numbers, underscores and hyphens are allowed.

helpText: Just letters, numbers, underscores and hyphens are allowed. 56

Will be displayed in UI

Input Validation

Page 56: OpenStack Murano introduction

create application package

Step 1. Prepare Execution Plans

Step 2. Prepare MuranoPL class definitions

Step 3. Prepare Dynamic UI Form Definition

Step 4. Prepare application logo

57

Page 57: OpenStack Murano introduction

Step6. Prepare application logo

in .png format

58

Page 58: OpenStack Murano introduction

create application package

Step 1. Prepare Execution Plans

Step 2. Prepare MuranoPL class definitions

Step 3. Prepare Dynamic UI Form Definition

Step 4. Prepare application logo

Step 5. Prepare manifest file

59

Page 59: OpenStack Murano introduction

Prepare manifest file

in YAML format

should contains: Format - version of a manifest syntax format

Type - package type. Valid choices are: Library and Application

Name - human-readable application name

Description - a brief description of an application

Author - person or company name which created an application package

Classes - MuranoPL class list, on which application deployment is based

Tags - list of words, associated with this application. Will be helpful during the search.Optional parameter

60

Page 60: OpenStack Murano introduction

Prepare manifest file- example

Format: 1.0

Type: Application

FullName: io.Murano.apps.linux.Telnet

Name: Telnet

Description: |

Telnet is the traditional protocol for making remote console connections over TCP.

Author: 'Mirantis, Inc'

Tags: [Linux, connection]

Classes:

io.Murano.apps.linux.Telnet: telnet.yaml

UI: telnet.yaml

Logo: telnet.png61

Page 61: OpenStack Murano introduction

create application package

Step 1. Prepare Execution Plans

Step 2. Prepare MuranoPL class definitions

Step 3. Prepare Dynamic UI Form Definition

Step 4. Prepare application logo

Step 5. Prepare manifest file

Step 6. Compose a zip archive

62

Page 62: OpenStack Murano introduction

Compose a zip archive

Classes folder MuranoPL class definitions should be put inside this folder

Resources folder This folder should contain Execution scripts

Scripts folder All script files, needed for an application deployment should be placed here

UI folder Place dynamic ui yaml definitions here

logo.png Image file should be placed in the root folder. It can have any name, just specify it in

the manifest file.

manifest.yaml Application manifest file. It's an application entry point. The file name is fixed.

63

Page 63: OpenStack Murano introduction

Murano application anatomy by example

manifest.yaml

Logo.png

UI

Resources

Classes

64

Page 64: OpenStack Murano introduction

Resources

65

Deployment scripts

Deployment template in yaml format

Page 65: OpenStack Murano introduction

Resources

FormatVersion: 2.0.0

Version: 1.0.0

Name: Deploy Apache

Parameters:

enablePHP: $enablePHP

Body: |

return apacheDeploy('{0}'.format(args.enablePHP)).stdout

Scripts:

apacheDeploy:

Type: Application

Version: 1.0.0

EntryPoint: runApacheDeploy.sh

Files:

- <installer.sh>

- <common.sh>

Options:

captureStdout: true

captureStderr: true66

Page 66: OpenStack Murano introduction

ClassesNamespaces:

=: io.Murano.apps.apache

std: io.Murano

res: io.Murano.resources

sys: io.Murano.system

Name: Apache

Extends: std:Application

Properties:

name:

Contract: $.string().notNull()

enablePHP:

Contract: $.bool()

Default: false

instance:

Contract: $.class(res:Instance).notNull() 67

Page 67: OpenStack Murano introduction

manifest.yaml

68

Page 68: OpenStack Murano introduction

Logo or icon

69

Page 69: OpenStack Murano introduction

Murano best practices

Use Separate vHost in RabbitMQ

advantages this prevents queue name collisions

this prevents message stealing from queues

this simplify debugging

configure example># rabbitmqctl add_user Muranouser Muranopassword

># rabbitmqctl set_user_tags Muranouser administrator

># rabbitmqctl add_vhost Muranovhost

># rabbitmqctl set_permissions -p Muranovhost Muranouser ".*" ".*" ".*"

70

Page 70: OpenStack Murano introduction

Troubleshooting

71

Root cause:By default ,Murano needs a router name that contains keyword like Murano and external network

solution:modify the /etc/Murano/Murano.conf in [networking] section[networking]…external_network=<your_existing_network_name>router_name=<your_exiting_router_name>…

Page 71: OpenStack Murano introduction

Troubleshooting(1)

Issue Failed to provision instance, nova report failed to plug vif

72

Root cause:This is a known issue in juno

solution:

Page 72: OpenStack Murano introduction

Troubleshooting(2)

Issue access meta data failed

73

Root cause:The neutron meta data service cannot authenticate against keystone

solution:vi /etc/neutron/metadata_agent.ini

Page 73: OpenStack Murano introduction

Troubleshooting(3)

Issue agent failed to execute the execution plan

74

Possible Root cause:1. Murano-agent

cannot connect to the rabbitmq server

2. Murano-agent failed find the message in queue

solution:As for No1., check the rabbitmq server status via cli#rabbitmqctl statusAs for No2.login to vm instancecheck the /etc/Murano/agent.conf to find the input_queue idfind if the message by this input_queue in rabbitmq

Page 74: OpenStack Murano introduction

Understand how Murano agent works

75

Murano-agent.conf

rabb

itmq

VM

heat-client

Murano-agent❹

❸❺

❶ heat picks up the message from rabbitmq

❷ heat will generate the Murano-agent.conf using cloud-init

❸ Murano agent will use this agent.conf file to find the right rabbitmq server and the input_queue

❹ Murano agent will pickup the right message from rabbitmq

❺ Murano agent will execute the execution plan beard in the message

execution plans

Page 75: OpenStack Murano introduction

/var/lib/heat-cfntools/cfn-userdata

root@Murano-tkuoai2lpm47x1-nwhcoi2lplzls1-bsojzo5io7vr:~# cat /var/lib/heat-cfntools/cfn-userdata

#!/bin/sh

service Murano-agent stop

AgentConfigBase64='W0RFRkFVTFRdCmRlYnVnPVRydWUKdmVyYm9zZT1UcnVlCmxvZ19maWxlID0gL3Zhci9sb2cvbXVyYW5vLWFnZW50LmxvZwoKc3RvcmFnZT0vdmFyL211cmFuby9wbGFucwoKW3JhYmJpdG1xXQoKIyBJbnB1dCBxdWV1ZSBuYW1lCmlucHV0X3F1ZXVlID0gZWNjZWNkNTBjMWM0ZjQ5NWE5MjYwY2NlNWZhNGNmOWRhLWg1YTU0ZDUwOC1iNTZmLTRkNDYtODJiZC03MTVmMjRhMjA3MDcKCiMgT3V0cHV0IHJvdXRpbmcga2V5ICh1c3VhbGx5IHF1ZXVlIG5hbWUpCnJlc3VsdF9yb3V0aW5nX2tleSA9IC1leGVjdXRpb24tcmVzdWx0cy10a3VvYWkybHBtNDd4MQoKIyBDb25uZWN0aW9uIHBhcmFtZXRlcnMgdG8gUmFiYml0TVEgc2VydmljZQoKIyBIb3N0bmFtZSBvciBJUCBhZGRyZXNzIHdoZXJlIFJhYmJpdE1RIGlzIGxvY2F0ZWQuCmhvc3QgPSAxOTIuODUuMTgwLjEzOAoKIyBSYWJiaXRNUSBwb3J0ICg1NjcyIGlzIGEgZGVmYXVsdCkKcG9ydCA9IDU2NzIKCiMgVXNlIFNTTCBmb3IgUmFiYml0TVEgY29ubmVjdGlvbnMgKFRydWUgb3IgRmFsc2UpCnNzbCA9IGZhbHNlCgojIFBhdGggdG8gU1NMIENBIGNlcnRpZmljYXRlIG9yIGVtcHR5IHRvIGFsbG93IHNlbGYgc2lnbmVkIHNlcnZlciBjZXJ0aWZpY2F0ZQpjYV9jZXJ0cyA9CgojIFJhYmJpdE1RIGNyZWRlbnRpYWxzLiBGcmVzaCBSYWJiaXRNUSBpbnN0YWxsYXRpb24gaGFzICJndWVzdCIgYWNjb3VudCB3aXRoICJndWVzdCIgcGFzc3dvcmQuCmxvZ2luID0gZ3Vlc3QKcGFzc3dvcmQgPSBwYXNzd29yZAoKIyBSYWJiaXRNUSB2aXJ0dWFsIGhvc3QgKHZob3N0KS4gRnJlc2ggUmFiYml0TVEgaW5zdGFsbGF0aW9uIGhhcyAiLyIgdmhvc3QgcHJlY29uZmlndXJlZC4KdmlydHVhbF9ob3N0ID0gLwo='

if [ ! -d /etc/Murano ]; then

mkdir /etc/Murano

fi

echo $AgentConfigBase64 | base64 -d > /etc/Murano/agent.conf

chmod 664 /etc/Murano/agent.conf

service Murano-agent start

76

root@Murano-tkuoai2lpm47x1-nwhcoi2lplzls1-bsojzo5io7vr:~# echo $AgentConfigBase64 | base64 -d[DEFAULT]debug=Trueverbose=Truelog_file = /var/log/Murano-agent.log

storage=/var/Murano/plans

[rabbitmq]

# Input queue nameinput_queue = eccecd50c1c4f495a9260cce5fa4cf9da-h5a54d508-b56f-4d46-82bd-715f24a20707

# Output routing key (usually queue name)result_routing_key = -execution-results-tkuoai2lpm47x1

# Connection parameters to RabbitMQ service

# Hostname or IP address where RabbitMQ is located.host = 192.85.180.138

# RabbitMQ port (5672 is a default)port = 5672

# Use SSL for RabbitMQ connections (True or False)ssl = false

# Path to SSL CA certificate or empty to allow self signed server certificateca_certs =

# RabbitMQ credentials. Fresh RabbitMQ installation has "guest" account with "guest" password.login = guestpassword = password

# RabbitMQ virtual host (vhost). Fresh RabbitMQ installation has "/" vhost preconfigured.virtual_host = /

Page 76: OpenStack Murano introduction

Murano-agent.conf

77

root@Murano-tkuoai2lpm47x1-nwhcoi2lplzls1-bsojzo5io7vr:~# echo $AgentConfigBase64 | base64 -d[DEFAULT]debug=Trueverbose=Truelog_file = /var/log/Murano-agent.log

storage=/var/Murano/plans

[rabbitmq]

# Input queue nameinput_queue = eccecd50c1c4f495a9260cce5fa4cf9da-h5a54d508-b56f-4d46-82bd-715f24a20707

# Output routing key (usually queue name)result_routing_key = -execution-results-tkuoai2lpm47x1

# Connection parameters to RabbitMQ service

# Hostname or IP address where RabbitMQ is located.host = 192.85.180.138

# RabbitMQ port (5672 is a default)port = 5672

# Use SSL for RabbitMQ connections (True or False)ssl = false

# Path to SSL CA certificate or empty to allow self signed server certificateca_certs =

# RabbitMQ credentials. Fresh RabbitMQ installation has "guest" account with "guest" password.login = guestpassword = password

# RabbitMQ virtual host (vhost). Fresh RabbitMQ installation has "/" vhost preconfigured.virtual_host = /

Page 77: OpenStack Murano introduction

check the message in rabbitmq {"Body": "return apacheDeploy('{0}'.format(args.enablePHP)).stdout\n", "Files": {"f17cecd3704f4a958b3f4998617ce8dc": {"Body":

"IyEvYmluL2Jhc2gKIwpJTlNUQUxMRVJfT1BUUz0iIgpVTklOU1RBTExFUl9PUFRTPSIiClBNR1I9\nIiIKUE1HUl9MSVNUX09QVFM9IiIKCmZ1bmN0aW9uIGluY2x1ZGUoKXsKICAgIGN1cnJfZGlyPSQo\nY2QgJChkaXJuYW1lICIkMCIpICYmIHB3ZCkKICAgIGluY19maWxlX3BhdGg9JGN1cnJfZGlyLyQx\nCiAgICBpZiBbIC1mICIkaW5jX2ZpbGVfcGF0aCIgXTsgdGhlbgogICAgICAgIC4gJGluY19maWxl\nX3BhdGgKICAgIGVsc2UKICAgICAgICBleGl0IDEKICAgIGZpCn0KZnVuY3Rpb24gc2V0X2luc3Rh\nbGxfb3B0aW9ucygpewogICAgY2FzZSAkMSBpbgogICAgICAgIGFwdC1nZXQgKQogICAgICAgICAg\nICBJTlNUQUxMRVJfT1BUUz0iLXkgLXEgaW5zdGFsbCIKICAgICAgICAgICAgVU5JTlNUQUxMRVJf\nT1BUUz0iLXkgLXEgcmVtb3ZlIgogICAgICAgICAgICBQTUdSPSJkcGtnIgogICAgICAgICAgICBQ\nTUdSX0xJU1RfT1BUUz0iLXMiCiAgICAgICAgICAgIDs7CiAgICAgICAgeXVtICkKICAgICAgICAg\nICAgSU5TVEFMTEVSX09QVFM9Ii0tYXNzdW1leWVzIGluc3RhbGwiCiAgICAgICAgICAgIFVOSU5T\nVEFMTEVSX09QVFM9Ii0tYXNzdW1leWVzIGVyYXNlIgogICAgICAgICAgICBQTUdSPSJycG0iCiAg\nICAgICAgICAgIFBNR1JfTElTVF9PUFRTPSItcSIKICAgICAgICAgICAgOzsKICAgICAgICB1cnBt\nKiApCiAgICAgICAgICAgIElOU1RBTExFUl9PUFRTPSIteSIKICAgICAgICAgICAgVU5JTlNUQUxM\nRVJfT1BUUz0iIgogICAgICAgICAgICBQTUdSPSJycG0iCiAgICAgICAgICAgIFBNR1JfTElTVF9P\nUFRTPSItcSIKICAgICAgICAgICAgOzsKICAgICAgICB6eXBwZXIgKQogICAgICAgICAgICBJTlNU\nQUxMRVJfT1BUUz0iaW5zdGFsbCIKICAgICAgICAgICAgVU5JTlNUQUxMRVJfT1BUUz0icmVtb3Zl\nIC0tcXVpZXQiCiAgICAgICAgICAgIFBNR1I9InJwbSIKICAgICAgICAgICAgUE1HUl9MSVNUX09Q\nVFM9Ii1xIgogICAgICAgICAgICA7OwogICAgICAgIHBpcCApCiAgICAgICAgICAgIElOU1RBTExF\nUl9PUFRTPSJpbnN0YWxsIgogICAgICAgICAgICBVTklOU1RBTExFUl9PUFRTPSJ1bmluc3RhbGwg\nLS15ZXMiCiAgICAgICAgICAgIGZpbmRfcGlwCiAgICAgICAgICAgIFBBQ0tBR0VSPSRQSVBDTUQK\nICAgICAgICAgICAgUE1HUj0kUElQQ01ECiAgICAgICAgICAgIFBNR1JfTElTVF9PUFRTPSJmcmVl\nemUgfCBncmVwIgogICAgICAgICAgICA7OwogICAgICAgICogKQogICAgICAgICAgICBleGl0IDEK\nICAgICAgICAgICAgOzsKICAgIGVzYWMKICAgIFBBQ0tBR0VSPSQod2hpY2ggJDEpCiAgICBpZiBb\nICQ/IC1uZSAwIF07IHRoZW4KICAgICAgICBsb2cgIkNhbid0IGZpbmQgXCIkMVwiLCBleGl0aW5n\nISIKICAgICAgICBleGl0IDEKICAgIGZpCn0KZnVuY3Rpb24gcGFja2FnZV9pbnN0YWxsKCl7CiAg\nICBQS0c9JDEKICAgIGV2YWwgIiRQTUdSICRQTUdSX0xJU1RfT1BUUyAkUEtHIiA+IC9kZXYvbnVs\nbCAyPiYxCiAgICBpZiBbICQ/IC1lcSAwIF07IHRoZW4KICAgICAgICBsb2cgIlwiJFBLR1wiIGFs\ncmVhZHkgaW5zdGFsbGVkIgogICAgZWxzZQogICAgICAgIGxvZyAiSW5zdGFsbGluZyBcIiRQS0dc\nIiAuLi4iCiAgICAgICAgJFBBQ0tBR0VSICRJTlNUQUxMRVJfT1BUUyAkUEtHID4gL2Rldi9udWxs\nIDI+JjEKICAgICAgICBpZiBbICQ/IC1uZSAwIF07IHRoZW4KICAgICAgICAgICAgbG9nICJcIiRQ\nS0dcIiBpbnN0YWxsYXRpb24gZmFpbHMsIGV4aXRpbmchIgogICAgICAgICAgICBleGl0IDEKICAg\nICAgICBlbHNlCiAgICAgICAgICAgIGxvZyAiXHRcdC4uLnN1Y2Nlc3MiCiAgICAgICAgZmkKICAg\nIGZpCn0KZnVuY3Rpb24gcGFja2FnZV91bmluc3RhbGwoKXsKICAgIFBLRz0kMQogICAgZXZhbCAi\nJFBNR1IgJFBNR1JfTElTVF9PUFRTICRQS0ciID4gL2Rldi9udWxsIDI+JjEKICAgIGlmIFsgJD8g\nLWVxIDEgXTsgdGhlbgogICAgICAgIGxvZyAiXCIkUEtHXCIgbm90IGluc3RhbGxlZCIKICAgIGVs\nc2UKICAgICAgICBsb2cgIlVubnN0YWxsaW5nIFwiJFBLR1wiIC4uLiIKICAgICAgICAkUEFDS0FH\nRVIgJFVOSU5TVEFMTEVSX09QVFMgJFBLRyA+IC9kZXYvbnVsbCAyPiYxCiAgICAgICAgaWYgWyAk\nPyAtbmUgMCBdOyB0aGVuCiAgICAgICAgICAgIGxvZyAiXCIkUEtHXCIgdW5pbnN0YWxsYXRpb24g\nZmFpbHMsIGV4aXRpbmchIgogICAgICAgICAgICBleGl0IDEKICAgICAgICBlbHNlCiAgICAgICAg\nICAgIGxvZyAiXHRcdC4uLnN1Y2Nlc3MiCiAgICAgICAgZmkKICAgIGZpCn0KZnVuY3Rpb24gcnVu\nX2luc3RhbGwoKXsKICAgIGZvciBQS0cgaW4gJEAKICAgIGRvCiAgICAgICAgcGFja2FnZV9pbnN0\nYWxsICRQS0cKICAgIGRvbmUKfQpmdW5jdGlvbiBydW5fdW5pbnN0YWxsKCl7CiAgICBmb3IgUEtH\nIGluICRACiAgICBkbwogICAgICAgIHBhY2thZ2VfdW5pbnN0YWxsICRQS0cKICAgIGRvbmUKfQoj\nIE1haW4gd29ya2Zsb3cKaW5jbHVkZSAiY29tbW9uLnNoIgppZiBbICQjIC1lcSAwIF07IHRoZW4K\nICAgIHNjcmlwdD0kKGJhc2VuYW1lICQwKQogICAgZWNobyAtZSAiVXNhZ2U6XG5cdCogaW5zdGFs\nbCBwYWNrYWdlcyAtLSAuLyRzY3JpcHQgLXAgcGFja2FnZV9tYW5hZ2VyIC1pIHBhY2thZ2UwIFtw\nYWNrYWdlTl1cblx0KiByZW1vdmUgcGFja2FnZXMgLS0gLi8kc2NyaXB0IC1wIHBhY2thZ2VfbWFu\nYWdlciAtciBwYWNrYWdlMCBbcGFja2FnZU5dIgogICAgZXhpdCAxCmZpClBhY2thZ2VyPScnCmdl\ndF9vcwppZiBbICQ/IC1uZSAwIF07IHRoZW4KICAgIGxvZyAiVW5zdXBwb3J0ZWQgKm5peCB2ZXJz\naW9uICgkRGlzdHJvQmFzZWRPbiAtICRESVNULyRQU1VFRE9OQU1FLyRSRVYvJE1BQ0gpIgogICAg\nZXhpdCAxCmZpCndoaWxlIGdldG9wdHMgIjpwOmk6cjoiIG9wdCA7IGRvCiAgICBjYXNlICIkb3B0\nIiBpbgogICAgICAgIHApCiAgICAgICAgICAgIGlmIFtbICIkT1BUQVJHIiAhPSBzeXMgXV07IHRo\nZW4KICAgICAgICAgICAgICAgIFBhY2thZ2VyPSRPUFRBUkcKICAgICAgICAgICAgZmkKICAgICAg\nICAgICAgc2V0X2luc3RhbGxfb3B0aW9ucyAkUGFja2FnZXIKICAgICAgICAgICAgOzsKICAgICAg\nICBpKQogICAgICAgICAgICBuPSRPUFRBUkcKICAgICAgICAgICAgcnVuX2luc3RhbGwgJChjb2xs\nZWN0X2FyZ3MgJG4gJEApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICA7OwogICAgICAg\nIHIpCiAgICAgICAgICAgIG49JE9QVEFSRwogICAgICAgICAgICBydW5fdW5pbnN0YWxsICQoY29s\nbGVjdF9hcmdzICRuICRAKQogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgOzsKICAgICAg\nICBcPykKICAgICAgICAgICAgbG9nICJJbnZhbGlkIG9wdGlvbjogLSRPUFRBUkciID4mMgogICAg\nICAgICAgICBleGl0IDEKICAgICAgICAgICAgOzsKICAgIGVzYWMKZG9uZQpzaGlmdCAkKChPUFRJ\nTkQtMSkp\n", "BodyType": "Base64", "Name": "installer.sh"}, "6cbbe00d1e974b0b8d929c4fe5945b0b": {"Body": "IyEvYmluL2Jhc2gKIyAKREVCVUdMVkw9MwpMT0dGSUxFPS90bXAvbXVyYW5vZGVwbG95bWVudC5s\nb2cKUElQQVBQUz0icGlwIHB5dGhvbi1waXAgcGlwLXB5dGhvbiIKUElQQ01EPSIiCmlmIFsgIiRE\nRUJVR0xWTCIgLWVxIDQgXTsgdGhlbgogICAgc2V0IC14CmZpCmZ1bmN0aW9uIGxvZyB7CiAgICBp\nZiBbICIkREVCVUdMVkwiIC1ndCAwIF07IHRoZW4KICAgICAgICBjaGFycz0kKGVjaG8gIkAkIiB8\nIHdjIC1jKQogICAgICAgIGNhc2UgJERFQlVHTFZMIGluCiAgICAgICAgICAgIDEgKQogICAgICAg\nICAgICAgICAgZWNobyAtZSAiTE9HOj4kQCIKICAgICAgICAgICAgICAgIDs7CiAgICAgICAgICAg\nIDIpCiAgICAgICAgICAgICAgICBlY2hvIC1lICIkKGRhdGUgKyIlbS0lZC0lWSAlSDolTSIpIExP\nRzo+JEAiIHwgdGVlIC0tYXBwZW5kICRMT0dGSUxFCiAgICAgICAgICAgICAgICA7OwogICAgICAg\nICAgICAzKQogICAgICAgICAgICAgICAgZWNobyAtZSAiJChkYXRlICsiJW0tJWQtJVkgJUg6JU0i\nKSBMT0c6PiRAIiA+PiAkTE9HRklMRQogICAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgNCkK\nICAgICAgICAgICAgICAgIGVjaG8gLWUgIiQoZGF0ZSArIiVtLSVkLSVZICVIOiVNIikgTE9HOj4k\nQCIgfCB0ZWUgLS1hcHBlbmQgJExPR0ZJTEUKICAgICAgICAgICAgICAgIDs7CiAgICAgICAgZXNh\nYwogICAgZmkKfQpmdW5jdGlvbiBsb3dlcmNhc2UoKXsKICAgIGVjaG8gIiQxIiB8IHNlZCAieS9B\nQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8iCn0K\nZnVuY3Rpb24gZmluZF9waXAoKQp7CiAgICBmb3IgY21kIGluICRQSVBBUFBTCiAgICBkbwogICAg\nICAgIF9jbWQ9JCh3aGljaCAkY21kIDI+L2Rldi9udWxsKQogICAgICAgIGlmIFsgJD8gLWVxIDAg\nXTt0aGVuCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGZpCiAgICBkb25lCiAgICBpZiBb\nIC16ICRfY21kIF07dGhlbgogICAgICAgIGVjaG8gIkNhbid0IGZpbmQgXCJwaXBcIiBpbiBzeXN0\nZW0sIHBsZWFzZSBpbnN0YWxsIGl0IGZpcnN0LCBleGl0aW5nISIKICAgICAgICBleGl0IDEKICAg\nIGVsc2UKICAgICAgICBQSVBDTUQ9JF9jbWQKICAgIGZpCn0KT1BUSU5EPTEgIyBSZXNldCBpZiBn\nZXRvcHRzIHVzZWQgcHJldmlvdXNseQpmdW5jdGlvbiBjb2xsZWN0X2FyZ3MoKXsKICAgIF9uPSQx\nCiAgICBzaGlmdAogICAgQVJHUz0nJwogICAgd2hpbGUgdHJ1ZQogICAgZG8KICAgICAgICBpZiBb\nWyAiJF9uIiA9PSAtKiBdXSB8fCBbIC16ICIkX24iIF07IHRoZW4KICAgICAgICAgICAgT1BUSU5E\nPSQoKE9QVElORCAtIDEpKQogICAgICAgICAgICBicmVhawogICAgICAgIGZpCiAgICAgICAgI2Vj\naG8gIl9uPSRfbiA7ICRPUFRJTkQiCiAgICAgICAgaWYgWyAteiAiJEFSR1MiIF07IHRoZW4KICAg\nICAgICAgICAgQVJHUz0kT1BUQVJHCiAgICAgICAgZWxzZQogICAgICAgICAgICBBUkdTPSIkQVJH\nUyAkX24iCiAgICAgICAgZmkKICAgICAgICBldmFsIF9uPVwkJE9QVElORAogICAgICAgIE9QVElO\nRD0kKChPUFRJTkQgKyAxKSkKICAgICAgICAjc2xlZXAgMQogICAgZG9uZQogICAgZWNobyAkQVJH\nUwogICAgdW5zZXQgX24KICAgIHVuc2V0IEFSR1MKfQpmdW5jdGlvbiBnZXRfb3MoKXsKICAgIEtF\nUk5FTD0kKHVuYW1lIC1yKQogICAgTUFDSD0kKHVuYW1lIC1tKQogICAgT1M9JCh1bmFtZSkKICAg\nIGlmIFsgIiR7T1N9IiA9ICJMaW51eCIgXSA7IHRoZW4KICAgICAgICBpZiBbIC1mIC9ldGMvcmVk\naGF0LXJlbGVhc2UgXSA7IHRoZW4KICAgICAgICAgICAgRGlzdHJvQmFzZWRPbj0nUmVkSGF0Jwog\nICAgICAgICAgICBQYWNrYWdlcj0neXVtJwogICAgICAgICAgICBESVNUPSQoY2F0IC9ldGMvcmVk\naGF0LXJlbGVhc2UgfHNlZCBzL1wgcmVsZWFzZS4qLy8pCiAgICAgICAgICAgIFBTVUVET05BTUU9\nJChjYXQgL2V0Yy9yZWRoYXQtcmVsZWFzZSB8IHNlZCBzLy4qXCgvLyB8IHNlZCBzL1wpLy8pCiAg\nICAgICAgICAgIFJFVj0kKGNhdCAvZXRjL3JlZGhhdC1yZWxlYXNlIHwgc2VkIHMvLipyZWxlYXNl\nXCAvLyB8IHNlZCBzL1wgLiovLykKICAgICAgICBlbGlmIFsgLWYgL2V0Yy9TdVNFLXJlbGVhc2Ug\nXSA7IHRoZW4KICAgICAgICAgICAgRGlzdHJvQmFzZWRPbj0nU3VTZScKICAgICAgICAgICAgUGFj\na2FnZXI9J3p5cHBlcicKICAgICAgICAgICAgUFNVRURPTkFNRT0kKGNhdCAvZXRjL1N1U0UtcmVs\nZWFzZSB8IHRyICJcbiIgJyAnfCBzZWQgcy9WRVJTSU9OLiovLykKICAgICAgICAgICAgUkVWPSQo\nY2F0IC9ldGMvU3VTRS1yZWxlYXNlIHwgdHIgIlxuIiAnICcgfCBzZWQgcy8uKj1cIC8vKQogICAg\nICAgIGVsaWYgWyAtZiAvZXRjL21hbmRyYWtlLXJlbGVhc2UgXSA7IHRoZW4KICAgICAgICAgICAg\nRGlzdHJvQmFzZWRPbj0nTWFuZHJha2UnCiAgICAgICAgICAgIFBhY2thZ2VyPSd1cnBtaSB1cnBt\nZScKICAgICAgICAgICAgUFNVRURPTkFNRT0kKGNhdCAvZXRjL21hbmRyYWtlLXJlbGVhc2UgfCBz\nZWQgcy8uKlwoLy8gfCBzZWQgcy9cKS8vKQogICAgICAgICAgICBSRVY9JChjYXQgL2V0Yy9tYW5k\ncmFrZS1yZWxlYXNlIHwgc2VkIHMvLipyZWxlYXNlXCAvLyB8IHNlZCBzL1wgLiovLykKICAgICAg\nICBlbGlmIFsgLWYgL2V0Yy9kZWJpYW5fdmVyc2lvbiBdIDsgdGhlbgogICAgICAgICAgICBEaXN0\ncm9CYXNlZE9uPSdEZWJpYW4nCiAgICAgICAgICAgIFBhY2thZ2VyPSdhcHQtZ2V0JwogICAgICAg\nICAgICBESVNUPSQoY2F0IC9ldGMvbHNiLXJlbGVhc2UgfCBncmVwICdeRElTVFJJQl9JRCcgfCBh\nd2sgLUY9ICAneyBwcmludCAkMiB9JykKICAgICAgICAgICAgUFNVRURPTkFNRT0kKGNhdCAvZXRj\nL2xzYi1yZWxlYXNlIHwgZ3JlcCAnXkRJU1RSSUJfQ09ERU5BTUUnIHwgYXdrIC1GPSAgJ3sgcHJp\nbnQgJDIgfScpCiAgICAgICAgICAgIFJFVj0kKGNhdCAvZXRjL2xzYi1yZWxlYXNlIHwgZ3JlcCAn\nXkRJU1RSSUJfUkVMRUFTRScgfCBhd2sgLUY9ICAneyBwcmludCAkMiB9JykKICAgICAgICBmaQog\nICAgICAgIGlmIFsgLWYgL2V0Yy9Vbml0ZWRMaW51eC1yZWxlYXNlIF0gOyB0aGVuCiAgICAgICAg\nICAgIERJU1Q9IiR7RElTVH1bJChjYXQgL2V0Yy9Vbml0ZWRMaW51eC1yZWxlYXNlIHwgdHIgIlxu\nIiAnICcgfCBzZWQgcy9WRVJTSU9OLiovLyldIgogICAgICAgIGZpCiAgICAgICAgT1M9JChsb3dl\ncmNhc2UgJE9TKQogICAgICAgIERpc3Ryb0Jhc2VkT249JChsb3dlcmNhc2UgJERpc3Ryb0Jhc2Vk\nT24pCiAgICAgICAgcmVhZG9ubHkgT1MKICAgICAgICByZWFkb25seSBESVNUCiAgICAgICAgcmVh\nZG9ubHkgRGlzdHJvQmFzZWRPbgogICAgICAgIHJlYWRvbmx5IFBTVUVET05BTUUKICAgICAgICBy\nZWFkb25seSBSRVYKICAgICAgICByZWFkb25seSBLRVJORUwKICAgICAgICByZWFkb25seSBNQUNI\nCiAgICAgICAgI3JlYWRvbmx5IFBhY2thZ2VyCiAgICBlbHNlCiAgICAgICAgT1M9dW5rbm93bgog\nICAgICAgIHJlYWRvbmx5IE9TCiAgICAgICAgbG9nICJPUzokT1MiCiAgICAgICAgZXhpdCAxCiAg\nICBmaQp9CmZ1bmN0aW9uIGFkZF9md19ydWxlKCl7CiAgICBfcnVsZV9zdHJpbmc9JEAKICAgIF90\nbXBfZndfcG9ydD0kKGVjaG8gJF9ydWxlX3N0cmluZyB8IGdyZXAgLW8gLWUgImRwb3J0IFswLTld\nKlxzIikKICAgIF90bXBfZndfcHJvdG89JChlY2hvICRfcnVsZV9zdHJpbmcgfCBncmVwIC1vIC1l\nICItcCBcdypccyIpCiAgICBfZndfcG9ydD0kKGVjaG8gJF90bXBfZndfcG9ydCB8IGF3ayAne3By\naW50ICQyfScpCiAgICBfZndfcHJvdG89JChlY2hvICRfdG1wX2Z3X3Byb3RvIHxhd2sgJ3twcmlu\ndCAkMn0nKQogICAgX2Z3X3JlbG9hZD0iIgogICAgI2ZpbmQgaXB0YWJsZXMgYW5kIGFkZCBydWxl\nCiAgICBjYXNlICRESVNUIGluCiAgICAgICAgIkZlZG9yYSIpCiAgICAgICAgICAgIF9md19jbWQ9\nJCh3aGljaCBmaXJld2FsbC1jbWQpCiAgICAgICAgICAgIF9md19wb3J0PSQoZWNobyAkX3J1bGVf\nc3RyaW5nIHwgZ3JlcCAtbyAtZSAiZHBvcnQgWzAtOV0qXHMiIHwgYXdrICd7cHJpbnQgJDJ9JykK\nICAgICAgICAgICAgX2Z3X3Byb3RvPSQoZWNobyAkX3J1bGVfc3RyaW5nIHwgZ3JlcCAtbyAtZSAi\nLXAgXHcqXHMiIHwgYXdrICd7cHJpbnQgJDJ9JykKICAgICAgICAgICAgX2Z3X3J1bGU9Ii0tcGVy\nbWFuZW50IC0tYWRkLXBvcnQ9JF9md19wb3J0LyRfZndfcHJvdG8iCiAgICAgICAgICAgIF9md19l\nbmFibGVfcnVsZXM9IiRfZndfY21kIC0tcmVsb2FkIgogICAgICAgICAgICA7OwogICAgICAgICop\nCiAgICAgICAgICAgIF9md19jbWQ9JCh3aGljaCBpcHRhYmxlcykKICAgICAgICAgICAgX2Z3X3J1\nbGU9JF9ydWxlX3N0cmluZwogICAgICAgICAgICBfZndfZW5hYmxlX3J1bGVzPSJzZXJ2aWNlICQo\nYmFzZW5hbWUgJF9md19jbWQpIHNhdmUiCiAgICAgICAgICAgIDs7CiAgICBlc2FjCiAgICBpcHRj\nbWRzYXZlPSQod2hpY2ggaXB0YWJsZXMtc2F2ZSkKICAgIGlmIFtbICIkX2Z3X2NtZCIgIT0gJycg\nXV0gJiYgW1sgIiRpcHRjbWRzYXZlIiAhPSAnJyBdXTsgdGhlbgogICAgICAgIGV2YWwgIiRpcHRj\nbWRzYXZlIHwgZ3JlcCAtZSBcIiRfdG1wX2Z3X3BvcnRcIiB8IGdyZXAgLWUgXCIkX3RtcF9md19w\ncm90b1wiIiA+IC9kZXYvbnVsbCAyPiYxCiAgICAgICAgaWYgWyAkPyAtbmUgMCBdOyB0aGVuCiAg\nICAgICAgICAgIGV2YWwgJF9md19jbWQgJF9md19ydWxlCiAgICAgICAgICAgIGlmIFsgJD8gLW5l\nIDAgXTsgdGhlbgogICAgICAgICAgICAgICAgbG9nICJDYW4ndCBzZXQgZmlyZXdhbGwgcnVsZXMs\nIGV4aXRpbmcuLi4iCiAgICAgICAgICAgICAgICBleGl0IDEKICAgICAgICAgICAgZWxzZQogICAg\nICAgICAgICAgICAgaWYgWyAtbiAiJF9md19lbmFibGVfcnVsZXMiIF07IHRoZW4KICAgICAgICAg\nICAgICAgICAgICBsb2cgIlJ1bm5pbmcgXCIkX2Z3X2VuYWJsZV9ydWxlc1wiIgogICAgICAgICAg\nICAgICAgICAgICRfZndfZW5hYmxlX3J1bGVzID4gL2Rldi9udWxsCiAgICAgICAgICAgICAgICBm\naQogICAgICAgICAgICAgICAgbG9nICIkX2Z3X2NtZCBydWxlIHdpdGggJF9md19ydWxlIHNldC4i\nCiAgICAgICAgICAgIGZpCiAgICAgICAgZWxzZQogICAgICAgICAgICBsb2cgIiRfZndfY21kIHJ1\nbGUgZXhpc3RzLiIKICAgICAgICBmaQogICAgZWxzZQogICAgICAgIGxvZyAiVGhlcmUgYXJlIG5v\nIGZ3IGZvdW5kLi4uIgogICAgZmkKfQpmdW5jdGlvbiBlbmFibGVfaW5pdCgpewogICAgX2luaXRj\ndHJsPSIiCiAgICBfaW5pdF9zdWZmaXg9IiIKICAgIF9zZXJ2aWNlPSQxCiAgICBjYXNlICREaXN0\ncm9CYXNlZE9uIGluCiAgICAgICAgImRlYmlhbiIpCiAgICAgICAgICAgIF9pbml0Y3RybD0idXBk\nYXRlLXJjLmQiCiAgICAgICAgICAgIF9pbml0X3N1ZmZpeD0iZGVmYXVsdHMiCiAgICAgICAgICAg\nIDs7CiAgICAgICAgKikKICAgICAgICAgICAgX2luaXRjdHJsPSJjaGtjb25maWciCiAgICAgICAg\nICAgIF9pbml0X3N1ZmZpeD0ib24iCiAgICAgICAgICAgIDs7CiAgICBlc2FjCiAgICAkX2luaXRj\ndHJsICRfc2VydmljZSAkX2luaXRfc3VmZml4CiAgICBpZiBbICQ/IC1uZSAwIF07IHRoZW4KICAg\nICAgICBsb2cgIiRfaW5pdGN0cmwgJF9zZXJ2aWNlICRfaW5pdF9zdWZmaXggLSBmYWlscyEiCiAg\nICAgICAgZXhpdCAxCiAgICBmaQp9CmZ1bmN0aW9uIHJlc3RhcnRfc2VydmljZSgpewogICAgX3Nl\ncnZpY2U9JDEKICAgIHNlcnZpY2UgJF9zZXJ2aWNlIHJlc3RhcnQgPiAvZGV2L251bGwgMj4mMQog\nICAgaWYgWyAkPyAtbmUgMCBdOyB0aGVuCiAgICAgICAgbG9nICJDYW4ndCBzdGFydCAkX3NlcnZp\nY2Ugc2VydmljZSEiCiAgICAgICAgZXhpdCAxCiAgICBmaQp9CmZ1bmN0aW9uIHBhY2thZ2VfcmVu\nYW1lcigpewogICAgX3BrZz0kMQogICAgY2FzZSAkRGlzdHJvQmFzZWRPbiBpbgogICAgICAgICJk\nZWJpYW4iKQogICAgICAgICAgICBfcGtnPSQoZWNobyAkX3BrZyB8IHNlZCAncy8tZGV2ZWwkLy1k\nZXYvJykKICAgICAgICAgICAgOzsKICAgICAgICAqKQogICAgICAgICAgICBfcGtnPSQoZWNobyAk\nX3BrZyB8IHNlZCAncy8tZGV2JC8tZGV2ZWwvJykKICAgICAgICAgICAgOzsKICAgIGVzYWMKICAg\nIGVjaG8gJF9wa2cKfQ==\n", "BodyType": "Base64", "Name": "common.sh"}, "c6119b50f94244409ec0f89714a8a63a": {"Body": "#!/bin/bash\n#\nfunction include(){\n curr_dir=$(cd $(dirname \"$0\") && pwd)\n inc_file_path=$curr_dir/$1\n if [ -f \"$inc_file_path\" ]; then\n . $inc_file_path\n else\n echo -e \"$inc_file_path not found!\"\n exit 1\n fi\n}\ninclude \"common.sh\"\n# FirewallRules\nFW_RULE1='-I INPUT 1 -p tcp -m tcp --dport 443 -j ACCEPT -m comment --comment \"by Murano, Apache server access on HTTPS port 443\"'\nFW_RULE2='-I INPUT 1 -p tcp -m tcp --dport 80 -j ACCEPT -m comment --comment \"by Murano, Apache server access on HTTP port 80\"'\nAPP=''\nget_os\n[[ $? -ne 0 ]] && exit 1\ncase $DistroBasedOn in\n \"debian\")\n APP=\"apache2\"\n ;;\n \"redhat\")\n APP=\"httpd\"\n ;;\nesac\n_php=\"\"\nif [[ \"$1\" == \"True\" ]]; then\n _php=\"php\"\nfi\nAPPS_TO_INSTALL=\"$APP $_php $FW_BOOT_PKG\"\nbash installer.sh -p sys -i $APPS_TO_INSTALL\nenable_init $APP\nservice $APP start > /dev/null 2>&1\nadd_fw_rule $FW_RULE1\nadd_fw_rule $FW_RULE2\n", "BodyType": "Text", "Name": "runApacheDeploy.sh"}}, "Name": "Deploy Apache", "Parameters": {"enablePHP": false}, "FormatVersion": "2.0.0", "Version": "1.0.0", "Scripts": {"apacheDeploy": {"Files": ["f17cecd3704f4a958b3f4998617ce8dc", "6cbbe00d1e974b0b8d929c4fe5945b0b"], "EntryPoint": "c6119b50f94244409ec0f89714a8a63a", "Version": "1.0.0", "Type": "Application", "Options": {"captureStdout": true, "captureStderr": true}}}, "Action": "Execute", "ID": "63aa0329592e4737bbb550b7be48498b"}

78

Page 78: OpenStack Murano introduction

Execute real deployment via Murano agent

79

Base64 encrypted

Page 79: OpenStack Murano introduction

Summary

Murano is an OpenStack application catalog service As for end user

provides a push-button-style application deployment

As for cloud app publisher provides application design framework via complex modeling and dynamic UI definition to publish the app to openstack.

As for cloud admin provides set of api to maintain the service catalog

Pros: Flexible in application design using MuranoPL Using heat to deploy the underline IaaS infrasture Easy to use UI dashboard Support various deployment script Python, Shell, Powershell etc.

Cons: Application design is complicated Have to learn the MuranoPL (kinda vendor lockin?) The Murano agent runs on only VM instead of Physical box Agent based the task execution(some customer don’t want to run agent in their instance)

81

Page 80: OpenStack Murano introduction

References

http://Murano-docs.github.io/latest/developers-guide/content/ch01.html

https://Murano.readthedocs.org/en/latest/

http://Murano-docs.github.io/0.4.1/administrators-guide/content/ch01.html

http://Murano-docs.github.io/latest/getting-started/content/ch01.html

https://wiki.openstack.org/wiki/Murano/Documentation/DynamicUI

https://wiki.openstack.org/wiki/Murano/Documentation/How_to_create_application_package

https://wiki.openstack.org/wiki/Murano#Murano_Screencasts

https://wiki.openstack.org/wiki/Murano/Documentation/How_to_create_application_package

https://github.com/ativelkov/yaql

82

Page 81: OpenStack Murano introduction

Thanks & Questions?

83