Post on 15-Jul-2015
transcript
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
Why Murano?
4
This is how we buy product in Amazon.com.
This is how we will consume cloud service on OpenStack by Murano.
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
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
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
How to use Murano?
Murano personas
Install and configure Murano
push-a-button style deploy for end user
Application Catalog Design in Murano
9
Murano personas
10
f
cloud catalog admincloud end user
3rd party cloud application provider
Murano
consumes
Maintain and set policy
integrate and publish
integrates
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
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
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
Design an application catalog high level overview
16
apache
OS
Modelingin Murano
Apache Service
in OpenStack
Apache service
Linux Windows
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
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
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
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
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
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
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
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
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
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
Building Linux Image
Install Required Packages
Build Linux Image
Guest VM Linux OS preparation
Upload Image Into Glance
27
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Murano PL – common class structure- Extends
Extends: [base1, base2,..]
Extends: Base
Extends:
42
MyClass(base1,base2,..)
MyClass(Base)
MyClass(com.mirantis.Murano.Object)
Murano PL – common class structure- Properties
propertyName:
Contract: property contract
Usage: property usage
Default: property default
43
Murano PL – common class structure- Properties-Contract
YAQL expressions to define expected type of value and constraints imposed on this property.
44
Murano PL – common class structure-Properties-Usage Usage states purpose of the property.
indicates who and how can access the property
46
Murano PL – common class structure-Properties-Default Specify the default value of the property
Conform to the constraints set by contract.
47
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
Murano PL – common class structure-Workflow-Expression
49
• YAQL expressions
• in a syntax like $obj.methodName(arguments)
Murano PL – common class structure-Workflow-Assignment
50
• YAQL expressions
• single-key dictionaries with YAQL expression as key and arbitrary structure as a value
create application package
Step 1. Prepare Execution Plans
Step 2. Prepare MuranoPL class definitions
Step 3. Prepare Dynamic UI Form Definition
52
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
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
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
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
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
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
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
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
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
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
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
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
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>…
Troubleshooting(1)
Issue Failed to provision instance, nova report failed to plug vif
72
Root cause:This is a known issue in juno
solution:
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
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
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
/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 = /
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 = /
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
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
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