如何在Softlayer中的Same Private / Public lan中创建集群?

时间:2016-10-04 11:38:37

标签: ibm-cloud-infrastructure

我想在同一个新人,私人和公共场所创建一个集群,但我不能 我试过了ansible,但它没有奏效 现在我尝试使用以下python代码

import SoftLayer
import time
client = SoftLayer.create_client_from_env(username='username',
                                 api_key='key')
cpus = 8
ssh_keys = 682641
memory = 16384
mgr = SoftLayer.VSManager(client)
for id in range(1, 4):
    host = u'dnode-%d' % (id)
    tag = u'slave'
    nodes = {
        'domain': u'domain',
        'hostname': host,
        'datacenter': u'dal09',
        'dedicated': False,
        'private': False,
        'cpus': cpus,
        'os_code' : u'CENTOS_LATEST',
        'hourly': True,
        'ssh_keys': [ssh_keys],
        # 'disks': ('25'),
        'local_disk': True,
        'memory': memory,
        'tags': (tag)
    }
    vsi = mgr.create_instance(**nodes)
    print vsi
    time.sleep(10)# this is to avoid instantiation errorÇ:
  

SoftLayer.exceptions.SoftLayerAPIError:SoftLayerAPIError(SoftLayer_Exception_Public):作为技术孵化器计划的积极参与者,您一次只能下一个订单。目前,您有一个挂单,需要最终处置才能下单。

这有时会起作用,但并非总是如此。 我尝试过使用public_vlan和private_vlan属性,但是当我这样做时,服务器并没有被实例化。

尼尔森回答后,

更新。 好的,我必须更改我的python代码以从第一个创建的工作站获取网络,并将其设置在群集中的以下服务器中。 对于我需要实例化的服务器数量,如果没有可用的网络ips会发生什么? 有没有办法确定哪个网络更好地实例化我的集群? 是否有列出可用网络的服务?

3 个答案:

答案 0 :(得分:1)

如果您希望您的计算机位于同一网络中,则需要在订单中为公共网络和专用网络指定VLAN,否则无法保证它们最终会位于同一网络中。请参阅有关订单的示例:

https://softlayer.github.io/python/create_vsi_options/

如果你的服务器没有被启动,这可能是softlayer配置过程的一个问题我建议你向softlayer提交一张票,并询问他们为什么你的服务器没有被启动。

关于您的另一个错误(与一个订单相关的错误),这是对您帐户的限制,如果您想要更改它,您需要与一些softlayer的销售人员交谈。您可以修改当前代码,添加等待直到订单完成,然后进行下一个订单,softlayer Python APi有一个方法可以看到:

https://github.com/softlayer/softlayer-python/blob/master/SoftLayer/managers/vs.py#L393

你只需要在代码中添加如下内容:

实施例::             #一旦vsi 12345准备就绪,或者经过10次检查后,将返回             ready = mgr.wait_for_ready(12345,10)

号码" 12345"是您刚刚订购的服务器的ID,您可以从以下位置获取该ID:

vsi = mgr.create_instance(**个节点) print vsi [" id"]

或者您可以尝试使用此方法一次创建多个服务器: https://github.com/softlayer/softlayer-python/blob/master/SoftLayer/managers/vs.py#L549

此链接也可以帮助您使用VLAN。 http://sldn.softlayer.com/blog/phil/CCI-VLAN-Specification

此致

答案 1 :(得分:1)

关于你的问题"是否有列出可用网络的服务?" 。试试这个脚本,它将有助于从您的帐户中获得免费插槽(免费IP地址):

"""
This script retrieves the Total Ip Addresses, Usable Ip Address Count and Free Slots

Important manual pages:
http://sldn.softlayer.com/reference/services/SoftLayer_Account/getNetworkVlans
http://sldn.softlayer.com/article/object-masks
http://sldn.softlayer.com/article/object-filters

License: http://sldn.softlayer.com/article/License
Author: SoftLayer Technologies, Inc. <sldn@softlayer.com>
"""
import SoftLayer
from prettytable import PrettyTable

# Declare your SoftLayer username and apiKey
username = 'set me'
apikey = 'set me'

# Contact To SoftLayer
client = SoftLayer.Client(username=username, api_key=apikey)

# Declare an Object Mask to get additional information
object_mask = 'mask[primaryRouter,primarySubnet[datacenter[name]],subnets[billingItem, subnetType,networkIdentifier, cidr, totalIpAddresses, usableIpAddressCount, ipAddresses[ipAddress, isReserved, virtualGuest, hardware]]]'


result = client['SoftLayer_Account'].getNetworkVlans(mask=object_mask)
x = PrettyTable(["Vlan Id", "Vlan Number", "Subnet", "Total Ip Addresses", "Usable Ip Address Count","Free Slots"])

count = 0
for vlan in result:
    for subnet in vlan['subnets']:
        for item in subnet['ipAddresses']:
            if item['isReserved'] == True:
                count = count + 1
            if 'hardware' in item:
                count = count + 1
            if 'virtualGuest' in item:
                count = count + 1
        if (int(subnet['usableIpAddressCount']) - count) > 0:
            if subnet['subnetType'] == 'PRIMARY' or subnet['subnetType'] == 'ADDITIONAL_PRIMARY':
                x.add_row([vlan['id'], str('%s  %s' % (vlan['primaryRouter']['hostname'], vlan['vlanNumber'])), str('%s/%s' % (subnet['networkIdentifier'], subnet['cidr'])), subnet['totalIpAddresses'], subnet['usableIpAddressCount'], (int(subnet['usableIpAddressCount']) - count)])
        count = 0
print(x)

答案 2 :(得分:0)

可以使用下一个请求获取公共或私有的集群及其EndPoints:

https://$username:$apiKey@api.softlayer.com/rest/v3/SoftLayer_Network_Storage/$networkStorageId/getObjectStorageConnectionInformation.json

Method: GET

将$ username,$ apiKey和$ networkStorageId替换为您的信息。

我不确定这是否满足您的所有要求,但它可能是将此请求的结果复制到ansible或python的起点。不过我要用python代码更新它。如果此请求可以帮助您实施,请告诉我们。