Merge "Add doc for multi-clouds support"
This commit is contained in:
commit
8aea1ca7b2
15
doc/source/template_guide/feature_guide.rst
Normal file
15
doc/source/template_guide/feature_guide.rst
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
.. highlight: yaml
|
||||||
|
:linenothreshold: 5
|
||||||
|
|
||||||
|
.. _feature_guide:
|
||||||
|
|
||||||
|
======================
|
||||||
|
Guideline for features
|
||||||
|
======================
|
||||||
|
|
||||||
|
Here are guideline for features:
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
multi-clouds
|
@ -21,6 +21,7 @@ Template Guide
|
|||||||
|
|
||||||
hot_guide
|
hot_guide
|
||||||
hello_world
|
hello_world
|
||||||
|
feature_guide
|
||||||
hot_spec
|
hot_spec
|
||||||
basic_resources
|
basic_resources
|
||||||
software_deployment
|
software_deployment
|
||||||
|
186
doc/source/template_guide/multi-clouds.rst
Normal file
186
doc/source/template_guide/multi-clouds.rst
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
.. highlight: yaml
|
||||||
|
:linenothreshold: 5
|
||||||
|
|
||||||
|
.. _multi-clouds:
|
||||||
|
|
||||||
|
====================
|
||||||
|
Multi-Clouds support
|
||||||
|
====================
|
||||||
|
|
||||||
|
Start from Stein release (version 12.0.0), Heat support multi-clouds
|
||||||
|
orchestration. This document means to provide guideline for how to use
|
||||||
|
multi-clouds features, and what's the environment requirement.
|
||||||
|
|
||||||
|
.. note:: If you like to create a stack in multi-region environment,
|
||||||
|
you don't need this feature at all. all you need to do is provide
|
||||||
|
`region_name` under `context` property for `OS::Heat::Stack`_.
|
||||||
|
If you like to see information on how to provide SSL support for
|
||||||
|
your multi-region environment, you can jump to `Use CA
|
||||||
|
cert(Optional)`_ .
|
||||||
|
|
||||||
|
Requirements
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
|
* **Barbican service** - For better security concerns, multi-cloud
|
||||||
|
orchestration feature depends on Barbican service. So you have to make sure
|
||||||
|
Barbican service is ready in your environment before you use this feature.
|
||||||
|
|
||||||
|
* **Access to remote Orchestration service** - Before you run your multi-cloud
|
||||||
|
template. Make sure you're able to access to remote Orchestration service
|
||||||
|
with correct endpoint information, legal access right, and ability to access
|
||||||
|
to the remote site KeyStone, and Orchestration service API endpoint from
|
||||||
|
local site. You need to make sure local Orchestration service is able to
|
||||||
|
trigger and complete necessary API calls from local site to remote site. So we
|
||||||
|
can complete stack actions without facing any access error.
|
||||||
|
|
||||||
|
* **Template complete resources/functions compatibility** - In your
|
||||||
|
Orchestration template, you might want to use all kind of template functions
|
||||||
|
or resource types as your template version and your Orchestration service
|
||||||
|
allows. But please aware that once you plan to use Orchestration services
|
||||||
|
across multiple OpenStack clouds, you have to also consider the
|
||||||
|
compatibility. Make sure the template version and resource types are ready to
|
||||||
|
use before you ask remote site to run it. If you accidentally provide wrong
|
||||||
|
template version (which not provided in remote site), you will get error
|
||||||
|
message from remote site which prevent you from actually create remote
|
||||||
|
resources. But it's even better if we can just find such an error earlier.
|
||||||
|
|
||||||
|
|
||||||
|
Prepare
|
||||||
|
~~~~~~~
|
||||||
|
|
||||||
|
First of all, you need to put your remote cloud credential in a Barbican
|
||||||
|
secret. To build your own multi-clouds stack, you need to build a Barbican
|
||||||
|
secret first with most information for remote endpoint information.
|
||||||
|
|
||||||
|
Gathering credential information
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
Before we start generating secret, let's talk about what credential format we
|
||||||
|
need. credential is a JSON format string contains two keys ``auth_type``, and
|
||||||
|
``auth``. ``auth_type``, and ``auth`` following auth plugin loader rules from
|
||||||
|
Keystone. You can find `plugin options`_ and `authentication plugins`_ in
|
||||||
|
keystoneauth documents.
|
||||||
|
|
||||||
|
* **auth_type** - ``auth_type`` is a string for plugin name. Allows value like
|
||||||
|
`v3applicationcredential`, `password`, `v3oidcclientcredentials`, etc. You
|
||||||
|
need to provide `available plugins`_.
|
||||||
|
|
||||||
|
* **auth** - auth is a dictionary contains all parameters for plugins to
|
||||||
|
perform authentication. You can find all valid parameter references from
|
||||||
|
`available plugins`_ or get to all class path from `plugin names`_ for more
|
||||||
|
detail allowed value or trace plugin class from there.
|
||||||
|
|
||||||
|
As you can tell, all allowed authentication plugins for credentials follows
|
||||||
|
plugins keystoneauth rules. So once new change in keystoneauth, it will also
|
||||||
|
directly reflect credentials too.
|
||||||
|
Actually we just call keystoneauth to get plugin loader for remote
|
||||||
|
authentication plugins. So keep an eye on keystoneauth if you're using this
|
||||||
|
feature.
|
||||||
|
|
||||||
|
Validate your credential
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
Now you have all your credential information ready, try to validate first if
|
||||||
|
you can. You can either directly test them `via config`_, `via CLI`_, or
|
||||||
|
`via keystoneauth sessions`_.
|
||||||
|
|
||||||
|
build credential secret
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
Once you're sure it's valid, we can start building the secret out.
|
||||||
|
To build a secret you just have to follow standard Barbican CLI_ or API to
|
||||||
|
store your secret.
|
||||||
|
|
||||||
|
The local site will read this secret to perform stack actions in remote site.
|
||||||
|
Let's give a quick example here:
|
||||||
|
Said you have two OpenStack cloud site A and site B.
|
||||||
|
If you need to control site B from site A, make sure you have a secret with
|
||||||
|
site B's access information in site A. If you also like to control site A from
|
||||||
|
site B, make sure you have a secret with site A's access information in site B.
|
||||||
|
|
||||||
|
.. code-block:: sh
|
||||||
|
|
||||||
|
openstack secret store -n appcred --payload '{"auth_type": "v3applicationcredential", "auth": {"auth_url": "{Keystone_URL}", "application_credential_id": "{ID}", "application_credential_secret": "{SECRET}"}}'
|
||||||
|
|
||||||
|
.. note:: One common error for JSON format is to use single quote(`'`)
|
||||||
|
instead of double quote (`"`) inner your JSON schema.
|
||||||
|
|
||||||
|
Create remote stacks
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
Now, you have a secret id generated for your Barbican secret. Use that id as
|
||||||
|
input for template.
|
||||||
|
|
||||||
|
To create a remote stack, you can simply use `OS::Heat::Stack`_ resource, as
|
||||||
|
child stack in your template (we also referring this structure as
|
||||||
|
`nested stack`).
|
||||||
|
|
||||||
|
In resource properties, provide `credential_secret_id` (Barbican secret ID
|
||||||
|
from the secret we just builded for credential) under `context` property.
|
||||||
|
|
||||||
|
Here is an template example for you:
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
heat_template_version: rocky
|
||||||
|
|
||||||
|
resources:
|
||||||
|
stack_in_remote_cloud:
|
||||||
|
type: OS::Heat::Stack
|
||||||
|
properties:
|
||||||
|
context:
|
||||||
|
credential_secret_id: {$Your_Secret_ID}
|
||||||
|
template: { get_file: "remote-app.yaml" }
|
||||||
|
|
||||||
|
And that's all you need to do. The rest looks the same as usual.
|
||||||
|
|
||||||
|
Local Heat will read that secret, parse the credential information out,
|
||||||
|
replace current authentication plugin in context, and make remote calls.
|
||||||
|
|
||||||
|
Heat will not store your credential information anywhere. so your secret
|
||||||
|
security will remains within Barbican. That means if you wish to change your
|
||||||
|
credential or make sure other people can't access to it. All you need to do is
|
||||||
|
to update your Barbican secret or strong the security for it.
|
||||||
|
But aware of this. If you plan to switch the credential content, make sure that
|
||||||
|
won't affect resources/stacks in remote site. So do such actions with super
|
||||||
|
care.
|
||||||
|
|
||||||
|
|
||||||
|
Use CA cert(Optional)
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
For production clouds, it's very important to have SSL support. Here we
|
||||||
|
provide CA cert method for your SSL access. If you wish to use that, use
|
||||||
|
`ca_cert` under `context` property. Which `ca_cert` is the contents of a CA
|
||||||
|
Certificate file that can be used to verify a remote cloud or region's server
|
||||||
|
certificate.
|
||||||
|
Or you can use `insecure` (a boolean option) under `context` property if you
|
||||||
|
like to use insecure mode (For security concerns, don't do it!) and you don't
|
||||||
|
want to use CA cert.
|
||||||
|
|
||||||
|
Here is an example for you:
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
heat_template_version: rocky
|
||||||
|
|
||||||
|
resources:
|
||||||
|
stack_in_remote_cloud:
|
||||||
|
type: OS::Heat::Stack
|
||||||
|
properties:
|
||||||
|
context:
|
||||||
|
credential_secret_id: {$Your_Secret_ID}
|
||||||
|
ca_cert: {$Contents of a CA cert}
|
||||||
|
template: { get_file: "remote-app.yaml" }
|
||||||
|
|
||||||
|
.. note:: If insecure flag is on, ca_cert will be ignored.
|
||||||
|
|
||||||
|
.. _`plugin options`: https://docs.openstack.org/keystoneauth/latest/plugin-options.html
|
||||||
|
.. _`authentication plugins`: https://docs.openstack.org/keystoneauth/latest/authentication-plugins.html#loading-plugins-by-name
|
||||||
|
.. _`plugin names`: https://docs.openstack.org/keystoneauth/latest/authentication-plugins.html#loading-plugins-by-name
|
||||||
|
.. _`available plugins`: https://docs.openstack.org/keystoneauth/latest/plugin-options.html#available-plugins
|
||||||
|
.. _`via keystoneauth sessions`: https://docs.openstack.org/keystoneauth/latest/using-sessions.html
|
||||||
|
.. _`via config`: https://docs.openstack.org/keystoneauth/latest/plugin-options.html#using-plugins-via-config-file
|
||||||
|
.. _`via CLI`: https://docs.openstack.org/keystoneauth/latest/plugin-options.html#using-plugins-via-cli
|
||||||
|
.. _CLI: https://docs.openstack.org/python-barbicanclient/latest/cli/cli_usage.html#secret-create
|
||||||
|
.. _`OS::Heat::Stack`: https://docs.openstack.org/heat/rocky/template_guide/openstack.html#OS::Heat::Stack
|
@ -83,7 +83,7 @@ function _config_tempest_plugin
|
|||||||
# support test multi-cloud
|
# support test multi-cloud
|
||||||
app_cred_id=$((openstack application credential show heat_multicloud || openstack application credential create heat_multicloud \
|
app_cred_id=$((openstack application credential show heat_multicloud || openstack application credential create heat_multicloud \
|
||||||
--secret secret --unrestricted) | grep ' id '|awk '{print $4}')
|
--secret secret --unrestricted) | grep ' id '|awk '{print $4}')
|
||||||
export OS_CREDENTIAL_SECRET_ID=$(openstack secret store -n heat-multi-cloud-test-cred --payload '{"auth_type": "v3applicationcredential", "auth": {"auth_url": $OS_AUTH_URL, "application_credential_id": $app_cred_id, "application_credential_secret": "secret"}, "roles": ["admin"], "project_id": $app_cred_project_id}')
|
export OS_CREDENTIAL_SECRET_ID=$(openstack secret store -n heat-multi-cloud-test-cred --payload '{"auth_type": "v3applicationcredential", "auth": {"auth_url": $OS_AUTH_URL, "application_credential_id": $app_cred_id, "application_credential_secret": "secret"}}')
|
||||||
iniset $conf_file heat_features_enabled multi_cloud True
|
iniset $conf_file heat_features_enabled multi_cloud True
|
||||||
iniset $conf_file heat_plugin heat_plugin credential_secret_id $OS_CREDENTIAL_SECRET_ID
|
iniset $conf_file heat_plugin heat_plugin credential_secret_id $OS_CREDENTIAL_SECRET_ID
|
||||||
|
|
||||||
|
@ -0,0 +1,4 @@
|
|||||||
|
---
|
||||||
|
other:
|
||||||
|
- |
|
||||||
|
New document is out for ``multi-clouds support``, check out https://docs.openstack.org/heat/latest/template_guide/multi-clouds.html for more information.
|
Loading…
Reference in New Issue
Block a user