Switch overcloud to software-config
This migrates the overcloud to using OS::Heat::StructuredConfig and OS::Heat::StructuredDeployment. With those tools, we can decouple servers from software configuration and begin to deprecate features in tripleo_heat_merge. Change-Id: Ice85f0711e90d0fabf1d1bc4698201c4d6758508
This commit is contained in:
parent
a830cea3b1
commit
be5af1a35e
4
Makefile
4
Makefile
|
@ -11,8 +11,8 @@ overcloud_source_deps = nova-compute-instance.yaml
|
||||||
|
|
||||||
all: $(generated_templates)
|
all: $(generated_templates)
|
||||||
|
|
||||||
overcloud.yaml: overcloud-source.yaml block-storage.yaml swift-source.yaml swift-storage-source.yaml ssl-source.yaml $(overcloud_source_deps)
|
overcloud.yaml: overcloud-source.yaml block-storage.yaml swift-deploy.yaml swift-source.yaml swift-storage-source.yaml ssl-source.yaml nova-compute-config.yaml $(overcloud_source_deps)
|
||||||
python ./tripleo_heat_merge/merge.py --scale NovaCompute=$${COMPUTESCALE:-'1'} --scale SwiftStorage=$${SWIFTSTORAGESCALE='0'} --scale BlockStorage=$${BLOCKSTORAGESCALE='0'} overcloud-source.yaml block-storage.yaml swift-source.yaml swift-storage-source.yaml ssl-source.yaml > $@.tmp
|
python ./tripleo_heat_merge/merge.py --scale NovaCompute=$${COMPUTESCALE:-'1'} --scale SwiftStorage=$${SWIFTSTORAGESCALE='0'} --scale BlockStorage=$${BLOCKSTORAGESCALE='0'} overcloud-source.yaml block-storage.yaml swift-source.yaml swift-storage-source.yaml ssl-source.yaml swift-deploy.yaml nova-compute-config.yaml > $@.tmp
|
||||||
mv $@.tmp $@
|
mv $@.tmp $@
|
||||||
|
|
||||||
overcloud-with-block-storage-nfs.yaml: overcloud-source.yaml block-storage-nfs.yaml nfs-server-source.yaml swift-source.yaml swift-storage-source.yaml ssl-source.yaml $(overcloud_source_deps)
|
overcloud-with-block-storage-nfs.yaml: overcloud-source.yaml block-storage-nfs.yaml nfs-server-source.yaml swift-source.yaml swift-storage-source.yaml ssl-source.yaml $(overcloud_source_deps)
|
||||||
|
|
|
@ -15,30 +15,6 @@ Parameters:
|
||||||
Type: String
|
Type: String
|
||||||
Default: True
|
Default: True
|
||||||
Resources:
|
Resources:
|
||||||
BlockStorageAccessPolicy:
|
|
||||||
Type: OS::Heat::AccessPolicy
|
|
||||||
Properties:
|
|
||||||
AllowedResources:
|
|
||||||
- BlockStorage0
|
|
||||||
- BlockStorage0Config
|
|
||||||
BlockStorageUser:
|
|
||||||
Type: AWS::IAM::User
|
|
||||||
Properties:
|
|
||||||
Policies: [ { Ref: BlockStorageAccessPolicy } ]
|
|
||||||
BlockStorage0Key:
|
|
||||||
Type: AWS::IAM::AccessKey
|
|
||||||
Properties:
|
|
||||||
UserName:
|
|
||||||
Ref: BlockStorageUser
|
|
||||||
BlockStorage0CompletionCondition:
|
|
||||||
Type: AWS::CloudFormation::WaitCondition
|
|
||||||
DependsOn: controller0Config
|
|
||||||
Properties:
|
|
||||||
Handle: {Ref: BlockStorage0CompletionHandle}
|
|
||||||
Count: '1'
|
|
||||||
Timeout: '1800'
|
|
||||||
BlockStorage0CompletionHandle:
|
|
||||||
Type: AWS::CloudFormation::WaitConditionHandle
|
|
||||||
BlockStorage0:
|
BlockStorage0:
|
||||||
Type: OS::Nova::Server
|
Type: OS::Nova::Server
|
||||||
Properties:
|
Properties:
|
||||||
|
@ -46,37 +22,24 @@ Resources:
|
||||||
{Ref: BlockStorageImage}
|
{Ref: BlockStorageImage}
|
||||||
flavor: {Ref: OvercloudBlockStorageFlavor}
|
flavor: {Ref: OvercloudBlockStorageFlavor}
|
||||||
key_name: {Ref: KeyName}
|
key_name: {Ref: KeyName}
|
||||||
Metadata:
|
BlockStorage0Deployment:
|
||||||
os-collect-config:
|
Type: OS::Heat::StructuredDeployment
|
||||||
cfn:
|
|
||||||
access_key_id:
|
|
||||||
Ref: BlockStorage0Key
|
|
||||||
secret_access_key:
|
|
||||||
Fn::GetAtt: [ BlockStorage0Key, SecretAccessKey ]
|
|
||||||
stack_name: {Ref: 'AWS::StackName'}
|
|
||||||
path: BlockStorage0Config.Metadata
|
|
||||||
OpenStack::ImageBuilder::Elements: [ cinder ]
|
|
||||||
BlockStorage0Config:
|
|
||||||
Type: AWS::AutoScaling::LaunchConfiguration
|
|
||||||
Properties:
|
Properties:
|
||||||
InstanceType: '0'
|
server: {Ref: BlockStorage0}
|
||||||
ImageId: '0'
|
config: {Ref: BlockStorageConfig}
|
||||||
Metadata:
|
input_values:
|
||||||
completion-handle:
|
controller_host: {"Fn::Select": [ 0, {"Fn::Select": [ "ctlplane", {"Fn::GetAtt": [controller0, networks]} ]} ] }
|
||||||
Ref: BlockStorage0CompletionHandle
|
cinder_dsn: {"Fn::Join": ['', ['mysql://cinder:unset@', {"Fn::Select": [ 0, {"Fn::Select": [ "ctlplane", {"Fn::GetAtt": [controller0, networks]} ]} ] } , '/cinder']]}
|
||||||
os-collect-config:
|
neutron_local_ip: {"Fn::Select": [0, "Fn::Select": [ctlplane, [{"Fn::GetAtt": [BlockStorage0 , networks]}]]]}
|
||||||
cfn:
|
BlockStorageConfig:
|
||||||
access_key_id:
|
Type: OS::Heat::StructuredConfig
|
||||||
Ref: BlockStorage0Key
|
Properties:
|
||||||
secret_access_key:
|
config:
|
||||||
Fn::GetAtt: [ BlockStorage0Key, SecretAccessKey ]
|
|
||||||
stack_name: {Ref: 'AWS::StackName'}
|
|
||||||
path: BlockStorage0Config.Metadata
|
|
||||||
admin-password: {Ref: AdminPassword}
|
admin-password: {Ref: AdminPassword}
|
||||||
keystone:
|
keystone:
|
||||||
host: {"Fn::Select": [ 0, {"Fn::Select": [ "ctlplane", {"Fn::GetAtt": [controller0, networks]} ]} ] }
|
host: {get_input: controller_host}
|
||||||
cinder:
|
cinder:
|
||||||
db: {"Fn::Join": ['', ['mysql://cinder:unset@', {"Fn::Select": [ 0, {"Fn::Select": [ "ctlplane", {"Fn::GetAtt": [controller0, networks]} ]} ] } , '/cinder']]}
|
db: {get_input: cinder_dsn}
|
||||||
volume_size_mb: '5000'
|
volume_size_mb: '5000'
|
||||||
service-password:
|
service-password:
|
||||||
Ref: CinderPassword
|
Ref: CinderPassword
|
||||||
|
@ -84,21 +47,38 @@ Resources:
|
||||||
Ref: CinderISCSIHelper
|
Ref: CinderISCSIHelper
|
||||||
admin-password: {Ref: AdminPassword}
|
admin-password: {Ref: AdminPassword}
|
||||||
rabbit:
|
rabbit:
|
||||||
host: {"Fn::Select": [ 0, {"Fn::Select": [ "ctlplane", {"Fn::GetAtt": [controller0, networks]} ]} ] }
|
host: {get_input: controller_host}
|
||||||
username: {Ref: RabbitUserName}
|
username: {Ref: RabbitUserName}
|
||||||
password: {Ref: RabbitPassword}
|
password: {Ref: RabbitPassword}
|
||||||
interfaces:
|
interfaces:
|
||||||
control: {Ref: NeutronPublicInterface}
|
control: {Ref: NeutronPublicInterface}
|
||||||
neutron:
|
neutron:
|
||||||
ovs:
|
ovs:
|
||||||
local_ip:
|
local_ip: {get_input: neutron_local_ip}
|
||||||
Fn::Select:
|
tenant_network_type: {Ref: NeutronNetworkType}
|
||||||
- 0
|
enable_tunneling: {Ref: NeutronEnableTunnelling}
|
||||||
- Fn::Select:
|
service-password:
|
||||||
- ctlplane
|
Ref: NeutronPassword
|
||||||
- Fn::GetAtt:
|
config:
|
||||||
- BlockStorage0
|
keystone:
|
||||||
- networks
|
host: {get_input: controller_host}
|
||||||
|
cinder:
|
||||||
|
db: {get_input: cinder_dsn}
|
||||||
|
volume_size_mb: '5000'
|
||||||
|
service-password:
|
||||||
|
Ref: CinderPassword
|
||||||
|
iscsi-helper:
|
||||||
|
Ref: CinderISCSIHelper
|
||||||
|
admin-password: {Ref: AdminPassword}
|
||||||
|
rabbit:
|
||||||
|
host: {get_input: controller_host}
|
||||||
|
username: {Ref: RabbitUserName}
|
||||||
|
password: {Ref: RabbitPassword}
|
||||||
|
interfaces:
|
||||||
|
control: {Ref: NeutronPublicInterface}
|
||||||
|
neutron:
|
||||||
|
ovs:
|
||||||
|
local_ip: { get_input: neutron_local_ip }
|
||||||
tenant_network_type: {Ref: NeutronNetworkType}
|
tenant_network_type: {Ref: NeutronNetworkType}
|
||||||
enable_tunneling: {Ref: NeutronEnableTunnelling}
|
enable_tunneling: {Ref: NeutronEnableTunnelling}
|
||||||
service-password:
|
service-password:
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
Resources:
|
||||||
|
NovaComputeConfig:
|
||||||
|
Type: OS::Heat::StructuredConfig
|
||||||
|
Properties:
|
||||||
|
config:
|
||||||
|
nova:
|
||||||
|
compute_driver: { get_input: nova_compute_driver }
|
||||||
|
compute_libvirt_type: { get_input: nova_compute_libvirt_type }
|
||||||
|
db: {get_input: nova_dsn}
|
||||||
|
host: {get_input: nova_api_host}
|
||||||
|
service-password: {get_input: nova_password}
|
||||||
|
ceilometer:
|
||||||
|
db: {get_input: ceilometer_dsn}
|
||||||
|
metering_secret: {get_input: ceilometer_metering_secret}
|
||||||
|
service-password: {get_input: ceilometer_password}
|
||||||
|
compute_agent: {get_input: ceilometer_compute_agent}
|
||||||
|
glance:
|
||||||
|
host: {get_input: glance_host}
|
||||||
|
hosts: {get_input: static_hosts}
|
||||||
|
keystone:
|
||||||
|
host: {get_input: keystone_host}
|
||||||
|
neutron:
|
||||||
|
flat-networks: {get_input: neutron_flat_networks}
|
||||||
|
host: {get_input: neutron_host}
|
||||||
|
ovs_db: {get_input: neutron_dsn}
|
||||||
|
ovs:
|
||||||
|
local_ip: {get_input: neutron_local_ip}
|
||||||
|
tenant_network_type: {get_input: neutron_tenant_network_type}
|
||||||
|
network_vlan_ranges: {get_input: neutron_network_vlan_ranges}
|
||||||
|
bridge_mappings: {get_input: neutron_bridge_mappings}
|
||||||
|
enable_tunneling: {get_input: neutron_enable_tunneling}
|
||||||
|
physical_bridge: {get_input: neutron_physical_bridge}
|
||||||
|
public_interface: {get_input: neutron_public_interface}
|
||||||
|
service-password: {get_input: neutron_password}
|
||||||
|
admin-password: {get_input: admin_password}
|
||||||
|
rabbit:
|
||||||
|
host: {get_input: rabbit_host}
|
||||||
|
username: {get_input: rabbit_user_name}
|
||||||
|
password: {get_input: rabbit_password}
|
||||||
|
live-update:
|
||||||
|
host: {get_input: live_update_host}
|
||||||
|
username: {get_input: live_update_username}
|
||||||
|
password: {get_input: live_update_password}
|
||||||
|
tenant-name: {get_input: live_update_tenant_name}
|
||||||
|
base_image_id: {get_input: nova_image}
|
||||||
|
live_update_image_id: {get_input: live_update_compute_image}
|
||||||
|
completion-signal: {get_input: deploy_signal_id}
|
|
@ -114,28 +114,6 @@ Parameters:
|
||||||
Description: The image ID for live-updates to the overcloud compute nodes.
|
Description: The image ID for live-updates to the overcloud compute nodes.
|
||||||
Default: ''
|
Default: ''
|
||||||
Resources:
|
Resources:
|
||||||
ComputeAccessPolicy:
|
|
||||||
Type: OS::Heat::AccessPolicy
|
|
||||||
Properties:
|
|
||||||
AllowedResources: [ NovaCompute0 ]
|
|
||||||
ComputeUser:
|
|
||||||
Type: AWS::IAM::User
|
|
||||||
Properties:
|
|
||||||
Policies: [ { Ref: ComputeAccessPolicy } ]
|
|
||||||
NovaCompute0Key:
|
|
||||||
Type: AWS::IAM::AccessKey
|
|
||||||
Properties:
|
|
||||||
UserName:
|
|
||||||
Ref: ComputeUser
|
|
||||||
NovaCompute0CompletionCondition:
|
|
||||||
Type: AWS::CloudFormation::WaitCondition
|
|
||||||
DependsOn: controller0Config
|
|
||||||
Properties:
|
|
||||||
Handle: {Ref: NovaCompute0CompletionHandle}
|
|
||||||
Count: '1'
|
|
||||||
Timeout: '1800'
|
|
||||||
NovaCompute0CompletionHandle:
|
|
||||||
Type: AWS::CloudFormation::WaitConditionHandle
|
|
||||||
NovaCompute0:
|
NovaCompute0:
|
||||||
Type: OS::Nova::Server
|
Type: OS::Nova::Server
|
||||||
Properties:
|
Properties:
|
||||||
|
@ -145,79 +123,43 @@ Resources:
|
||||||
Ref: ImageUpdatePolicy
|
Ref: ImageUpdatePolicy
|
||||||
flavor: {Ref: OvercloudComputeFlavor}
|
flavor: {Ref: OvercloudComputeFlavor}
|
||||||
key_name: {Ref: KeyName}
|
key_name: {Ref: KeyName}
|
||||||
Metadata:
|
user_data_format: SOFTWARE_CONFIG
|
||||||
os-collect-config:
|
NovaCompute0Deploy:
|
||||||
cfn:
|
Type: OS::Heat::StructuredDeployment
|
||||||
access_key_id:
|
|
||||||
Ref: NovaCompute0Key
|
|
||||||
secret_access_key:
|
|
||||||
Fn::GetAtt: [ NovaCompute0Key, SecretAccessKey ]
|
|
||||||
stack_name: {Ref: 'AWS::StackName'}
|
|
||||||
path: NovaCompute0Config.Metadata
|
|
||||||
OpenStack::ImageBuilder::Elements: [ nova-compute ]
|
|
||||||
NovaCompute0Config:
|
|
||||||
Type: AWS::AutoScaling::LaunchConfiguration
|
|
||||||
Properties:
|
Properties:
|
||||||
InstanceType: '0'
|
config: {Ref: NovaComputeConfig}
|
||||||
ImageId: '0'
|
server: {Ref: NovaCompute0}
|
||||||
Metadata:
|
input_values:
|
||||||
completion-handle:
|
nova_compute_driver: {Ref: NovaComputeDriver}
|
||||||
Ref: NovaCompute0CompletionHandle
|
nova_compute_libvirt_type: {Ref: NovaComputeLibvirtType}
|
||||||
os-collect-config:
|
nova_dsn: {Ref: NovaDSN}
|
||||||
cfn:
|
nova_api_host: {Ref: NovaApiHost}
|
||||||
access_key_id:
|
nova_password: {Ref: NovaPassword}
|
||||||
Ref: NovaCompute0Key
|
ceilometer_dsn: {Ref: CeilometerDSN}
|
||||||
secret_access_key:
|
ceilometer_metering_secret: {Ref: CeilometerMeteringSecret}
|
||||||
Fn::GetAtt: [ NovaCompute0Key, SecretAccessKey ]
|
ceilometer_password: {Ref: CeilometerPassword}
|
||||||
stack_name: {Ref: 'AWS::StackName'}
|
ceilometer_compute_agent: {Ref: CeilometerComputeAgent}
|
||||||
path: NovaCompute0Config.Metadata
|
glance_host: {Ref: GlanceHost}
|
||||||
nova:
|
static_hosts: {Ref: StaticHosts}
|
||||||
compute_driver: {Ref: NovaComputeDriver}
|
keystone_host: {Ref: KeystoneHost}
|
||||||
compute_libvirt_type: {Ref: NovaComputeLibvirtType}
|
neutron_flat_networks: {Ref: NeutronFlatNetworks}
|
||||||
db: {Ref: NovaDSN}
|
neutron_host: {Ref: NeutronHost}
|
||||||
host: {Ref: NovaApiHost}
|
neutron_dsn: {Ref: NeutronDSN}
|
||||||
service-password:
|
neutron_local_ip: {"Fn::Select": [ 0, "Fn::Select": [ ctlplane, { "Fn::GetAtt": [ NovaCompute0, networks ]}]]}
|
||||||
Ref: NovaPassword
|
neutron_tenant_network_type: {Ref: NeutronNetworkType}
|
||||||
ceilometer:
|
neutron_network_vlan_ranges: {Ref: NeutronNetworkVLANRanges}
|
||||||
db: {Ref: CeilometerDSN}
|
neutron_bridge_mappings: {Ref: NeutronBridgeMappings}
|
||||||
metering_secret: {Ref: CeilometerMeteringSecret}
|
neutron_enable_tunneling: {Ref: NeutronEnableTunnelling}
|
||||||
service-password: {Ref: CeilometerPassword}
|
neutron_physical_bridge: {Ref: NeutronPhysicalBridge}
|
||||||
compute_agent: {Ref: CeilometerComputeAgent}
|
neutron_public_interface: {Ref: NeutronPublicInterface}
|
||||||
glance:
|
neutron_password: {Ref: NeutronPassword}
|
||||||
host: {Ref: GlanceHost}
|
admin_password: {Ref: AdminPassword}
|
||||||
hosts: {Ref: StaticHosts}
|
rabbit_host: {Ref: RabbitHost}
|
||||||
keystone:
|
rabbit_username: {Ref: RabbitUserName}
|
||||||
host: {Ref: KeystoneHost}
|
rabbit_password: {Ref: RabbitPassword}
|
||||||
neutron:
|
live_update_host: {Ref: LiveUpdateHost}
|
||||||
flat-networks: {Ref: NeutronFlatNetworks}
|
live_update_username: {Ref: LiveUpdateUserName}
|
||||||
host: {Ref: NeutronHost}
|
live_update_password: {Ref: LiveUpdatePassword}
|
||||||
ovs_db: {Ref: NeutronDSN}
|
live_update_tenant_name: {Ref: LiveUpdateTenantName}
|
||||||
ovs:
|
nova_image: {Ref: NovaImage}
|
||||||
local_ip:
|
|
||||||
Fn::Select:
|
|
||||||
- 0
|
|
||||||
- Fn::Select:
|
|
||||||
- ctlplane
|
|
||||||
- Fn::GetAtt:
|
|
||||||
- NovaCompute0
|
|
||||||
- networks
|
|
||||||
tenant_network_type: {Ref: NeutronNetworkType}
|
|
||||||
network_vlan_ranges: {Ref: NeutronNetworkVLANRanges}
|
|
||||||
bridge_mappings: {Ref: NeutronBridgeMappings}
|
|
||||||
enable_tunneling: {Ref: NeutronEnableTunnelling}
|
|
||||||
physical_bridge: {Ref: NeutronPhysicalBridge}
|
|
||||||
public_interface: {Ref: NeutronPublicInterface}
|
|
||||||
service-password:
|
|
||||||
Ref: NeutronPassword
|
|
||||||
admin-password: {Ref: AdminPassword}
|
|
||||||
rabbit:
|
|
||||||
host: {Ref: RabbitHost}
|
|
||||||
username: {Ref: RabbitUserName}
|
|
||||||
password: {Ref: RabbitPassword}
|
|
||||||
live-update:
|
|
||||||
host: {Ref: LiveUpdateHost}
|
|
||||||
username: {Ref: LiveUpdateUserName}
|
|
||||||
password: {Ref: LiveUpdatePassword}
|
|
||||||
tenant-name: {Ref: LiveUpdateTenantName}
|
|
||||||
base_image_id: {Ref: NovaImage}
|
|
||||||
live_update_image_id: {Ref: LiveUpdateComputeImage}
|
live_update_image_id: {Ref: LiveUpdateComputeImage}
|
||||||
|
|
|
@ -181,53 +181,10 @@ Resources:
|
||||||
length: 20
|
length: 20
|
||||||
salt:
|
salt:
|
||||||
Ref: RabbitCookieSalt
|
Ref: RabbitCookieSalt
|
||||||
AccessPolicy:
|
|
||||||
Properties:
|
|
||||||
AllowedResources:
|
|
||||||
- controller0
|
|
||||||
- controller0Config
|
|
||||||
Type: OS::Heat::AccessPolicy
|
|
||||||
ComputeAccessPolicy:
|
|
||||||
Properties:
|
|
||||||
AllowedResources:
|
|
||||||
- NovaCompute0
|
|
||||||
- NovaCompute0Config
|
|
||||||
Type: OS::Heat::AccessPolicy
|
|
||||||
controller0Key:
|
|
||||||
Properties:
|
|
||||||
UserName:
|
|
||||||
Ref: User
|
|
||||||
Type: AWS::IAM::AccessKey
|
|
||||||
controller0CompletionCondition:
|
|
||||||
Type: AWS::CloudFormation::WaitCondition
|
|
||||||
DependsOn: controller0Config
|
|
||||||
Properties:
|
|
||||||
Handle: {Ref: controller0CompletionHandle}
|
|
||||||
Count: '1'
|
|
||||||
Timeout: '1800'
|
|
||||||
controller0CompletionHandle:
|
|
||||||
Type: OS::Heat::UpdateWaitConditionHandle
|
|
||||||
NovaCompute0Key:
|
|
||||||
Type: FileInclude
|
|
||||||
Path: nova-compute-instance.yaml
|
|
||||||
SubKey: Resources.NovaCompute0Key
|
|
||||||
NovaCompute0CompletionCondition:
|
|
||||||
Type: FileInclude
|
|
||||||
Path: nova-compute-instance.yaml
|
|
||||||
SubKey: Resources.NovaCompute0CompletionCondition
|
|
||||||
NovaCompute0CompletionHandle:
|
|
||||||
Type: FileInclude
|
|
||||||
Path: nova-compute-instance.yaml
|
|
||||||
SubKey: Resources.NovaCompute0CompletionHandle
|
|
||||||
ComputeUser:
|
|
||||||
Properties:
|
|
||||||
Policies:
|
|
||||||
- Ref: ComputeAccessPolicy
|
|
||||||
Type: AWS::IAM::User
|
|
||||||
NovaCompute0Config:
|
NovaCompute0Config:
|
||||||
Type: FileInclude
|
Type: FileInclude
|
||||||
Path: nova-compute-instance.yaml
|
Path: nova-compute-instance.yaml
|
||||||
SubKey: Resources.NovaCompute0Config
|
SubKey: Resources.NovaCompute0Deploy
|
||||||
Parameters:
|
Parameters:
|
||||||
NovaApiHost: {"Fn::Select": [ 0, {"Fn::Select": [ "ctlplane", {"Fn::GetAtt": [controller0, networks]} ]} ] }
|
NovaApiHost: {"Fn::Select": [ 0, {"Fn::Select": [ "ctlplane", {"Fn::GetAtt": [controller0, networks]} ]} ] }
|
||||||
KeystoneHost: {"Fn::Select": [ 0, {"Fn::Select": [ "ctlplane", {"Fn::GetAtt": [controller0, networks]} ]} ] }
|
KeystoneHost: {"Fn::Select": [ 0, {"Fn::Select": [ "ctlplane", {"Fn::GetAtt": [controller0, networks]} ]} ] }
|
||||||
|
@ -293,23 +250,11 @@ Resources:
|
||||||
Type: FileInclude
|
Type: FileInclude
|
||||||
Path: nova-compute-instance.yaml
|
Path: nova-compute-instance.yaml
|
||||||
SubKey: Resources.NovaCompute0
|
SubKey: Resources.NovaCompute0
|
||||||
User:
|
controllerConfig:
|
||||||
|
Type: OS::Heat::StructuredConfig
|
||||||
Properties:
|
Properties:
|
||||||
Policies:
|
config:
|
||||||
- Ref: AccessPolicy
|
completion-signal: {get_input: deploy_signal_id}
|
||||||
Type: AWS::IAM::User
|
|
||||||
controller0Config:
|
|
||||||
Type: AWS::AutoScaling::LaunchConfiguration
|
|
||||||
Properties:
|
|
||||||
ImageId: '0'
|
|
||||||
InstanceType: '0'
|
|
||||||
Metadata:
|
|
||||||
OpenStack::Heat::Stack: {}
|
|
||||||
OpenStack::ImageBuilder::Elements:
|
|
||||||
- boot-stack
|
|
||||||
- heat-cfntools
|
|
||||||
- heat-localip
|
|
||||||
- neutron-network-node
|
|
||||||
admin-password:
|
admin-password:
|
||||||
Ref: AdminPassword
|
Ref: AdminPassword
|
||||||
admin-token:
|
admin-token:
|
||||||
|
@ -324,28 +269,14 @@ Resources:
|
||||||
Ref: CinderPassword
|
Ref: CinderPassword
|
||||||
iscsi-helper:
|
iscsi-helper:
|
||||||
Ref: CinderISCSIHelper
|
Ref: CinderISCSIHelper
|
||||||
completion-handle:
|
|
||||||
Ref: controller0CompletionHandle
|
|
||||||
controller-address:
|
controller-address:
|
||||||
Fn::Select:
|
get_input: controller_host
|
||||||
- 0
|
|
||||||
- Fn::Select:
|
|
||||||
- 'ctlplane'
|
|
||||||
- Fn::GetAtt:
|
|
||||||
- controller0
|
|
||||||
- networks
|
|
||||||
db-password: unset
|
db-password: unset
|
||||||
glance:
|
glance:
|
||||||
backend: swift
|
backend: swift
|
||||||
db: mysql://glance:unset@localhost/glance
|
db: mysql://glance:unset@localhost/glance
|
||||||
host:
|
host:
|
||||||
Fn::Select:
|
get_input: controller_host
|
||||||
- 0
|
|
||||||
- Fn::Select:
|
|
||||||
- 'ctlplane'
|
|
||||||
- Fn::GetAtt:
|
|
||||||
- controller0
|
|
||||||
- networks
|
|
||||||
service-password:
|
service-password:
|
||||||
Ref: GlancePassword
|
Ref: GlancePassword
|
||||||
swift-store-user: service:glance
|
swift-store-user: service:glance
|
||||||
|
@ -363,86 +294,25 @@ Resources:
|
||||||
auth_encryption_key: unset___________
|
auth_encryption_key: unset___________
|
||||||
db: mysql://heat:unset@localhost/heat
|
db: mysql://heat:unset@localhost/heat
|
||||||
stack_domain_admin_password: {Ref: HeatStackDomainAdminPassword}
|
stack_domain_admin_password: {Ref: HeatStackDomainAdminPassword}
|
||||||
watch_server_url:
|
watch_server_url: {get_input: heat.watch_server_url}
|
||||||
Fn::Join:
|
metadata_server_url: {get_input: heat.metadata_server_url}
|
||||||
- ''
|
waitcondition_server_url: {get_input: heat.waitcondition_server_url}
|
||||||
- - 'http://'
|
hosts: {get_input: hosts}
|
||||||
- Fn::Select:
|
|
||||||
- 0
|
|
||||||
- Fn::Select:
|
|
||||||
- 'ctlplane'
|
|
||||||
- Fn::GetAtt:
|
|
||||||
- controller0
|
|
||||||
- networks
|
|
||||||
- ':8003'
|
|
||||||
metadata_server_url:
|
|
||||||
Fn::Join:
|
|
||||||
- ''
|
|
||||||
- - 'http://'
|
|
||||||
- Fn::Select:
|
|
||||||
- 0
|
|
||||||
- Fn::Select:
|
|
||||||
- 'ctlplane'
|
|
||||||
- Fn::GetAtt:
|
|
||||||
- controller0
|
|
||||||
- networks
|
|
||||||
- ':8000'
|
|
||||||
waitcondition_server_url:
|
|
||||||
Fn::Join:
|
|
||||||
- ''
|
|
||||||
- - 'http://'
|
|
||||||
- Fn::Select:
|
|
||||||
- 0
|
|
||||||
- Fn::Select:
|
|
||||||
- 'ctlplane'
|
|
||||||
- Fn::GetAtt:
|
|
||||||
- controller0
|
|
||||||
- networks
|
|
||||||
- ':8000/v1/waitcondition'
|
|
||||||
hosts:
|
|
||||||
Fn::Join:
|
|
||||||
- ' '
|
|
||||||
- - Fn::Select:
|
|
||||||
- 0
|
|
||||||
- Fn::Select:
|
|
||||||
- ctlplane
|
|
||||||
- Fn::GetAtt:
|
|
||||||
- controller0
|
|
||||||
- networks
|
|
||||||
- {Ref: CloudName}
|
|
||||||
keystone:
|
keystone:
|
||||||
db: mysql://keystone:unset@localhost/keystone
|
db: mysql://keystone:unset@localhost/keystone
|
||||||
host:
|
host:
|
||||||
Fn::Select:
|
get_input: controller_host
|
||||||
- 0
|
|
||||||
- Fn::Select:
|
|
||||||
- 'ctlplane'
|
|
||||||
- Fn::GetAtt:
|
|
||||||
- controller0
|
|
||||||
- networks
|
|
||||||
mysql:
|
mysql:
|
||||||
innodb_buffer_pool_size: {Ref: MysqlInnodbBufferPoolSize}
|
innodb_buffer_pool_size: {Ref: MysqlInnodbBufferPoolSize}
|
||||||
neutron:
|
neutron:
|
||||||
flat-networks: {Ref: NeutronFlatNetworks}
|
flat-networks: {Ref: NeutronFlatNetworks}
|
||||||
host:
|
host:
|
||||||
Fn::Select:
|
get_input: controller_host
|
||||||
- 0
|
|
||||||
- Fn::Select:
|
|
||||||
- ctlplane
|
|
||||||
- Fn::GetAtt:
|
|
||||||
- controller0
|
|
||||||
- networks
|
|
||||||
metadata_proxy_shared_secret: unset
|
metadata_proxy_shared_secret: unset
|
||||||
ovs:
|
ovs:
|
||||||
enable_tunneling: 'True'
|
enable_tunneling: 'True'
|
||||||
local_ip:
|
local_ip:
|
||||||
Fn::Select:
|
get_input: controller_host
|
||||||
- 0
|
|
||||||
- Fn::Select:
|
|
||||||
- ctlplane
|
|
||||||
- Fn::GetAtt:
|
|
||||||
- controller0
|
|
||||||
- networks
|
|
||||||
bridge_mappings: {Ref: NeutronBridgeMappings}
|
bridge_mappings: {Ref: NeutronBridgeMappings}
|
||||||
public_interface:
|
public_interface:
|
||||||
Ref: NeutronPublicInterface
|
Ref: NeutronPublicInterface
|
||||||
|
@ -466,36 +336,13 @@ Resources:
|
||||||
default_floating_pool:
|
default_floating_pool:
|
||||||
ext-net
|
ext-net
|
||||||
host:
|
host:
|
||||||
Fn::Select:
|
get_input: controller_host
|
||||||
- 0
|
|
||||||
- Fn::Select:
|
|
||||||
- 'ctlplane'
|
|
||||||
- Fn::GetAtt:
|
|
||||||
- controller0
|
|
||||||
- networks
|
|
||||||
metadata-proxy: true
|
metadata-proxy: true
|
||||||
service-password:
|
service-password:
|
||||||
Ref: NovaPassword
|
Ref: NovaPassword
|
||||||
os-collect-config:
|
|
||||||
cfn:
|
|
||||||
access_key_id:
|
|
||||||
Ref: controller0Key
|
|
||||||
path: controller0Config.Metadata
|
|
||||||
secret_access_key:
|
|
||||||
Fn::GetAtt:
|
|
||||||
- controller0Key
|
|
||||||
- SecretAccessKey
|
|
||||||
stack_name:
|
|
||||||
Ref: AWS::StackName
|
|
||||||
rabbit:
|
rabbit:
|
||||||
host:
|
host:
|
||||||
Fn::Select:
|
get_input: controller_host
|
||||||
- 0
|
|
||||||
- Fn::Select:
|
|
||||||
- ctlplane
|
|
||||||
- Fn::GetAtt:
|
|
||||||
- controller0
|
|
||||||
- networks
|
|
||||||
username:
|
username:
|
||||||
Ref: RabbitUserName
|
Ref: RabbitUserName
|
||||||
password:
|
password:
|
||||||
|
@ -518,18 +365,53 @@ Resources:
|
||||||
Ref: OvercloudControlFlavor
|
Ref: OvercloudControlFlavor
|
||||||
key_name:
|
key_name:
|
||||||
Ref: KeyName
|
Ref: KeyName
|
||||||
Metadata:
|
user_data_format: SOFTWARE_CONFIG
|
||||||
os-collect-config:
|
controller0Deployment:
|
||||||
cfn:
|
Type: OS::Heat::StructuredDeployment
|
||||||
access_key_id:
|
Properties:
|
||||||
Ref: controller0Key
|
config: {Ref: controllerConfig}
|
||||||
path: controller0Config.Metadata
|
server: {Ref: controller0}
|
||||||
secret_access_key:
|
input_values:
|
||||||
Fn::GetAtt:
|
controller_host:
|
||||||
- controller0Key
|
Fn::Select:
|
||||||
- SecretAccessKey
|
- 0
|
||||||
stack_name:
|
- Fn::Select:
|
||||||
Ref: AWS::StackName
|
- ctlplane
|
||||||
|
- Fn::GetAtt:
|
||||||
|
- controller0
|
||||||
|
- networks
|
||||||
|
heat.watch_server_url:
|
||||||
|
Fn::Join:
|
||||||
|
- ''
|
||||||
|
- - 'http://'
|
||||||
|
- {"Fn::Select": [ 0, "Fn::Select": [ ctlplane, { "Fn::GetAtt": [ controller0, networks ]}]]}
|
||||||
|
- ':8003'
|
||||||
|
heat.metadata_server_url:
|
||||||
|
Fn::Join:
|
||||||
|
- ''
|
||||||
|
- - 'http://'
|
||||||
|
- {"Fn::Select": [ 0, "Fn::Select": [ ctlplane, { "Fn::GetAtt": [ controller0, networks ]}]]}
|
||||||
|
- ':8000'
|
||||||
|
heat.waitcondition_server_url:
|
||||||
|
Fn::Join:
|
||||||
|
- ''
|
||||||
|
- - 'http://'
|
||||||
|
- {"Fn::Select": [ 0, "Fn::Select": [ ctlplane, { "Fn::GetAtt": [ controller0, networks ]}]]}
|
||||||
|
- ':8000/v1/waitcondition'
|
||||||
|
hosts:
|
||||||
|
Fn::Join:
|
||||||
|
- ' '
|
||||||
|
- - {"Fn::Select": [ 0, "Fn::Select": [ ctlplane, { "Fn::GetAtt": [ controller0, networks ]}]]}
|
||||||
|
- {Ref: CloudName}
|
||||||
|
controller0SSLDeployment:
|
||||||
|
Type: OS::Heat::StructuredDeployment
|
||||||
|
Properties:
|
||||||
|
config: {Ref: SSLConfig}
|
||||||
|
server: {Ref: controller0}
|
||||||
|
signal_transport: NO_SIGNAL
|
||||||
|
input_values:
|
||||||
|
ssl_certificate: {Ref: SSLCertificate}
|
||||||
|
ssl_key: {Ref: SSLKey}
|
||||||
Outputs:
|
Outputs:
|
||||||
KeystoneURL:
|
KeystoneURL:
|
||||||
Description: URL for the Overcloud Keystone service
|
Description: URL for the Overcloud Keystone service
|
||||||
|
|
|
@ -11,14 +11,15 @@ Parameters:
|
||||||
Type: String
|
Type: String
|
||||||
NoEcho: true
|
NoEcho: true
|
||||||
Resources:
|
Resources:
|
||||||
controller0Config:
|
SSLConfig:
|
||||||
Type: AWS::AutoScaling::LaunchConfiguration
|
Type: OS::Heat::StructuredConfig
|
||||||
Metadata:
|
Properties:
|
||||||
|
config:
|
||||||
stunnel:
|
stunnel:
|
||||||
cert:
|
cert:
|
||||||
Ref: SSLCertificate
|
get_input: ssl_certificate
|
||||||
key:
|
key:
|
||||||
Ref: SSLKey
|
get_input: ssl_key
|
||||||
ports:
|
ports:
|
||||||
- name: 'ec2'
|
- name: 'ec2'
|
||||||
accept: 13773
|
accept: 13773
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
Description: 'Swift-proxy: OpenStack object storage proxy'
|
||||||
|
Parameters:
|
||||||
|
SwiftHashSuffix:
|
||||||
|
Default: unset
|
||||||
|
Description: A random string to be used as a salt when hashing to determine mappings in the ring.
|
||||||
|
Type: String
|
||||||
|
NoEcho: true
|
||||||
|
SwiftPassword:
|
||||||
|
Default: unset
|
||||||
|
Description: The password for the swift service account, used by the swift proxy services.
|
||||||
|
Type: String
|
||||||
|
NoEcho: true
|
||||||
|
Resources:
|
||||||
|
controller0Swift:
|
||||||
|
Type: OS::Heat::StructuredDeployment
|
||||||
|
Properties:
|
||||||
|
config: {Ref: SwiftConfig}
|
||||||
|
server: {Ref: controller0}
|
||||||
|
signal_transport: NO_SIGNAL
|
||||||
|
input_values:
|
||||||
|
swift_hash_suffix: {Ref: SwiftHashSuffix}
|
||||||
|
swift_password: {Ref: SwiftPassword}
|
||||||
|
swift_devices:
|
||||||
|
Fn::Join:
|
||||||
|
- ', '
|
||||||
|
- - Fn::Join:
|
||||||
|
- ''
|
||||||
|
- - 'r1z1-'
|
||||||
|
- {"Fn::Select": [ 0, {"Fn::Select": [ "ctlplane", {"Fn::GetAtt": [controller0, networks]} ]} ] }
|
||||||
|
- ':%PORT%/d1'
|
||||||
|
- Fn::Join:
|
||||||
|
- ', '
|
||||||
|
- Merge::Map:
|
||||||
|
SwiftStorage0:
|
||||||
|
Fn::Join:
|
||||||
|
- ''
|
||||||
|
- - 'r1z1-'
|
||||||
|
- Fn::Select:
|
||||||
|
- 0
|
||||||
|
- Fn::Select:
|
||||||
|
- 'ctlplane'
|
||||||
|
- Fn::GetAtt:
|
||||||
|
- SwiftStorage0
|
||||||
|
- networks
|
||||||
|
- ':%PORT%/d1'
|
|
@ -1,52 +1,16 @@
|
||||||
Description: 'Swift-common: OpenStack object storage common configurations'
|
|
||||||
Parameters:
|
|
||||||
SwiftHashSuffix:
|
|
||||||
Default: unset
|
|
||||||
Description: A random string to be used as a salt when hashing to determine mappings in the ring.
|
|
||||||
Type: String
|
|
||||||
NoEcho: true
|
|
||||||
SwiftPassword:
|
|
||||||
Default: unset
|
|
||||||
Description: The password for the swift service account, used by the swift proxy services.
|
|
||||||
Type: String
|
|
||||||
NoEcho: true
|
|
||||||
Resources:
|
Resources:
|
||||||
controller0Config:
|
SwiftConfig:
|
||||||
Type: AWS::AutoScaling::LaunchConfiguration
|
Type: OS::Heat::StructuredConfig
|
||||||
Metadata:
|
Properties:
|
||||||
|
config:
|
||||||
swift:
|
swift:
|
||||||
devices:
|
devices: { get_input: swift_devices }
|
||||||
Fn::Join:
|
hash: { get_input: swift_hash_suffix }
|
||||||
- ', '
|
|
||||||
- - Fn::Join:
|
|
||||||
- ''
|
|
||||||
- - 'r1z1-'
|
|
||||||
- Fn::Select:
|
|
||||||
- 0
|
|
||||||
- Fn::Select:
|
|
||||||
- 'ctlplane'
|
|
||||||
- Fn::GetAtt:
|
|
||||||
- controller0
|
|
||||||
- networks
|
|
||||||
- ':%PORT%/d1'
|
|
||||||
- Fn::Join:
|
|
||||||
- ', '
|
|
||||||
- Merge::Map:
|
|
||||||
SwiftStorage0:
|
|
||||||
Fn::Join:
|
|
||||||
- ''
|
|
||||||
- - 'r1z1-'
|
|
||||||
- Fn::Select:
|
|
||||||
- 0
|
|
||||||
- Fn::Select:
|
|
||||||
- 'ctlplane'
|
|
||||||
- Fn::GetAtt:
|
|
||||||
- SwiftStorage0
|
|
||||||
- networks
|
|
||||||
- ':%PORT%/d1'
|
|
||||||
hash:
|
|
||||||
Ref: SwiftHashSuffix
|
|
||||||
part-power: 10
|
part-power: 10
|
||||||
replicas: 1
|
replicas: 1
|
||||||
service-password:
|
service-password: { get_input: swift_password }
|
||||||
Ref: SwiftPassword
|
neutron:
|
||||||
|
enable_tunnelling: {Ref: NeutronEnableTunnelling}
|
||||||
|
tenant_network_type: {Ref: NeutronNetworkType}
|
||||||
|
ovs:
|
||||||
|
local_ip: { get_input: neutron_local_ip }
|
||||||
|
|
|
@ -15,30 +15,6 @@ Parameters:
|
||||||
Type: String
|
Type: String
|
||||||
Default: True
|
Default: True
|
||||||
Resources:
|
Resources:
|
||||||
SwiftStorageAccessPolicy:
|
|
||||||
Type: OS::Heat::AccessPolicy
|
|
||||||
Properties:
|
|
||||||
AllowedResources:
|
|
||||||
- SwiftStorage0
|
|
||||||
- SwiftStorage0Config
|
|
||||||
SwiftStorageUser:
|
|
||||||
Type: AWS::IAM::User
|
|
||||||
Properties:
|
|
||||||
Policies: [ { Ref: SwiftStorageAccessPolicy } ]
|
|
||||||
SwiftStorage0Key:
|
|
||||||
Type: AWS::IAM::AccessKey
|
|
||||||
Properties:
|
|
||||||
UserName:
|
|
||||||
Ref: SwiftStorageUser
|
|
||||||
SwiftStorage0CompletionCondition:
|
|
||||||
Type: AWS::CloudFormation::WaitCondition
|
|
||||||
DependsOn: controller0Config
|
|
||||||
Properties:
|
|
||||||
Handle: {Ref: SwiftStorage0CompletionHandle}
|
|
||||||
Count: '1'
|
|
||||||
Timeout: '1800'
|
|
||||||
SwiftStorage0CompletionHandle:
|
|
||||||
Type: AWS::CloudFormation::WaitConditionHandle
|
|
||||||
SwiftStorage0:
|
SwiftStorage0:
|
||||||
Type: OS::Nova::Server
|
Type: OS::Nova::Server
|
||||||
Properties:
|
Properties:
|
||||||
|
@ -46,65 +22,24 @@ Resources:
|
||||||
{Ref: SwiftStorageImage}
|
{Ref: SwiftStorageImage}
|
||||||
flavor: {Ref: OvercloudSwiftStorageFlavor}
|
flavor: {Ref: OvercloudSwiftStorageFlavor}
|
||||||
key_name: {Ref: KeyName}
|
key_name: {Ref: KeyName}
|
||||||
Metadata:
|
SwiftStorage0Deploy:
|
||||||
os-collect-config:
|
Type: OS::Heat::StructuredDeployment
|
||||||
cfn:
|
|
||||||
access_key_id:
|
|
||||||
Ref: SwiftStorage0Key
|
|
||||||
secret_access_key:
|
|
||||||
Fn::GetAtt: [ SwiftStorage0Key, SecretAccessKey ]
|
|
||||||
stack_name: {Ref: 'AWS::StackName'}
|
|
||||||
path: SwiftStorage0Config.Metadata
|
|
||||||
OpenStack::ImageBuilder::Elements: [ swift ]
|
|
||||||
SwiftStorage0Config:
|
|
||||||
Type: AWS::AutoScaling::LaunchConfiguration
|
|
||||||
Properties:
|
Properties:
|
||||||
InstanceType: '0'
|
server: {Ref: SwiftStorage0}
|
||||||
ImageId: '0'
|
config: {Ref: SwiftConfig}
|
||||||
Metadata:
|
input_values:
|
||||||
completion-handle:
|
neutron_local_ip: {"Fn::Select": [ 0, {"Fn::Select": [ "ctlplane", {"Fn::GetAtt": [SwiftStorage0, networks]} ]} ] }
|
||||||
Ref: SwiftStorage0CompletionHandle
|
swift_devices:
|
||||||
os-collect-config:
|
|
||||||
cfn:
|
|
||||||
access_key_id:
|
|
||||||
Ref: SwiftStorage0Key
|
|
||||||
secret_access_key:
|
|
||||||
Fn::GetAtt: [ SwiftStorage0Key, SecretAccessKey ]
|
|
||||||
stack_name: {Ref: 'AWS::StackName'}
|
|
||||||
path: SwiftStorage0Config.Metadata
|
|
||||||
admin-password: {Ref: AdminPassword}
|
|
||||||
neutron:
|
|
||||||
ovs:
|
|
||||||
local_ip:
|
|
||||||
Fn::Select:
|
|
||||||
- 0
|
|
||||||
- Fn::Select:
|
|
||||||
- ctlplane
|
|
||||||
- Fn::GetAtt:
|
|
||||||
- SwiftStorage0
|
|
||||||
- networks
|
|
||||||
tenant_network_type: {Ref: NeutronNetworkType}
|
|
||||||
enable_tunneling: {Ref: NeutronEnableTunnelling}
|
|
||||||
service-password:
|
|
||||||
Ref: NeutronPassword
|
|
||||||
swift:
|
|
||||||
devices:
|
|
||||||
Fn::Join:
|
Fn::Join:
|
||||||
- ', '
|
- ', '
|
||||||
- - Fn::Join:
|
- - Fn::Join:
|
||||||
- ''
|
- ''
|
||||||
- - 'r1z1-'
|
- - 'r1z1-'
|
||||||
- Fn::Select:
|
- {"Fn::Select": [ 0, {"Fn::Select": [ "ctlplane", {"Fn::GetAtt": [controller0, networks]} ]} ] }
|
||||||
- 0
|
|
||||||
- Fn::Select:
|
|
||||||
- 'ctlplane'
|
|
||||||
- Fn::GetAtt:
|
|
||||||
- controller0
|
|
||||||
- networks
|
|
||||||
- ':%PORT%/d1'
|
- ':%PORT%/d1'
|
||||||
- Fn::Join:
|
- Fn::Join:
|
||||||
- ', '
|
- ', '
|
||||||
- Merge::Map:
|
Merge::Map:
|
||||||
SwiftStorage0:
|
SwiftStorage0:
|
||||||
Fn::Join:
|
Fn::Join:
|
||||||
- ''
|
- ''
|
||||||
|
@ -117,9 +52,3 @@ Resources:
|
||||||
- SwiftStorage0
|
- SwiftStorage0
|
||||||
- networks
|
- networks
|
||||||
- ':%PORT%/d1'
|
- ':%PORT%/d1'
|
||||||
hash:
|
|
||||||
Ref: SwiftHashSuffix
|
|
||||||
part-power: 10
|
|
||||||
replicas: 1
|
|
||||||
service-password:
|
|
||||||
Ref: SwiftPassword
|
|
||||||
|
|
|
@ -292,6 +292,10 @@ def merge(templates, master_role=None, slave_roles=None,
|
||||||
errors.append('Role %s metadata key %s conflicts.' %
|
errors.append('Role %s metadata key %s conflicts.' %
|
||||||
(role, m))
|
(role, m))
|
||||||
continue
|
continue
|
||||||
|
role_res = end_template['Resources'][role]
|
||||||
|
if role_res['Type'] == 'OS::Heat::StructuredConfig':
|
||||||
|
end_template['Resources'][role]['Properties']['config'][m] = mbody
|
||||||
|
else:
|
||||||
end_template['Resources'][role]['Metadata'][m] = mbody
|
end_template['Resources'][role]['Metadata'][m] = mbody
|
||||||
continue
|
continue
|
||||||
if 'Resources' not in end_template:
|
if 'Resources' not in end_template:
|
||||||
|
@ -315,6 +319,8 @@ def merge(templates, master_role=None, slave_roles=None,
|
||||||
include_content = resolve_params(include_content,
|
include_content = resolve_params(include_content,
|
||||||
replace_param,
|
replace_param,
|
||||||
replace_value)
|
replace_value)
|
||||||
|
if 'Resources' not in end_template:
|
||||||
|
end_template['Resources'] = {}
|
||||||
end_template['Resources'][r] = include_content
|
end_template['Resources'][r] = include_content
|
||||||
else:
|
else:
|
||||||
if r in end_template.get('Resources', {}):
|
if r in end_template.get('Resources', {}):
|
||||||
|
|
Loading…
Reference in New Issue