我正在寻找通过多个单独步骤创建堆栈的最佳方法。
我想在第一个模板中,仅启动计算节点和网络配置。
在第二个模板中,我想创建存储节点并将它们附加到现有的计算节点。
您认为最好的方法是什么?
以下是一种可能的方法。
1) 为您的计算节点和网络配置定义第一个模板。但在第一个模板中定义输出以公开您的计算节点 ID。例如,如果您创建名为 mynode1 的 OS::Nova::Server,则可以将其 ID 公开为该模板的输出,如下所示:
outputs:
mynode1_id:
description: ID of mynode1
value: {getattr: [mynode1, id]}
使用第一个模板实例化热堆栈(例如 mystack1)后,您可以按如下方式访问 mynode1 的 ID:
heat output-show mystack1 mynode1_id
2) 使用步骤 1 中的计算节点 ID 作为输入参数,创建第二个存储模板。例如:
parameters:
mynode1_id:
type: string
description: ID for mynode1
然后您可以在“资源:”部分中使用它,如下所示:
resources:
...
...
my_volume_attach:
type: OS::Cinder::VolumeAttachment
properties:
instance_uuid: {get_param: mynode1_id}
...
3) 按如下方式调用第二个热堆栈创建:
heat stack-create -f second-template.yaml -P mynode1_id=`heat output-show mystack1 mynode1_id` mystack2
您可能还想使用 depends_on 属性定义资源之间的依赖关系。 从您的描述来看,使用多个模板似乎不是正确的解决方案。
例如 - 如果您希望在对象 1,2 之后创建对象 3,4,您可以按如下方式定义模板:
heat_template_version: '2015-10-15'
parameters:
param1:
type: string
description: just an example of parameter
resources:
object1:
type: OS::Neutron::XXX
properties:
property: XXX
description: object1
object2:
type: OS::Neutron::XXX
properties:
property: XXX
description: object2
object3:
type: OS::Nova::XXX
properties:
property: XXX
description: object3
depends_on: object1
object4:
type: OS::Nova::XXX
properties:
property: XXX
description: object4
depends_on: object1
我尝试使用这样的资源组功能;但它会抛出这个错误: 错误:服务器无法满足请求,因为请求格式错误或不正确。
heat_template_version: 2021-04-16
description: >
HOT template to create 3 servers (ranger, deputy, handler) with customizable parameters.
parameters:
key_name:
type: string
description: Name of keypair to assign to servers.
default: darwin
stack_name:
type: string
description: Name of the stack to be appended as a suffix.
default: OCR_services
private_cidr:
type: string
description: Private CIDR block for subnet.
default: 172.168.100.0/27
image_id:
type: string
description: ID of the image to use for the servers.
default: db1bc18e-81e3-477e-9067-eecaa459ec33 # ubuntu22.04
flavor_name:
type: string
description: Name of the flavor to use for the servers.
default: gx1.2c4r
external_network:
type: string
description: External network for floating IPs.
default: ntnu-internal
security_group_rules:
type: json
description: Security group rules for the servers.
default:
- protocol: icmp
port_range_min: null
port_range_max: null
remote_ip_prefix: 0.0.0.0/0
- protocol: tcp
port_range_min: 22
port_range_max: 22
remote_ip_prefix: 0.0.0.0/0
- protocol: tcp
port_range_min: 80
port_range_max: 80
remote_ip_prefix: 0.0.0.0/0
- protocol: tcp
port_range_min: 443
port_range_max: 443
remote_ip_prefix: 0.0.0.0/0
server_names:
type: comma_delimited_list
description: Names of the servers to be created.
default: ranger,deputy,handler
resources:
private_net:
type: OS::Neutron::Net
private_subnet:
type: OS::Neutron::Subnet
properties:
network_id: { get_resource: private_net }
cidr: { get_param: private_cidr }
router:
type: OS::Neutron::Router
properties:
external_gateway_info:
network: { get_param: external_network }
router_interface:
type: OS::Neutron::RouterInterface
properties:
router_id: { get_resource: router }
subnet_id: { get_resource: private_subnet }
server_security_group:
type: OS::Neutron::SecurityGroup
properties:
description: Security group rules for server.
rules: { get_param: security_group_rules }
servers:
type: OS::Heat::ResourceGroup
properties:
count: { get_param: server_names }
resource_def:
type: OS::Nova::Server
properties:
name:
list_join: ['', ['stack', {get_param: 'stack_name'}, '_', {get_param: 'server_names'}]]
image: { get_param: image_id }
flavor: { get_param: flavor_name }
key_name: { get_param: key_name }
networks:
- port: { get_resource: server_port }
# security_groups:
# - { get_resource: server_security_group }