0

必要に応じて openstack にサーバーを自動的に作成するプログラムを書いています。問題は、インスタンスが IP アドレスを取得するまでプログラムを待機させてから続行することです。インスタンスが IP を取得していない場合、novaclient は例外をスローし、オブジェクトは終了します。スリープ機能を使用すると機能しますが、それを永続的な解決策にしたくありません。

   ipAddress = None
   try:
        instance = nova.servers.create(name=self.hostName, image=image,
                                flavor=flavor, key_name="mykey",
                                nics=nics)
        while(ipAddress == None): #<---Something like this, just actually working
            for network in instance.networks['my_net']:
                if re.match('\d+\.\d+\.\d+\.\d+', network):
                    self.ipAddress = network
                    break

        print 'The server is waiting at IP address {0}.'.format(self.ipAddress)

    except:
        print "could not create webserver"
        #WebManager.exception(hostname)

    finally:
        print("Execution Completed")
        self.addToLoadbalancer()

サーバーがIPを取得するまで待機する一種のスピンロックなどを作成する方法はありますか? どんなヒントも素晴らしいでしょう。

4

1 に答える 1

0

私は問題を解決することができました。novaclient だけを使用しただけでは、マシンの準備が整ったことを検出するのは困難であることがわかりました。を使用しnova listて、なんとかIPアドレスを取得できました。

while 1 == 1:
    result = getbash("nova list" + " | grep " + hostname + \\
             " | awk '{print $12}'").split('=')
    if re.match('\d+\.\d+\.\d+\.\d+', result[-1]):
        self.ipAddress = result[-1]
        print 'The server is waiting at IP address {0}.'.format(self.ipAddress)
        break
    sleep(1)

このコードは、ホスト名を照会し、インスタンスが IP アドレスを受信したかどうかを確認します。getbash() 関数は、次subprocessの出力を返す単純な関数です。subprocess.Popen(command,stdout=subprocess.PIPE, shell=True)

于 2015-05-07T11:13:19.713 に答える