实例

管理实例

创建实例

使用 OS::Nova::Server 资源创建计算实例。 flavor 属性是唯一强制的属性,但您需要使用 imageblock_device_mapping 属性之一定义启动源。

如果您租户中可用多个网络,您还需要定义 networks 属性,以指示您的实例必须连接到哪些网络。

以下示例创建一个简单的实例,从镜像启动,并连接到 private 网络

resources:
  instance:
    type: OS::Nova::Server
    properties:
      flavor: m1.small
      image: ubuntu-trusty-x86_64
      networks:
        - network: private

将实例连接到网络

使用 OS::Nova::Server 资源的 networks 属性定义实例应连接到哪些网络。将每个网络定义为 YAML 映射,其中包含以下键之一

port

现有网络端口的 ID。通常,您会在相同的模板中使用 OS::Neutron::Port 资源创建此端口。您将能够将浮动 IP 关联到此端口,并将端口关联到您的计算实例。

network

现有网络的名称或 ID。如果您使用此属性,则无需创建 OS::Neutron::Port 资源。但是,由于没有为服务器指定端口,因此您将无法为此实例使用 neutron 浮动 IP 关联。

以下示例演示了 portnetwork 属性的使用

resources:
  instance_port:
    type: OS::Neutron::Port
    properties:
      network: private
      fixed_ips:
        - subnet_id: "private-subnet"

  instance1:
    type: OS::Nova::Server
    properties:
      flavor: m1.small
      image: ubuntu-trusty-x86_64
      networks:
        - port: { get_resource: instance_port }

  instance2:
    type: OS::Nova::Server
    properties:
      flavor: m1.small
      image: ubuntu-trusty-x86_64
      networks:
        - network: private

创建并关联安全组到实例

使用 OS::Neutron::SecurityGroup 资源创建安全组。

定义 OS::Neutron::Port 资源的 security_groups 属性,以将安全组关联到端口,然后将端口关联到实例。

以下示例创建一个允许在 80 和 443 端口上进行入站连接(Web 服务器)的安全组,并将此安全组关联到实例端口

resources:
  web_secgroup:
    type: OS::Neutron::SecurityGroup
    properties:
      rules:
        - protocol: tcp
          remote_ip_prefix: 0.0.0.0/0
          port_range_min: 80
          port_range_max: 80
        - protocol: tcp
          remote_ip_prefix: 0.0.0.0/0
          port_range_min: 443
          port_range_max: 443

  instance_port:
    type: OS::Neutron::Port
    properties:
      network: private
      security_groups:
        - default
        - { get_resource: web_secgroup }
      fixed_ips:
        - subnet_id: private-subnet

  instance:
    type: OS::Nova::Server
    properties:
      flavor: m1.small
      image: ubuntu-trusty-x86_64
      networks:
        - port: { get_resource: instance_port }

创建并关联浮动 IP 到实例

使用 OS::Neutron::FloatingIP 资源创建浮动 IP,并使用 OS::Neutron::FloatingIPAssociation 资源将浮动 IP 关联到端口

parameters:
  net:
    description: name of network used to launch instance.
    type: string
    default: private

resources:
  inst1:
    type: OS::Nova::Server
    properties:
      flavor: m1.small
      image: ubuntu-trusty-x86_64
      networks:
        - network: {get_param: net}

  floating_ip:
    type: OS::Neutron::FloatingIP
    properties:
      floating_network: public

  association:
    type: OS::Neutron::FloatingIPAssociation
    properties:
      floatingip_id: { get_resource: floating_ip }
      port_id: {get_attr: [inst1, addresses, {get_param: net}, 0, port]}

您还可以创建一个 OS::Neutron::Port 并将其与服务器和浮动 IP 关联。但是,上述方法在堆栈更新时效果更好。

resources:
  instance_port:
    type: OS::Neutron::Port
    properties:
      network: private
      fixed_ips:
        - subnet_id: "private-subnet"

  floating_ip:
    type: OS::Neutron::FloatingIP
    properties:
      floating_network: public

  association:
    type: OS::Neutron::FloatingIPAssociation
    properties:
      floatingip_id: { get_resource: floating_ip }
      port_id: { get_resource: instance_port }

启用对实例的远程访问

OS::Nova::Server 资源的 key_name 属性定义用于启用 SSH 远程访问的密钥对

resources:
  my_instance:
    type: OS::Nova::Server
    properties:
      flavor: m1.small
      image: ubuntu-trusty-x86_64
      key_name: my_key

注意

有关密钥对的更多信息,请参阅 配置实例的访问和安全性

创建密钥对

您可以使用 OS::Nova::KeyPair 资源创建新的密钥对。密钥对可以在堆栈创建期间导入或创建。

如果未指定 public_key 属性,则 Orchestration 模块会创建一个新的密钥对。如果将 save_private_key 属性设置为 true,则资源的 private_key 属性包含私钥。

以下示例创建一个新的密钥对,并将其用作实例的身份验证密钥

resources:
  my_key:
    type: OS::Nova::KeyPair
    properties:
      save_private_key: true
      name: my_key

  my_instance:
    type: OS::Nova::Server
    properties:
      flavor: m1.small
      image: ubuntu-trusty-x86_64
      key_name: { get_resource: my_key }

outputs:
  private_key:
    description: Private key
    value: { get_attr: [ my_key, private_key ] }

管理网络

创建网络和子网

注意

您的 OpenStack 部署必须启用 Networking 服务 (neutron) 才能创建和管理网络和子网。如果您的部署使用传统网络 (nova-network),则无法创建网络和子网。

使用 OS::Neutron::Net 资源创建网络,并使用 OS::Neutron::Subnet 资源为该网络提供子网

resources:
  new_net:
    type: OS::Neutron::Net

  new_subnet:
    type: OS::Neutron::Subnet
    properties:
      network_id: { get_resource: new_net }
      cidr: "10.8.1.0/24"
      dns_nameservers: [ "8.8.8.8", "8.8.4.4" ]
      ip_version: 4

创建和管理路由器

使用 OS::Neutron::Router 资源创建路由器。您可以使用 external_gateway_info 属性定义其网关

resources:
  router1:
    type: OS::Neutron::Router
    properties:
      external_gateway_info: { network: public }

您可以使用 OS::Neutron::RouterInterface 资源将子网连接到路由器

resources:
  subnet1_interface:
    type: OS::Neutron::RouterInterface
    properties:
      router_id: { get_resource: router1 }
      subnet: private-subnet

完整的网络示例

以下示例创建一个网络堆栈

  • 一个网络和一个关联的子网。

  • 一个带有外部网关的路由器。

  • 一个连接到新路由器的新的子网接口。

在此示例中,public 网络是一个现有的共享网络

resources:
  internal_net:
    type: OS::Neutron::Net

  internal_subnet:
    type: OS::Neutron::Subnet
    properties:
      network_id: { get_resource: internal_net }
      cidr: "10.8.1.0/24"
      dns_nameservers: [ "8.8.8.8", "8.8.4.4" ]
      ip_version: 4

  internal_router:
    type: OS::Neutron::Router
    properties:
      external_gateway_info: { network: public }

  internal_interface:
    type: OS::Neutron::RouterInterface
    properties:
      router_id: { get_resource: internal_router }
      subnet: { get_resource: internal_subnet }

管理卷

创建卷

使用 OS::Cinder::Volume 资源创建新的块存储卷。

例如

resources:
  my_new_volume:
    type: OS::Cinder::Volume
    properties:
      size: 10

默认情况下,您创建的卷是空的。使用 image 属性从现有镜像创建可启动卷

resources:
  my_new_bootable_volume:
    type: OS::Cinder::Volume
    properties:
      size: 10
      image: ubuntu-trusty-x86_64

您还可以从另一个卷、卷快照或卷备份创建新的卷。使用 source_volidsnapshot_idbackup_id 属性从现有源创建新的卷。

例如,要从备份创建新的卷

resources:
  another_volume:
    type: OS::Cinder::Volume
    properties:
      backup_id: 2fff50ab-1a9c-4d45-ae60-1d054d6bc868

在此示例中,未定义 size 属性,因为块存储服务使用备份的大小来定义新卷的大小。

将卷附加到实例

使用 OS::Cinder::VolumeAttachment 资源将卷附加到实例。

以下示例创建一个卷和一个实例,并将该卷附加到该实例

resources:
  new_volume:
    type: OS::Cinder::Volume
    properties:
      size: 1

  new_instance:
    type: OS::Nova::Server
    properties:
      flavor: m1.small
      image: ubuntu-trusty-x86_64

  volume_attachment:
    type: OS::Cinder::VolumeAttachment
    properties:
      volume_id: { get_resource: new_volume }
      instance_uuid: { get_resource: new_instance }

从卷启动实例

使用 OS::Nova::Server 资源的 block_device_mapping 属性定义用于启动实例的卷。此属性是附加到实例在其启动之前要附加的卷的列表。

以下示例从镜像创建可启动卷,并使用它来启动实例

resources:
  bootable_volume:
    type: OS::Cinder::Volume
    properties:
      size: 10
      image: ubuntu-trusty-x86_64

  instance:
    type: OS::Nova::Server
    properties:
      flavor: m1.small
      networks:
        - network: private
      block_device_mapping:
        - device_name: vda
          volume_id: { get_resource: bootable_volume }
          delete_on_termination: false