Назначьте плавающий ip экземпляру openstack, используя тепловой шаблон

Вот мой шаблон, который работает. Я выполняю команду 'heat stack-create' с этим шаблоном, и он создает стек и экземпляр с ip. У меня есть доступ к интерфейсу для управления моими экземплярами. С помощью этого интерфейса я могу создать плавающий IP-адрес и назначить его только что созданному экземпляру.

heat_template_version: 2013-05-23

description: >
    Docker generic server

parameters:
    image_id: {default: centos-7, description: image, type: string}
    instance_type: {default: ug1.medium, description: instance, type: string}
    key_name: {default: user, description: Name of an existing key pair to use for the instance, type: string}

resources:
    nginx_securitygroup:
      properties:
        GroupDescription: Generic security group for nginx stack
        SecurityGroupIngress:
          - {CidrIp: 10.0.0.0/8, FromPort: '80', IpProtocol: TCP, ToPort: '80'}
  type: AWS::EC2::SecurityGroup


server_securitygroup:
    type: AWS::EC2::SecurityGroup
    properties:
        GroupDescription: Generic security group from docker nginx
        SecurityGroupIngress:
            # This is needed to allow pinging the server
            - {"CidrIp": "10.0.0.0/8", "FromPort": "-1", "ToPort": "-1", "IpProtocol": "ICMP"}

            # Ssh port
            - {"CidrIp": "10.0.0.0/8", "FromPort": "22", "ToPort": "22", "IpProtocol": "TCP"}

            # Open docker ports
            - {"CidrIp": "10.0.0.0/8", "FromPort": "2375", "ToPort": "2375", "IpProtocol": "TCP"}
            - {"CidrIp": "10.0.0.0/8", "FromPort": "2376", "ToPort": "2376", "IpProtocol": "TCP"}

docker_server:
    type: AWS::EC2::Instance
    properties:

        ImageId: { get_param: image_id }
        InstanceType: { get_param: instance_type }
        KeyName: { get_param: key_name }
        SecurityGroups:
            - Ref: server_securitygroup
            - {Ref: nginx_securitygroup}


        UserData: |
            #!/bin/bash -v

            #Do some operations to start the docker container on the instance                

outputs:
    ipaddress_private:
        description: Private ip
        value:
            "Fn::GetAtt":
                - docker_server
                - PrivateIp

Моя проблема в том, что я не хочу назначать вручную созданный плавающий IP-адрес экземпляру, я хочу, чтобы он назначался автоматически при создании моего стека и экземпляра. Я попытался следовать некоторым документам, например, этому: http://blog.oddbit.com/2013/12/06/an-introduction-to-openstack-heat/

Но это не работает. Возможно, это потому, что он пытается присвоить плавающий IP другому существующему ресурсу (серверу). Как я могу заставить ассоциацию работать?

2 ответа

Решение

Хорошо, методом проб и ошибок, я нашел, что делать...

В разделе "параметры" добавьте:

ip_address : {default: x.x.x.x, description : Floating IP address to be associated to the instance, type : string}

В разделе "ресурсы":

IPAssoc :
    type : AWS::EC2::EIPAssociation
    properties :
        InstanceId : { get_resource: docker_server }
        EIP : { get_param : ip_address } 

Используйте ресурсы FloatingIPAssociation. Пример:

  association:
    type: OS::Nova::FloatingIPAssociation
    properties:
      floating_ip: { get_param: floatingIpId }
      server_id: { get_resource: instance }

Другой пример с NeutronFloatingAssociation:

  association:
     type: OS::Neutron::FloatingIPAssociation
     properties:
       floatingip_id: { get_param: floatingIpId }
       port_id: { get_param: port_id }
Другие вопросы по тегам