From 37402e3cd07024347a05274dc7de1164cd1807b1 Mon Sep 17 00:00:00 2001 From: Ekaterina Fedorova Date: Tue, 10 Sep 2013 15:40:58 +0400 Subject: [PATCH] Add getting-started guide Also changed: 1) User guide updated: table with service description for AD was added 2) Add information for configuration OPENSTACK_HOST in installation guide 3) Some style for this documents was added Change-Id: Iaff2b841990e10e8c2cfd657a01ca76514491f10 --- .../src/docbkx/content/installation-guide.xml | 9 +- src/getting-started/pom.xml | 6 +- .../src/docbkx/content/appendix.xml | 161 +++ .../src/docbkx/content/before_you_begin.xml | 1192 +++-------------- .../src/docbkx/content/overview.xml | 107 ++ .../src/docbkx/content/setup_devbox.xml | 559 ++++++++ .../docbkx/content/setup_lab_environment.xml | 405 ++++++ .../src/docbkx/content/troubleshooting.xml | 155 +++ .../src/docbkx/getting-started.xml | 69 + .../src/docbkx/style/config.xsl | 10 + .../src/docbkx/style/getting-started.css | 54 + src/user-guide/pom.xml | 4 + .../src/docbkx/content/murano-dashboard.xml | 269 +++- src/user-guide/src/docbkx/images/cluster3.png | Bin 0 -> 20458 bytes src/user-guide/src/docbkx/style/config.xsl | 10 + .../src/docbkx/style/user-guide.css | 55 + 16 files changed, 2002 insertions(+), 1063 deletions(-) create mode 100644 src/getting-started/src/docbkx/content/appendix.xml create mode 100644 src/getting-started/src/docbkx/content/overview.xml create mode 100644 src/getting-started/src/docbkx/content/setup_devbox.xml create mode 100644 src/getting-started/src/docbkx/content/setup_lab_environment.xml create mode 100644 src/getting-started/src/docbkx/content/troubleshooting.xml create mode 100644 src/getting-started/src/docbkx/getting-started.xml create mode 100644 src/getting-started/src/docbkx/style/config.xsl create mode 100644 src/getting-started/src/docbkx/style/getting-started.css create mode 100644 src/user-guide/src/docbkx/images/cluster3.png create mode 100644 src/user-guide/src/docbkx/style/config.xsl create mode 100644 src/user-guide/src/docbkx/style/user-guide.css diff --git a/src/developers-guide/src/docbkx/content/installation-guide.xml b/src/developers-guide/src/docbkx/content/installation-guide.xml index ddee0f8..fae8c8a 100644 --- a/src/developers-guide/src/docbkx/content/installation-guide.xml +++ b/src/developers-guide/src/docbkx/content/installation-guide.xml @@ -224,6 +224,7 @@ admin_password = password + Register murano-api service in Openstack. Note: you need to be authorized in Openstack to run this commands. To do this, you can run something like (having changed variables to appropriate values) @@ -231,8 +232,6 @@ admin_password = password source $(YOUR_OPENSTACK_DIR)/openrc $(LOGIN) $(PASSWORD) ]]> - - + + This script will supplement openstack dashboard configuration and the panel with Murano "Environments" should appear. + Don't forget to register + Murano API in keystone and set OPENSTACK_HOST in + horizon settings. +
diff --git a/src/getting-started/pom.xml b/src/getting-started/pom.xml index 1f00f43..0704684 100644 --- a/src/getting-started/pom.xml +++ b/src/getting-started/pom.xml @@ -22,7 +22,7 @@ murano-getting-started-guide 1.0.0-SNAPSHOT jar - Murano Deployment Guide + Murano Getting Started Guide @@ -38,6 +38,10 @@ + ${basedir}/src/docbkx/style/config.xsl + + ${basedir}/src/docbkx/style/getting-started.css + true 100 diff --git a/src/getting-started/src/docbkx/content/appendix.xml b/src/getting-started/src/docbkx/content/appendix.xml new file mode 100644 index 0000000..e24e62d --- /dev/null +++ b/src/getting-started/src/docbkx/content/appendix.xml @@ -0,0 +1,161 @@ + + + + Appendix + + Murano VM + + + Your VM MUST be attached to the network with Internet access + and openstack management network (lab network) access. + + + + + Ubuntu Server 12.04 LTS x86_64 + + Installation steps: + + + Install minimal version of the system + + + When prompted, mark OpenSSH Server to be installed + + + + Login as root + + + Enable Cloud Archive repository + + + Update installed OS and packages + + + Add lines below to the + /etc/apt/sources.list.d/grizzly.list + file + +deb http://ubuntu-cloud.archive.canonical.com/ubuntu + precise-updates/grizzly main +deb http://archive.gplhost.com/debian grizzly main +deb http://archive.gplhost.com/debian grizzly-backports main + + + + + Update the system + +># apt-get update +># apt-get install ubuntu-cloud-keyring +># apt-get install gplhost-archive-keyring +># apt-get upgrade + + + + + Install additional packages + +># apt-get install mc unzip git make gcc + python-setuptools python-pip + + + + + + CentOS 6.4 x86_64 + + Installation steps: + + + Install minimal version of the system. + + + When prompted, mark OpenSSH Server to be installed + + + Login as root + + + Enable RedHat Openstack and Epel repository + + + Update installed OS and packages + + + Add repositories and update OS + +># yum install -y http://rdo.fedorapeople.org/openstack/ + openstack-grizzly/rdo-release-grizzly.rpm +># yum install -y http://mirror.yandex.ru/ + epel/6/x86_64/epel-release-6-8.noarch.rpm +># yum update +># yum upgrade + + + + + Install additional packages + +># yum install mc unzip git make gcc python-setuptools + python-pip upstart + + + + + + Most of dependent packages will be installed + automatically with setup scripts. + + + Some words about pip (python-pip) version. In order to have + proper versions of python dependency packages installed, + pip version MUST be 1.4 or higher! + + + + How-to determine python-pip version: + +># pip --version + + How-to upgrade pip to latest version: + +># pip install --upgrade pip +># pip install + https://pypi.python.org/packages/source/p/pip/pip-1.4.1.tar.gz + + + + You should pay attention to python-pip after upgrade to + version 1.4, because its filesystem location can change + from /usr/bin/pip to /usr/local/bin/pip! + + + + How to handle this situation: + +># rm /usr/bin/pip +># ln -s /usr/local/bin/pip /usr/bin/pip + + \ No newline at end of file diff --git a/src/getting-started/src/docbkx/content/before_you_begin.xml b/src/getting-started/src/docbkx/content/before_you_begin.xml index 659ace9..7686d3c 100644 --- a/src/getting-started/src/docbkx/content/before_you_begin.xml +++ b/src/getting-started/src/docbkx/content/before_you_begin.xml @@ -21,1036 +21,164 @@ xsi:schemaLocation="http://docbook.org/ns/docbook http://www.docbook.org/xml/5.0/xsd/docbook.xsd http://www.w3.org/1999/xlink http://www.w3.org/1999/xlink.xsd" version="5.0"> - About Murano -
- About Murano - Murano is a new service which allows a non-experienced user to deploy reliable Windows based environments in a “push-the-button” manner. The key goal is to provide a UI and API enabling the deployment and operation of Windows Environments at the Windows Services abstraction level. The service is able to orchestrate complex circular dependent cases in order to set up a complex Windows Environment with multiple dependant services. - - The service addresses following use cases: - - - Self-provisioning of predefined Windows services with their dependencies - - - Automation of administrative tasks during data center roll-out - - - Custom windows application as a windows service - - - - The solution provides higher level of abstraction for manipulation Windows Environments. Key concepts are: - - - Windows Service - a service such as Active Directory, MSSQL, or IIS, which usually consists of multiple virtual machines and has multiple dependencies. - - - Windows Environment - a logical unit for all Services and represents a classical Windows Datacenter - - - Windows VM instance - a VM which hosts a Windows Service. A Windows Service might be deployed over several Windows VM instances. - - - - The Key Features of the Service are the following: - - - Native to OpenStack - - - Introduces abstraction level for Windows Environments - - - Supports Availability Zones and Disaster Recovery scenarios - - - Uses native Windows features for HA solutions - - -
-
- Before You Begin -
-
- Naming Conventions - To clearly separate commands and parts of configuration files we use boxes, like shown below: - - - ...# Part of config file here... - - - All commands start either with ‘>$’ mark or with ‘>#’ mark. The difference is that first should be executed as regular user, while second - as superuser (‘root’). - - - >$ echo ‘Execute this command as regular user’ - - - - ># echo ‘Execute this command as root’ - - -
-
- Use Appropriate Branch - There are a few branches that can be found in all Murano repositories: master, release-0.1, release-0.2 and so on. Branch master is the most recent between the releases, but not as stable as release-x.x branches. -
-
- Use Separate vHost in RabbitMQ - In general it is OK to configure Murano services to use the root (‘/’) vHost in RabbitMQ and use the same user credentials as OpenStack services use. - - However, we recommend to create a separate vHost with separate user for each Murano devbox. There are a few reasons for that: - - - this prevents queue name collisions - - - this prevents message stealing from queues - - - this simplify debugging - - - - If you are planning to use only one devbox then you may stay with ‘/’ vHost. - - Steps required to configure your own vHost are described in RabbitMQ Configuration Notes. -
-
- System Requirements -
-
- OpenStack Lab -
-
- Supported OS - - - Ubuntu Server 12.04 x64 - - -
-
- Hardware Requirements - - - CPU: 8+ cores - - - RAM: 12+ GB - - - HDD (select any option) - - - NIC: 1x Ethernet 1+ Gbps - - -
-
- Software Requirements - - - Heat installed - - - Denis Koryavov:This is Getting Started Guide, so is better to create an instruction how to create vhost in RabbitMQ.RabbitMQ configured (+ additional vhosts and user accounts) - - - Windows Server 2012 Standard image imported into Glance (described later) - - - Samba share with prerequisites (described later) - - - OpenStack metadata service. - - -
-
- Devbox - We suggest to use virtual machine for Murano, as it allows you to backup your VM easily. - - Any type of hypervisor software which supports linux as guest OS could be used. - KVM, VMWare and VirtualBox were tested with success. - - There is a Murano VM section in Appendix which contains steps to build your own VM. -
-
- Supported OS - - - Ubuntu Server 12.04 LTS x86_64 - - - CentOS 6.4 x86_64 - - -
-
- Hardware Requirements - - - RAM: 512 MB - - - CPU: 1 core - - - HDD: 20 GB - - - 1 NIC - - -
-
- Software Requirements - - - Packages: - - - X Server is NOT required and system runlevel 3 is preferred. - - -
-
- Setup Lab Environment -
-
- Install OpenStack - You need a working installation of OpenStack first. It could be your own installation which meets the requirements, or a new one using the installation method provided below. -
-
- Using Devstack - Currently the most simple way to build a lab is to use devstack. - - The steps are quite simple: - - - Install and configure OS on your hardware. The recommended OS is Ubuntu Server 12.04 x64. Minimal configuration would be enough. - - - Install all the latest updates. - - - - ># apt-get update># apt-get -y upgrade - - - - Create a user stack - - - - ># adduser stack - - - - Add user stack to sudoers - - - - ># echo ‘stack ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/stack># chmod 0440 /etc/sudoers.d/stack - - - - Create a folder for OpenStack installation files - - - - ># mkdir /opt/stack># chown stack:stack /opt/stack - - - - Clone the devstack repo - - - - ># su stack>$ cd>$ git clone https://github.com/openstack-dev/devstack.git - - - - Checkout the stable/grizzly branch - - - - >$ cd devstack>$ git checkout stable/grizzly - - - - Get localrc and local.sh files - - - - >$ wget https://raw.github.com/stackforge/murano-deployment/release-0.2/getting-started/localrc -O localrc>$ wget https://raw.github.com/stackforge/murano-deployment/release-0.2/getting-started/local.sh -O local.sh>$ chmod +x local.sh - - - - Start devstack - - - - >$ ./stack.sh - - - - When stack.sh finishes  execution your OpenStack installation is ready. - - -
-
- Prepare Shared Prerequisites -
-
- Configure Samba Share - - - Install SAMBA - - - - ># apt-get update># apt-get install samba - - - - Create shared folder - - - - ># mkdir -p /opt/samba/share># chown nobody:nogroup /opt/samba/share - - - - Edit /etc/samba/smb.conf - - - - ...[global]    ...    security = user...[share]    comment = Deployment Share    path = /opt/samba/share    browsable = yes    guest ok = yes    guest account = nobody    read only = no    create mask = 0755 - - - - Restart services - - - - ># restart smbd># restart nmdb - -
-
- Copy Prerequisites Into The Share - - - Create folder structure - - - - ># mkdir -p “/opt/samba/share/Prerequisites/IIS”># mkdir -p “/opt/samba/share/Prerequisites/SQL Server/2012”># mkdir -p “/opt/samba/share/Prerequisites/SQL Server/Tools” - - - - Add files to the folder structure under /opt/samba/share folder: - - -
-
- Build Windows Image - A pre-built Windows Image is required to create environments in Murano. Because of its size it’s better to build the image on the same host where OpenStack is installed. - - This section describe steps required to build such an image. -
-
- Prepare Build Environment - - - Samba should be already installed (See Configure samba share) - - - Clone murano-deployment repository - - - - ># cd /opt/git># git clone git://github.com/stackforge/murano-deployment.git - - - - Change directory to murano-deployment/image-builder folder - - - - ># cd /opt/git/murano-deployment/image-builder - - - - Create folder structure for image builder - - - - ># make build-root - - - - Add files into folder structure under /opt/image-builder folder: - - - Test that all required files are in place - - - - ># make test-build-files - -
-
- Build The Image - - - Get list of supported images - - - - ># make - - - - Run image build process - - - - ># make ws-2012-std - - - - Wait until process finishes - - - The image file ws-2012-std.qcow2 will be stored in /opt/image-builder/share/images folder. - - -
-
- Import Windows Image Into Glance - Now when you’ve built a Windows Image it must be imported into Glance. - - - - Import openrc file which contains environment variables definitions required by OpenStack components - - - - >$ source openrc - - - - Import the Windows Server 2012 image into Glance - - - - >$ cd /opt/image-builder/share/images>$ glance image-create \ --name ws-2012-std \ --disk-format qcow2 \ --container-type bare \ --file ws-2012-std.qcow2 \ --is-public true \ --property murano_image_info='{"type":"ws-2012-std",\ "title":"Windows Server 2012 Standard"}' - - - WARNING: the value of the --property argument named murano_image_info is a JSON string. Only double quotes are valid in JSON, so please type the string exactly as in the example above. -
-
- Setup Devbox - There are a few ways to install Murano devbox - - - using Vagrant automation tool - - - using a script to install all components automatically - - - install everything manually - - - - NOTE: The preferred way is to use script for automated installation. It is described in Automated Way section below. -
-
- Vagrant Way - There is a simple way to get working Murano devbox. This could be done using Vagrant tool. -
-
- Prepare Environment -
-
- Ubuntu - - - Install VirtualBox: - - - - ># apt-get install virtualbox - - - - Install VirtualBox Extension tsufiev:Where is the command for Extension Pack or instructions (if you mean Guest Additions)?Dmitry Teselkin:No, I mean Extension Pack. There is no simple command, the easiest way is to download it from the site and "run it" - VirtuaBox will open the file and imports the pack.tsufiev:Ok, let's leave it as an exercise to the user :)Pack. - - - Install Vagrant: - - - - ># apt-get install vagrant tsufiev:Actually, it is called --no-install-recommendsDmitry Teselkin:Thanks, fixed--no-install-recommends - - - - Upgrade the Vagrant: - - - - ># wget http://files.vagrantup.com/packages/7ec0ee1d00a916f80b109a298bab08e391945243/vagrant_1.2.7_x86_64.deb - - - - - - ># dpkg --install vagrant_1.2.7_x86_64.deb - -
-
- Launch The Box - - - Clone murano-vagrant repository - - - - >$ git clone https://github.comakuznetsova:I think you should change this repositoryDmitry Teselkin:I will, laterDmitry Teselkin:Done/stackforge/murano-deployment.git - - - - Change directory to cloned repository folder - - - - >$ cd murano-deployment/getting-started>$ git checkout -b release-0.2 origin/release-0.2 - - - - IMPORTANT STEP: Edit the lab-binding.rc file - replace all the markers ‘***’ tsufiev:It is reasonable to show here lab-binding.rc with places to be filled - or provide the link to the lab-binding.rc in text below.Dmitry Teselkin:Doneto your settings. For example: - - - - ...# Lab Settings#-------------# Address of the host which provides Keystone service.## LAB_HOST='192.168.1.2'LAB_HOST='***.***.***.***'... - - - - Launch the box: - - - - >$ ./launch-the-box.sh - - - - The script will do the following: - - - Vagrant will do the rest: - - - When everything is done open the http://127.0.0.1:8080/horizon link. - - -
-
- <note><remark>Denis Koryavov:</remark></note><note><remark>It is necessary to write that this way is recommended and Manual Way should be used ONLY if something got wrong with automated way.</remark></note>Automated Way - - Denis Koryavov: - - - It is necessary to write that this way is recommended and Manual Way should be used ONLY if something got wrong with automated way. - - Build your VM using instructions from Murano VM first. - - - - Create a folder to hold cloned repositories - - - - ># mkdir -p /opt/git - - - - Clone murano-deployment repository - - - - ># cd /opt/git># git clone git://github.com/stackforge/murano-deployment.git - - - - Change directory to murano-deployment and switch to release-0.2 branch - - - - ># cd /opt/git/murano-deployment># git checkout -b release-0.2 origin/release-0.2 - - - - Install prerequisites - - - - ># cd /opt/git/murano-deployment/devbox-scripts># ./murano-git-install.sh prerequisites - - - - Configure lab binding configuration file /etc/murano-deployment/lab-binding.rc - - - - LAB_HOST='***Denis Koryavov:I think there should be an other address..***.***.***'AUTH_URL="http://$LAB_HOST:5000/v2.0"ADMIN_USER='admin'ADMIN_PASSWORD='***'RABBITMQ_LOGIN='tsufiev:Is it really 'muranouser' and not 'murano' we use on our devboxes?muranouser'RABBITMQ_PASSWORD='murano'RABBITMQ_VHOST=tsufiev:Considering that most users are an idiots (or like me :)), I'd stress that 'muranovhost' must already exist.'muranovhost'BRANCH_NAME='release-0.Igor Yozhikov:In the release-0.2 default BRANCH_NAME='master' instad of 'release-0.2'2' - - - Please remember that recommend to Use separate vHost in RabbitMQ - - - Install Murano components - - - - ># ./murano-git-install.sh install - - - - Login to the Dashboard using URL http://<your VM IP>/dashboard - - -
-
- Manual Way - Build your VM using instructions fromDenis Myznikov:Link in nowhereDmitry Teselkin:Fixed Murano VM first. - - Package for Ubuntu and CentOS already in progress and will soon be accessible for users. While they are not available, we provide information about how to get and install all murano services from source code below. We made setup scripts for automated installation of our products which accepts install and uninstall command line arguments. Service startup jobs are handled by Upstart. - At first we need to create some kind of working directory. - - NOTE: All installation steps require the superuser rights. - - - ># mkdir -p /opt/git && cd /opt/git - - NOTE: Please, track actual projects stable branch, at the time of writing current stable branch is - release-0.2 -
-
- Murano-Api - - - Get source code - - - - ># git clone https://github.com/stackforge/murano-api -b release-0.2># chmod +x murano-api/setup*.sh - - - - Install the component - - - - ># murano-api/setup.sh install - - - - - - ># murano-api/setup-centos.sh install - - - Configuration: - - ># cd /etc/murano-api && cp murano-api-paste.ini.sample murano-api-paste.ini># cd /etc/murano-api && cp murano-api.conf.sample murano-api.conf - - NOTE: Denis Myznikov:IMHO need add 2 lines - vi murano-api-paste.ini and vi murano-api.conf for better understandingBefore start service, set proper configuration values in configuration files mentioned above. - - tsufiev:Looks like step-by-step instructions. Imagine the user saying to himself: why the hell am i doing this?! ))))Service control: - - ># start murano-api># stop murano-api># restart murano-api># status murano-api - -
-
- Murano-Conductor - - - Get source code - - - - Denis Myznikov:Need to add "cd /opt/git/"># git clone https://github.com/stackforge/murano-conductor -b release-0.2># chmod +x murano-conductor/setup*.sh - - - - Install the component - - - - ># murano-conductor/setup.sh install - - - - on CentOS - - - - ># murano-conductor/setup-centos.sh install - - Configuration - - ># cd /etc/murano-conductor && cp conductor-paste.ini.sample conductor-paste.ini># cd /etc/murano-conductor && cp conductor.conf.sample conductor.conf - - NOTE: Denis Myznikov:IMHO also line - vi conductor.conf, no need to edit the file conductor-paste.initsufiev:Also, s/start/starting the/Before start service, set proper configuration values in configuration files mentioned Denis Myznikov:and start the service by command ># start murano-conductorabove. - - Service control: - - ># start murano-conductor># stop murano-conductor># restart murano-conductor># status murano-conductor - -
-
- Murano-Dashboard - At first, Install OpenStack dashboard(Horizon)  and dependent packages. - - How-to do this: - - - On Ubuntu - - - - ># apt-get install -y memcached libapache2-mod-wsgi openstack-dashboard># dpkg --purge openstack-dashboard-ubuntu-theme # optional step - - After install is complete, openstack dashboard should be available at: http://<your VM IP>/horizon - - - - On CentOS - - - - ># yum install python-netaddr.noarch python-keystoneclient.noarch python-django-horizon.noarch python-django-openstack-auth.noarch  httpd.x86_64 mod_wsgi.x86_64 openstack-dashboard.noarch --assumeyes># chkconfig httpd on - - After install complete, openstack dashboard should be available at: http://<your VM IP>/dashboard - - Installation of the murano-dashboard is described below. - - - Get source code - - - - ># git clone https://github.com/stackforge/murano-dashboard -b release-0.2># chmod +x murano-dashboard/setup*.sh - - - - Install the component - - - - - - - ># murano-dashboard/setup.sh install - - - - - - ># murano-dashboard/setup-centos.sh install - -
-
- Murano Services Configuration -
-
- RabbitMQ Configuration Notes - OpenStack rabbitMQ credentials could be used for murano services, but prefered way is to make additional changes into rabbitMQ configuration, like own vhost, login and password. These steps require superuser rights and should be run on the OpenStack controller node where rabbitMQ service resides. - - How to do this: - - ># rabbitmqctl add_user muranouser muranopassword># rabbitmqctl set_user_tags muranouser administrator># rabbitmqctl add_vhost muranovhost># rabbitmqctl set_permissions -p muranovhost muranouser ".*" ".*" ".*" - -
-
- Keystone Configuration Notes - Service entry for murano-api and endpoint associated with it could also be  configured in the keystone. If there is no record about murano-api in the keystone murano-dashboard would try to reach murano-api service at localhost on the default murano-api port 8082. - - How to add service record into the keystone using python keystone client: - - ># keystone service-create --name muranoapi --type murano --description "Murano-Api Service" - - This command returns UUID of the created service record, which should be used below. - - - ># keystone endpoint-create \  --region RegionOne \  --service-id UUID_from_above \  --publicurl http://murano_vm_address:8082 \  --internalurl http://murano_vm_address:8082 \  --adminurl http://murano_vm_address:8082 - -
-
- Murano-Api - Configuration files of the murano-api service reside at /etc/murano-api directory. Basic configuration parameters are listed below. - - - murano-api.conf - - - - [DEFAULT]...bind_host = 0.0.0.0bind_port = 8082log_file = /var/log/murano-api.log...[database]...#connection = mysql://mysqluser:mysqlpassword@mysqlhost:3306/muranoconnection = sqlite:////etc/murano-api/murano.sqlite...[rabbitmq]host = <rabbitmq ip>port = 5672login = <rabbitmq login>password = <rabbitmq password>virtual_host = <rabbitmq vhost>... - - - - murano-api-paste.ini - - - - ...[filter:authtoken]auth_host = <keystone_ip>auth_port = 35357auth_protocol = httpadmin_tenant_name = adminadmin_user = adminadmin_password = admin_password... - -
-
- Murano-Conductor - Configuration files of the murano-conductor service reside at /etc/murano-conductor directory. Basic configuration parameters are listed below: - - - conductor.conf - - - - [DEFAULT]log_file = /var/log/murano-conductor.log[keystone]# URL of OpenStack KeyStone service REST API.# Typically only hostname (or IP) needs to be changedauth_url = http://keystone_ip:5000/v2.0......[rabbitmq]host = <rabbitmq ip>port = 5672login = <rabbitmq login>password = <rabbitmq password>virtual_host = <rabbitmq vhost>... - - - - conductor-paste.ini - - - It’s empty but must exist. -
-
- Murano-Dashboard -  Murano-dashboard does not need to be configured, but we need to set up proper OPENSTACK_HOST variable in the OpenStack dashboard configuration file, which resides at /etc/openstack-dashboard directory. It should point to the OpenStack controller node. - - - # optional, but sometimes very useful to set DEBUG to ‘True’DEBUG = True...OPENSTACK_HOST = “openstack_controller_address” ... - -
-
- Troubleshooting - Set debug options to "true" in all config files - dashboard, api, conductor. - - NOTE: the following debug sequence should be used when you have no idea about why the system isn't working. If you have one, you may skip unnecessary sections. - - First, stop both murano-api and murano-conductor services. We will start them one by one from the console. -
-
- Murano-Api - - - Open new console - - - Start api service manually - - - - ># murano-api --config-dir /etc/murano-api > /var/log/murano-api-live.log &># tailf /var/log/murano-api-live.log - - - - Open dashboard, create and send to deploy some simple environment. - - - Open RabbitMQ web console, open your vhost and ensure that queues were created and there is at least one message. - - - Check log for errors - there shouldn't be any - - - Keep murano-api service running. - - -
-
- Murano-Conductor - - - Open new console - - - Start conductor from console - - - - ># muranoconductor --config-dir /etc/murano-conductor > /var/log/murano-conductor-live.log &># tailf /var/log/murano-conductor-live.log - - - - Check that there is no python exceptions in the log. Some errors like 404 are ok, as conductor tries to delete environment that doesn't exist. - - - Check heat stack status. It should not be in FAILED state. If it is - check heat and nova error log to find the cause. - - - Keep murano-conductor service running. - - - - Now, the environment should be created, and instance(s) launched. - - Next, check if instances were configured correctly by the cloudbase init tool. - - Log in to any instance and open powershell log file at C:\Murano\PowerShell.log. There shouldn't be any exceptions logged. Other symptoms of successful configuration is that the instance was renamed and you have to press <Ctrl>+<Alt>+<Del> to log into. Unconfigured instance has autologon enabled for the first logon, so if console is open, the instance is not configured (yet). - - Check that Murano Agent has correct config file. If there is a .bak file, then it was changed by the init script. Check the file,  ensure that it has correct values. - - Check Murano Agent log file. There should be logged all tasks received by the agent from the conductor. - - Check PowerShell log. There should be messages about all functions, executed on the instance. -
-
- Log files -
-
- Murano Log Files - - - /var/log/murano-api.log - - - /var/log/murano-conductor.log - - - akuznetsova:Also need to add info about new log file for dashboardtsufiev:Should be fixed for releases >0.2/var/log/apache2/errors.log - - - /var/log/httpd/errors.log - - -
-
- Windows Log Files - - - C:\Murano\PowerShell.log - - - C:\Murano\Agent\log.txt - - -
-
- Appendix -
-
- Murano VM - NOTE: Your VM MUST be attached to the network with Internet and openstack management network (lab network) access. -
-
- Ubuntu Server 12.04 LTS x86_64 - Installation steps: - - - Install minimal version of the system - - - When prompted, mark OpenSSH Server to be installed - - - Login as root - - - Enable Cloud Archive repository - - - Update installed OS and packages - - - - - - Add lines below to the /etc/apt/sources.list.d/grizzly.list file - - - - deb http://ubuntu-cloud.archive.canonical.com/ubuntu precise-updates/grizzly maindeb http://archive.gplhost.com/debian grizzly maindeb http://archive.gplhost.com/debian grizzly-backports main - - - - - Update the system - - - - ># apt-get update># apt-get install ubuntu-cloud-keyring># apt-get install gplhost-archive-keyringDenis Koryavov:Maybe add # reboot after this command?Denis Myznikov:No. It works.># apt-get upgrade - - - - Install additional packages - - - - ># apt-get install mc unzip git make gcc python-setuptools python-pip - -
-
- CentOS 6.4 x86_64 - Installation steps: - - - Install minimal version of the system. - - - When prompted, mark OpenSSH Server to be installed - - - Login as root - - - Enable RedHat Openstack and Epel repository - - - Update installed OS and packages - - - - - Add repositories and update OS - - - - ># yum install -y http://rdo.fedorapeople.org/openstack/openstack-grizzly/rdo-release-grizzly.rpm># yum install -y http://mirror.yandex.ru/epel/6/x86_64/epel-release-6-8.noarch.rpm># yum update># yum upgrade - - - - Install additional packages - - - - ># yum install mc unzip git make gcc python-setuptools python-pip upstart - - Most of dependent packages will be installed automatically with setup scripts. - - NOTE: Some words about pip (python-pip) version. In order to have proper versions of python dependency packages installed, pip version MUST be 1.4 or higher! - - How-to determine python-pip version: - - ># pip --version - - - How-to upgrade pip to latest version: - - ># pip install --upgrade pip - - or - - ># pip install https://pypi.python.org/packages/source/p/pip/pip-1.4.1.tar.gz - - - NOTE: you should pay attention to python-pip after upgrade to version 1.4, because its filesystem location can change from /usr/bin/pip to /usr/local/bin/pip ! - - How to handle this situation: - - ># rm /usr/bin/pip># ln -s /usr/local/bin/pip /usr/bin/pip - - -
+ Before You Begin + Naming Conventions + + To clearly separate commands and parts of configuration files we use boxes, like shown below: + +... +# Part of config file here + + + All commands start either with ‘>$’ mark or with ‘>#’ mark. + The difference is that first should be executed as regular user, while second - as superuser (‘root’). + + +>$ echo ‘Execute this command as regular user’ +># echo ‘Execute this command as root’ + + Use Appropriate Branch + There are a few branches that can be found in all Murano repositories: master, release-0.1, + release-0.2 and so on. Branch master is the most recent between the releases, but not as stable as release-x.x branches. + Use Separate vHost in RabbitMQ + + In general it is OK to configure Murano services to use the root (‘/’) vHost in RabbitMQ and use the same user credentials as OpenStack services use. + However, we recommend to create a separate vHost with separate user for each Murano devbox. There are a few reasons for that: + + + this prevents queue name collisions + + + this prevents message stealing from queues + + + this simplify debugging + + + + + If you are planning to use only one devbox then you may stay with ‘/’ + vHost. + Steps required to configure your own vHost are described in RabbitMQ Configuration Notes. + +
+ System Requirements + + + OpenStack Lab - a single node Openstack environment. + + + + Devbox - a mahine where all murano components and services are running. + This machine should have access to the Openstack Lab. + + + +
+ OpenStack Lab + + Supported OS + + + + Ubuntu Server 12.04 x64 + + + + Hardware Requirements + + + + CPU: 8+ cores + + + RAM: 12+ GB + + + HDD (select any option) + + + NIC: 1x Ethernet 1+ Gbps + + + + Software Requirements + + + + Heat installed + + + + RabbitMQ configured (+ additional vhosts and user + accounts) + + + + Windows Server 2012 Standard image imported into Glance + (described later) + + + + Samba share with prerequisites (described later) + + + OpenStack metadata service. + + +
+
+ Devbox + + We suggest to use virtual machine for Murano, as it allows you to + backup your VM easily. + Any type of hypervisor software which supports linux as guest OS + could be used. KVM, VMWare and VirtualBox were tested with success. + There is a Murano VM Appendix + which contains steps to build your own VM. + + + Supported OS + + + + Ubuntu Server 12.04 LTS x86_64 + + + CentOS 6.4 x86_64 + + + + Hardware Requirements + + + + RAM: 512 MB + + + CPU: 1 core + + + HDD: 20 GB + + + 1 NIC + + + + Software Requirements + + + + Packages: + + + X Server is NOT required and system runlevel 3 is + preferred. + + + +
+
\ No newline at end of file diff --git a/src/getting-started/src/docbkx/content/overview.xml b/src/getting-started/src/docbkx/content/overview.xml new file mode 100644 index 0000000..84ebfbb --- /dev/null +++ b/src/getting-started/src/docbkx/content/overview.xml @@ -0,0 +1,107 @@ + + + + About Murano + + Murano is a new service which allows a non-experienced user to deploy + reliable Windows based environments in a “push-the-button” manner. The + key goal is to provide a UI and API enabling the deployment and + operation of Windows Environments at the Windows Services abstraction + level. The service is able to orchestrate complex circular dependent + cases in order to set up a complex Windows Environment with multiple + dependant services. + + + The service addresses following use cases: + + + Self-provisioning of predefined Windows services with their dependencies + + + Automation of administrative tasks during data center roll-out + + + Custom windows application as a windows service + + + + + The solution provides higher level of abstraction for manipulation + Windows Environments. Key concepts are: + + + Windows Service - a service such as Active Directory, MSSQL, or IIS, which usually consists of multiple virtual machines and has multiple dependencies. + + + + Windows Environment - a logical unit for all Services and represents a classical Windows Datacenter. + + + + Windows VM instance - a VM which hosts a Windows Service. A Windows Service might be deployed over several Windows VM instances. + + + + + The Key Features of the Service are the following: + + + Native to OpenStack + + + Introduces abstraction level for Windows Environments + + + Supports Availability Zones and Disaster Recovery scenarios + + + Uses native Windows features for HA solutions + + + +
+ Document change history + The following table describes the most recent changes: + + + + Revision Date + Summary of Changes + + + + + September. 4, 2013 + + + + Initial document creation. + + + + + + +
+ +
\ No newline at end of file diff --git a/src/getting-started/src/docbkx/content/setup_devbox.xml b/src/getting-started/src/docbkx/content/setup_devbox.xml new file mode 100644 index 0000000..dd58f4c --- /dev/null +++ b/src/getting-started/src/docbkx/content/setup_devbox.xml @@ -0,0 +1,559 @@ + + + + Setup Devbox + There are a few ways to install Murano devbox + + + using Vagrant automation tool + + + using a script to install all components automatically + + + + install everything manually + + + + + The preferred way is to use script for automated + installation. It is described in + Automated Way section below. + + +
+ Vagrant Way + The simplest way to get working Murano devbox is Vagrant tool. + Prepare Environment (Ubuntu) + + + Install VirtualBox: + + + +># apt-get install virtualbox + + + + Install VirtualBox Extension Pack. + + + + Install Vagrant: + + + +># apt-get install vagrant --no-install-recommends + + + + Upgrade the Vagrant: + + + +># wget http://files.vagrantup.com/ + packages/7ec0ee1d00a916f80b109a298bab08e391945243/ + vagrant_1.2.7_x86_64.deb + + +># dpkg --install vagrant_1.2.7_x86_64.deb + + Launch The Box + + + Clone murano-vagrant repository + + + +>$ git clone https://github.com/stackforge/murano-deployment.git + + + + Change directory to cloned repository folder + + + +>$ cd murano-deployment/getting-started +>$ git checkout -b release-0.2 origin/release-0.2 + + + + IMPORTANT STEP: Edit the lab-binding.rc file - replace + all the markers ‘***’ to your settings. For example: + + + + +# Lab Settings +#------------- +# Address of the host which provides Keystone service. +# +# LAB_HOST='192.168.1.2' +LAB_HOST='***.***.***.***' +... + + + + Launch the box: + + + +>$ ./launch-the-box.sh + + + + The script will do the following: + + + Vagrant will do the rest: + + + When everything is done open the http://127.0.0.1:8080/horizon link. + + + +
+
+ Automated Way + + Build your VM using instructions from Murano VM first. + + + + Create a folder to hold cloned repositories + + + +># mkdir -p /opt/git + + + + Clone murano-deployment repository + + + +># cd /opt/git># git clone git://github.com/stackforge/murano-deployment.git + + + + + Change directory to murano-deployment and switch to release-0.2 branch + + + + +># cd /opt/git/murano-deployment +># git checkout -b release-0.2 origin/release-0.2 + + + + Install prerequisites + + + +># cd /opt/git/murano-deployment/devbox-scripts +># ./murano-git-install.sh prerequisites + + + + Configure lab binding configuration file + /etc/murano-deployment/lab-binding.rc + + + + +LAB_HOST='***.***.***.***' + +AUTH_URL="http://$LAB_HOST:5000/v2.0" + +ADMIN_USER='admin' +ADMIN_PASSWORD='***' + +RABBITMQ_LOGIN='muranouser' +RABBITMQ_PASSWORD='murano' +RABBITMQ_VHOST='muranovhost' +BRANCH_NAME='release-0.2' + + It's recommended to use separate vHost in + RabbitMQ + + + + Install Murano components + + + +># ./murano-git-install.sh install + + + + Login to the Dashboard using URL http://uth_port = 35357;your VM IP>/dashboard + + +
+
+ Manual Way + Build your VM using instructions from + Murano VM + first. + + + Package for Ubuntu and CentOS already in progress and will soon + be accessible for users. While they are not available, we provide + information about how to get and install all murano services from + source code below. We made setup scripts for automated installation + of our products which accepts install and uninstall command line + arguments. Service startup jobs are handled by Upstart. + + At first we need to create a working directory. + + All installation steps require the superuser rights. + +># mkdir -p /opt/git && cd /opt/git + + + + Please, track actual projects stable branch, at the time of + writing current stable branch is - release-0.2 + + + + Murano-Api + + + Get source code + + + +># git clone https://github.com/stackforge/murano-api -b release-0.2 +># chmod +x murano-api/setup*.sh + + + + Install the component + + + +># murano-api/setup.sh install + + + + + +># murano-api/setup-centos.sh install + + Configuration: + +># cd /etc/murano-api && cp murano-api-paste.ini.sample \ + murano-api-paste.ini +># cd /etc/murano-api && cp murano-api.conf.sample murano-api.conf + + + + Before start service, set proper configuration values in + configuration files mentioned above. + + + + Service control: + + +># start murano-api +># stop murano-api +># restart murano-api +># status murano-api + + Murano-Conductor + + + Get source code + + + +># git clone https://github.com/stackforge/murano-conductor \ + -b release-0.2 +># chmod +x murano-conductor/setup*.sh + + + + Install the component + + + +># murano-conductor/setup.sh install + + + + on CentOS + + + +># murano-conductor/setup-centos.sh install + + Configuration + +># cd /etc/murano-conductor && cp \ + conductor-paste.ini.sample conductor-paste.ini +># cd /etc/murano-conductor && cp \ + conductor.conf.sample conductor.conf + + + + Before starting the service, set proper configuration values in + configuration files mentioned above. + + + Service control: + +># start murano-conductor +># stop murano-conductor +># restart murano-conductor +># status murano-conductor + + + Murano-Dashboard + At first, Install OpenStack dashboard(Horizon)  and dependent + packages. + + How-to do this: + + + On Ubuntu + + + +># apt-get install -y memcached libapache2-mod-wsgi openstack-dashboard +># dpkg --purge openstack-dashboard-ubuntu-theme # optional step + + After installation is complete, openstack dashboard should be + available at: http://<your VM IP>/horizon + + + + on CentOS + + + +># yum install python-netaddr.noarch \ + python-keystoneclient.noarch \ + python-django-horizon.noarch \ + python-django-openstack-auth.noarch \ +  httpd.x86_64 mod_wsgi.x86_64 \ + openstack-dashboard.noarch --assumeyes +># chkconfig httpd on + + After installation is complete, openstack dashboard should be available + at: http://<your VM IP>/dashboard + + Installation of the murano-dashboard is described below. + + + Get source code + + + +># git clone https://github.com/stackforge/murano-dashboard + -b release-0.2 +># chmod +x murano-dashboard/setup*.sh + + + + Install the component + On Ubuntu + +># murano-dashboard/setup.sh install + + + + on CentOS + +># murano-dashboard/setup-centos.sh install + + + + +
+
+ Murano Services Configuration + This chapter descrides how to configure Murano services + and services communicating with Murano. +
+ RabbitMQ Configuration Notes + OpenStack rabbitMQ credentials could be used for murano services, + but prefered way is to make additional changes into rabbitMQ + configuration, like own vhost, login and password. These steps + require superuser rights and should be run on the OpenStack + controller node where rabbitMQ service resides. + + How to do this: + +># rabbitmqctl add_user muranouser muranopassword +># rabbitmqctl set_user_tags muranouser administrator +># rabbitmqctl add_vhost muranovhost +># rabbitmqctl set_permissions -p muranovhost muranouser ".*" ".*" ".*" + + +
+
+ Keystone Configuration Notes + Service entry for murano-api and endpoint associated with it + could also be  configured in the keystone. If there is no record + about murano-api in the keystone murano-dashboard would try to + reach murano-api service at localhost on the default murano-api + port 8082. + + How to add service record into the keystone using python keystone + client: + +># keystone service-create --name muranoapi --type murano \ + --description "Murano-Api Service" + + This command returns UUID of the created service record, which + should be used below. + +># keystone endpoint-create \ +   --service-id UUID_from_above \ +   --publicurl http://murano_vm_address:8082 \ +   --internalurl http://murano_vm_address:8082 \ +   --adminurl http://murano_vm_address:8082 \ + + +
+
+ Murano-Api Configuration + Configuration files of the murano-api service reside at + /etc/murano-api directory. Basic configuration parameters are + listed below. + + + + murano-api.conf + + + +[DEFAULT] +... +bind_host = 0.0.0.0 +bind_port = 8082 +log_file = /var/log/murano-api.log +... +… +[database] +... +#connection = mysql://mysqluser:mysqlpassword@mysqlhost:3306/murano + +connection = sqlite:////etc/murano-api/murano.sqlite + +… +... +[rabbitmq] +host = <rabbitmq ip> +port = 5672 +login = <rabbitmq login> +password = <rabbitmq password> +virtual_host = <rabbitmq vhost> +... + + + + murano-api-paste.ini + + + +... +[filter:authtoken] +auth_host = <keystone_ip> +auth_port = 35357 +auth_protocol = http +admin_tenant_name = admin +admin_user = admin +admin_password = admin_password +... + +
+
+ Murano-Conductor + + Configuration files of the murano-conductor service reside at + /etc/murano-conductor directory. Basic configuration parameters are + listed below: + + + + conductor.conf + + + +[DEFAULT] +… +log_file = /var/log/murano-conductor.log + +… +… +[keystone] +# URL of OpenStack KeyStone service REST + API. + +# Typically only hostname (or IP) needs to be + changed + +auth_url = http://keystone_ip:5000/v2.0 +... +... +[rabbitmq] +host = <rabbitmq ip> +port = 5672 +login = <rabbitmq login> +password = <rabbitmq password> +virtual_host = <rabbitmq vhost> +... + + + + conductor-paste.ini + + + It’s empty but must exist. +
+
+ Murano-Dashboard +  Murano-dashboard does not need to be configured, but we need to + set up proper OPENSTACK_HOST variable in the OpenStack dashboard + configuration file, which resides at + /etc/openstack-dashboard + directory. It should point to the OpenStack controller node. + + +… +# optional, but sometimes very useful to set DEBUG to ‘True’ +DEBUG = True +... +OPENSTACK_HOST = + “openstack_controller_address” +... + +
+
+
+ diff --git a/src/getting-started/src/docbkx/content/setup_lab_environment.xml b/src/getting-started/src/docbkx/content/setup_lab_environment.xml new file mode 100644 index 0000000..87c11fa --- /dev/null +++ b/src/getting-started/src/docbkx/content/setup_lab_environment.xml @@ -0,0 +1,405 @@ + + + + Setup Lab Environment +
+ Install OpenStack + + To install Murano you need a working copy of OpenStack. + If you already have a Openstack installation make sure it meets the requirements + described in this chapter. + To install Openstack that will be ready to use with Murano + follow the instructions below. + + Using Devstack + + Currently the most simple way to build a lab is to use + devstack. The steps are quite simple: + + + + + Install and configure OS on your hardware. The + recommended OS is Ubuntu Server 12.04 x64. Minimal + configuration would be enough. + + + + Install all the latest updates. + + + +># apt-get update +># apt-get -y upgrade + + + + Create a user stack + + + +># adduser stack + + + + Add user stack to sudoers + + + +># echo ‘stack ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/stack +># chmod 0440 /etc/sudoers.d/stack + + + + Create a folder for OpenStack installation files + + + + +># mkdir /opt/stack +># chown stack:stack /opt/stack + + + + Clone the devstack repo + + + +># su stack +>$ cd +>$ git clone https://github.com/openstack-dev/devstack.git + + + + Checkout the stable/grizzly branch + + + +>$ cd devstack +>$ git checkout stable/grizzly + + + + Get localrc and local.sh files + + + +>$ wget https://raw.github.com/stackforge/murano-deployment/release-0.2/ + getting-started/localrc +>$ wget https://raw.github.com/stackforge/murano-deployment/release-0.2/ + getting-started/local.sh -O local.sh-O local.sh +>$ chmod +x local.sh + + + + Start devstack + + + +>$ ./stack.sh + + + When stack.sh finishes execution your OpenStack + installation is ready. + +
+
+ Prepare Shared Prerequisites + Configure Samba Share + + + + Install SAMBA + + + +># apt-get update +># apt-get install samba + + + + Create shared folder + + + +># mkdir -p /opt/samba/share +>#chown nobody:nogroup /opt/samba/share + + + + Edit /etc/samba/smb.conf + + + +... +[global]     + ...     + security = user +... +[share] +    comment = Deployment Share + path = /opt/samba/share   + browsable = yes + guest ok = yes     + guest account = nobody +    read only = no + create mask = 0755 + + + + Restart services + + + +># restart smbd># restart nmdb + + + Copy Prerequisites Into The Share + + + Create folder structure + + + +># mkdir -p “/opt/samba/share/Prerequisites/IIS” +># mkdir -p “/opt/samba/share/Prerequisites/SQL Server/2012” +># mkdir -p “/opt/samba/share/Prerequisites/SQL Server/Tools” + + + + Add files to the folder structure under + /opt/samba/share folder: + + + +
+
+ Build Windows Image + A pre-built Windows Image is required to create environments + in Murano. Because of its size it’s better to build the image + on the same host where OpenStack is installed. This section describe + steps required to build such an image. + + Prepare Build Environment + + + + Samba should be already installed (See Configure samba share) + + + + Clone murano-deployment repository + + + +># cd /opt/git +># git clone git://github.com/stackforge/murano-deployment.git + + + + Change directory to murano-deployment/image-builder + folder + + + + +># cd /opt/git/murano-deployment/image-builder + + + + Create folder structure for image builder + + + +># make build-root + + + + + Download and put the following files to the specified paths under + /opt/image-builder folder: + + + + + Windows 2012 Server ISO evaluation version: libvirt/images/ws­2012­eval.iso + + + + + + VirtIO drivers + + should be placed to libvirt/images/virtio-win-0.1-52.iso + + + + + + + CloudBase-Init for Windows: + + share/files/CloudbaseInitSetup_Beta.msi + + + + + + Far Manager: + + share/files/Far30b3367.x64.20130426.msi + + + + + + Git client + + share/files/Git-1.8.1.2-preview20130201.exe + + + + + + Sysinternals + + Suiteshare/files/SysinternalsSuite.zip + + + + + + unzip.exe tool + + share/files/unzip.exe + + + + + + PowerShell v3 + + share/files/Windows6.1-KB2506143-x64.msu + + + + + + .NET 4.0: + + share/files/dotNetFx40_Full_x86_x64.exe + + + + + + .NET 4.5: + + share/files/dotNetFx45_Full_setup.exe + + + + + + Murano Agent + + share/files/MuranoAgent.zip + + + + + + + Test that all required files are in place + + + +># make test-build-files + + + + Build The Image + + + Get list of supported images + + + +># make + + + + Run image build process + + + + ># make ws-2012-std + + + + Wait until process finishes + + + The image file ws-2012-std.qcow2 will be stored in + /opt/image-builder/share/images folder. + + + + Import Windows Image Into Glance + Now when you’ve built a Windows Image it must be imported into Glance. + + + + Import openrc file which contains environment + variables definitions required by OpenStack components + + + + +>$ source openrc + + + + + Import the Windows Server 2012 image into Glance + +>$ cd /opt/image-builder/share/images +>$ glance image-create --name ws-2012-std --disk-format qcow2 \ + --container-type bare --file ws-2012-std.qcow2 \ + --is-public true \ + --property murano_image_info='{"type":"ws-2012-std",\ + "title":"Windows Server 2012 Standard"}' + + + + + The value of the --property argument named + murano_image_info is a JSON string. Only double quotes are + valid in JSON, so please type the string exactly as in the + example above. + + + + +
+
\ No newline at end of file diff --git a/src/getting-started/src/docbkx/content/troubleshooting.xml b/src/getting-started/src/docbkx/content/troubleshooting.xml new file mode 100644 index 0000000..0455ccc --- /dev/null +++ b/src/getting-started/src/docbkx/content/troubleshooting.xml @@ -0,0 +1,155 @@ + + + + Troubleshooting + + Set debug options to "true" in all config files - dashboard, api, + conductor. + + + The following debug sequence should be used when you have + no idea about why the system isn't working. If you have one, you + may skip unnecessary sections. + + + First, stop both murano-api and murano-conductor services. We + will start them one by one from the console. + + Murano-Api + + + Open new console + + + Start api service manually + + + +># murano-api --config-dir /etc/murano-api \ + > /var/log/murano-api-live.log & +># tailf /var/log/murano-api-live.log + + + + Open dashboard, create and send to deploy some simple + environment. + + + + Open RabbitMQ web console, open your vhost and ensure + that queues were created and there is at least one message. + + + + Check log for errors - there shouldn't be any + + + Keep murano-api service running. + + + Murano-Conductor + + + Open new console + + + Start conductor from console + + + +># muranoconductor --config-dir /etc/murano-conductor > \ + /var/log/murano-conductor-live.log & +># tailf /var/log/murano-conductor-live.log + + + + Check that there is no python exceptions in the log. Some + errors like 404 are ok, as conductor tries to delete + environment that doesn't exist. + + + + Check heat stack status. It should not be in FAILED + state. If it is - check heat and nova error log to find the + cause. + + + + Keep murano-conductor service running. + + + Now, the environment should be created, and instance(s) + launched. + + + Next, check if instances were configured correctly by the + cloudbase init tool. + + + Log in to any instance and open powershell log file at + C:\Murano\PowerShell.log. There shouldn't be any exceptions logged. + Other symptoms of successful configuration is that the instance was + renamed and you have to press <Ctrl>+<Alt>+<Del> + to log into. Unconfigured instance has autologon enabled for the + first logon, so if console is open, the instance is not configured + (yet). + + Check that Murano Agent has correct config file. If there is a + .bak file, then it was changed by the init script. Check the file, +  ensure that it has correct values. + + Check Murano Agent log file. There should be logged all tasks + received by the agent from the conductor. + + Check PowerShell log. There should be messages about all + functions, executed on the instance. + +
+ Log files + Murano Log Files + + + /var/log/murano-api.log + + + /var/log/murano-conductor.log + + + /var/log/apache2/errors.log + + + + /var/log/httpd/errors.log + + + Windows Log Files + + + C:\Murano\PowerShell.log + + + C:\Murano\Agent\log.txt + + +
+
\ No newline at end of file diff --git a/src/getting-started/src/docbkx/getting-started.xml b/src/getting-started/src/docbkx/getting-started.xml new file mode 100644 index 0000000..4bb51f0 --- /dev/null +++ b/src/getting-started/src/docbkx/getting-started.xml @@ -0,0 +1,69 @@ + + + + Murano Getting Started Guide + + + + + + + + Mirantis, Inc. + + + + 2013 + Mirantis, Inc. + + v0.1 + Murano™ + 2013-09-04 + + + Copyright details are filled in by the template. Change + the value of the role + attribute on the legalnotice element to change the license. + + + + + This document is intended for individuals who wish to + use our product or intend to contribute. + + + + this is a placeholder for the front cover + + + this is a placeholder for the back cover + + + + + + + + + diff --git a/src/getting-started/src/docbkx/style/config.xsl b/src/getting-started/src/docbkx/style/config.xsl new file mode 100644 index 0000000..4e7f3d9 --- /dev/null +++ b/src/getting-started/src/docbkx/style/config.xsl @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/src/getting-started/src/docbkx/style/getting-started.css b/src/getting-started/src/docbkx/style/getting-started.css new file mode 100644 index 0000000..e41b4f9 --- /dev/null +++ b/src/getting-started/src/docbkx/style/getting-started.css @@ -0,0 +1,54 @@ +img { + max-width: 100%; + width: auto; + height: auto; +} + body { + font-family: luxi sans,sans-serif; +} + +.screen { + font-family: monospace; + font-size: 1em; + display: block; + padding: 10px; + border: 1px solid #bbb; + background-color: #eee; + color: #000; + overflow: auto; + border-radius: 2.5px; + -moz-border-radius: 2.5px; + margin: 0.5em 2em; + +} + +.programlisting { + font-family: monospace; + font-size: 1em; + display: block; + padding: 10px; + border: 1px solid #bbb; + background-color: #ddd; + color: #000; + overflow: auto; + border-radius: 2.5px; + -moz-border-radius: 2.5px; + margin: 0.5em 2em; +} + +a[href] { + text-decoration: none; + color: #0a5ba8; + } + +a[href]:hover { + text-decoration:underline +} + +a:visited { + color: #131580; + } + +a:active { + color: #0a5ba8; + } \ No newline at end of file diff --git a/src/user-guide/pom.xml b/src/user-guide/pom.xml index 5166987..58c04d8 100644 --- a/src/user-guide/pom.xml +++ b/src/user-guide/pom.xml @@ -38,6 +38,10 @@ + ${basedir}/src/docbkx/style/config.xsl + + ${basedir}/src/docbkx/style/user-guide.css + true 100 diff --git a/src/user-guide/src/docbkx/content/murano-dashboard.xml b/src/user-guide/src/docbkx/content/murano-dashboard.xml index 833d8e6..6403e58 100644 --- a/src/user-guide/src/docbkx/content/murano-dashboard.xml +++ b/src/user-guide/src/docbkx/content/murano-dashboard.xml @@ -53,8 +53,8 @@ All services should be created in the context of Environment - virtual Windows Data Center. After Environment is created services prototypes and then deploy the Environment. When deploy process is done instances - with your service will be spawned in Openstack. - To create service prototype navigate to environment services by + with your services will be spawned in Openstack. + To create a service prototype navigate to environment services by clicking on the environment name (or on the "Services" button) and click the "Create Service" button. @@ -64,7 +64,7 @@ - You have opportunity to create one of the following services: + You have an opportunity to create one of the following services: @@ -74,14 +74,14 @@ Once you choose service that you want to create click "Next" and fill the form. Forms for each service are specific. - To see more information about filling the form for a specified service follow one of the link below: + To see more information about filling the form for a specific service follow one of the link below: Active Directory: Active Directory is a directory service implemented by Microsoft for Windows domain networks. - In one installation in addition to primary Domain Controller + In one installation, in addition to primary Domain Controller, you can add optional count of secondary Domain Controllers. Any other services you are intending to create can be joined to that domain. @@ -154,11 +154,105 @@
Active Directory + + After you picked the Active Directory service in service creation + wizard you'll see the following form: + - + + + Enter or select values for this fields: + + + + + + + + Domain name + + + + Enter a desired name for a new domain. This name should fit to + DNS Domain Name requirements: it should contain + only A-Z, a-z, 0-9, (.) and (-) and should not end with a dash. + DNS server will be automatically set up on each of the Domain + Controller instances. + Period characters are allowed only when they + are used to delimit the components of domain style + names. Single-level domain is not appropriate. + Note: Only first 15 characters or characters + before first period is used as NetBIOS name. + + + + + Instance Count + + + You can create several Active Directory instances by setting + instance number larger than one. One primary + Domain Controller and a few secondary DCs will be created. + + + + + Account Name + + + You account will have Active Directory administrator rights. + So initial value is "Administrator" but you can change it to any name you like. + + + + + Administrator password + + + Windows requires strong password for service administration. + Your password should have at least one letter + in each + register, a number and a special character. + Password length should be + a minimum of 7 characters. + + Once you forget your password you won't be able + to + operate the service until recovery password + would be entered. So it's + better for Recovery and Administrator password + to be different. + + + + + Confirm password + + Password confirmation is required. + + + + Recovery password + + + Restrictions are the same as for the Administrator password. + Please provide password that is different from Administrator. + It's not required for form validation though. + + + + + Confirm password + + Password confirmation is required. + + + +
Internet Information Service @@ -207,16 +301,137 @@ + Enter or select values for the following fields: + + + + + + + Service Name + + + + Enter a desired name for a service. Just A-Z, + a-z, 0-9, dash and underline are allowed. + + + + + + Administrator password + + + + Windows requires strong password for service + administration. + Your password should have at least one letter + in each register, a number and a special character. + Password length should be a minimum of 7 characters. + + + + + + Confirm password + + + Password confirmation is required. + + + + + Active Directory is configured by the System Administrator + + + + + Enable this option only if you have properly configured rules + that will include service to the domain, that already exists in you environment. + Once you set this option to true, additional fields will appear. (See information below) + + + + + + Domain + + + + Service should be joined to the Active + Directory + domain. Please, create Active Directory Service + prototype first. + + + + + + Mixed-mode Authentication + + + + Mixed authentication mode allows the use of Windows + credentials but supplements them with local SQL + Server user accounts that the administrator may create and + maintain within SQL Server. If this mode is on SA password is required + + + + + + SA Password + + + + Set system administrator password for the MS SQL Server. + Password requirements are the same as previous. + + + + + + + In case pre-configured AD is enabled following fields will appeared: + + + + + + + + Active Directory User + Active Directory Password + + + + Specify administrator user credentials to the existent AD domain + (to which service service will be join according to your system automation setup) + + + + + + + + + +
@@ -242,7 +457,7 @@ You can monitor deploying process. Just go to the Log tab on service - detailed page where you can get by clicking on the service name. + detailed page, where you can get by clicking on the service name. @@ -258,7 +473,7 @@ - As long as installation and configuration are in progress environment + As long as installation and configuration are in progress, environment is in Deploying state. Depending on how many services you are deploying or how many nodes in your cluster, process of spawning instances, installation and post installation settings takes from 10 minutes up to one hour. @@ -269,7 +484,7 @@ - If installation process finished without any errors environment changes its status to + If installation process finished without any errors, environment changes its status to Ready: @@ -282,7 +497,7 @@ Working with deployed environment Congratulations! After some time waiting you are able to operate with the services. - To get information about installed services navigate to service detailed page. + To get information about installed services, navigate to service detailed page. To do that click on the environment name and then on the name of the service you what to know about. @@ -326,9 +541,9 @@
Redeploying Murano Environment - Murano gives opportunity to supplement already deployed environment. - If you deployed the Active Directory service and want to create - any other service just create desired service prototype and click on the "Deploy Environment" button. + Murano gives an opportunity to supplement already deployed environment. + Thus if you already deployed the Active Directory service and want to add + any other services just create desired service prototype and click the "Deploy Environment" button. During service prototype creation you can join this service to the existent Active Directory domain.
@@ -410,7 +625,7 @@
Renaming Murano Environment - It's possible to change name of your environment: just click the "More-> Edit Environment" button on environment index page: + It's possible to change a name of your environment: just click the "More-> Edit Environment" button on environment index page: @@ -433,7 +648,6 @@ Troubleshooting How to debug OpenStack Heat? - If you can execute Heat command via console interface - all good. It is the most simple way to check Heat state on the node - jest execute CLI command 'heat list'. @@ -443,18 +657,18 @@ If 'heat list' returns 503 error - It is means that OpenStack Heat configuration files contains incorrect + It means that OpenStack Heat configuration files contain incorrect credentials. Need to set 'user' = 'heat' and change passwords 'verybadpass' in all configuration files from directory /etc/heat/ If 'heat list' hangs up - Sometimes ypu can see that 'heat list' hangs up. The root of this + Sometimes you can see that 'heat list' hangs up. The root of this problem - connection to the rabbitMQ. How I can connect to LoadBalancer instance in Server Farms? - First of all you should have KeyPair file 'murano-lb-key', you can + First of all you should have KeyPair file 'murano-lb-key'. You can create this file using commands murano-lb-key.priv chmod 600 murano-lb-key.priv ]]> - And after that you should create server farms with this KeyPair. + And after that server farms need to be created with this KeyPair. The second step is to 'how to connect to VM with LoadBalancer': Murano dashboard can not connect to Murano API. How I can fix it? - This is problem has two ways to fix: + This problem has two ways to fix: Add string - - to file /etc/openstack-dashboard/local_settings (or - /etc/openstack-dashboard/local_settings.py - it is depends on OpenStack + to the /etc/openstack-dashboard/local_settings (or + /etc/openstack-dashboard/local_settings.py - it depends on OpenStack configuration) - and after that need to restart web server. + and after that web server restart is needed. Add keystone endpoints for Murano API - Sometimes we can see in logs of the deployments: + Sometimes we can see in deployments logs: - The root of this problem in incorrect configuration - Heat can not + The root of this problem is incorrect configuration - Heat can not create Load Balancer instance. Please, remember that you should have - admin access for project in OpenStack to deploy LoadBalancer and also, + admin access for the project in OpenStack to deploy LoadBalancer and also, you should have KeyPair with default name 'murano-lb-key'. Error in Murano API logs 'No module named helpers.token_sanitizer' - This is problem with pip version. Need to install pip 1.4 and after that reinstall murano-client, murano-common and murano-api. + This pip version problem. Need to install pip 1.4 and after that reinstall murano-client, murano-common and murano-api.
\ No newline at end of file diff --git a/src/user-guide/src/docbkx/images/cluster3.png b/src/user-guide/src/docbkx/images/cluster3.png new file mode 100644 index 0000000000000000000000000000000000000000..ad1998eff33b5a94a6016b86cc7b187572c2e834 GIT binary patch literal 20458 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 + + + + + + + \ No newline at end of file diff --git a/src/user-guide/src/docbkx/style/user-guide.css b/src/user-guide/src/docbkx/style/user-guide.css new file mode 100644 index 0000000..4c7b14b --- /dev/null +++ b/src/user-guide/src/docbkx/style/user-guide.css @@ -0,0 +1,55 @@ +img { + max-width: 800px; + width: auto; + height: auto; +} + +body { + font-family: luxi sans,sans-serif; +} + +.screen { + font-family: monospace; + font-size: 1em; + display: block; + padding: 10px; + border: 1px solid #bbb; + background-color: #eee; + color: #000; + overflow: auto; + border-radius: 2.5px; + -moz-border-radius: 2.5px; + margin: 0.5em 2em; + +} + +.programlisting { + font-family: monospace; + font-size: 1em; + display: block; + padding: 10px; + border: 1px solid #bbb; + background-color: #BDBDBD; + color: #000; + overflow: auto; + border-radius: 2.5px; + -moz-border-radius: 2.5px; + margin: 0.5em 2em; +} + +a[href] { + text-decoration: none; + color: #0a5ba8; +} + +a[href]:hover { + text-decoration:underline +} + +a:visited { + color: #131580; +} + +a:active { + color: #0a5ba8; +} \ No newline at end of file