【问题标题】:digitalocean script error on call通话中的 digitalocean 脚本错误
【发布时间】:2015-10-29 14:48:50
【问题描述】:

我在 centos 上使用 digitalocean 脚本,但它似乎不起作用。 https://www.digitalocean.com/community/tutorials/how-to-set-up-highly-available-haproxy-servers-with-keepalived-and-floating-ips-on-ubuntu-14-04

Traceback (most recent call last): File "/usr/local/bin/assign-ip", line 33, in <module> usage() File "/usr/local/bin/assign-ip", line 12, in usage print('{} [Floating IP] [Droplet ID]'.format(sys.argv[0])) ValueError: zero length field name in format

这里是调用的 sh 脚本

` export DO_TOKEN='xxxxxxxxxxx'
IP='xxx.xxx.xxx.xxx'
ID=$(curl -s 169.254.169.254/metadata/v1/id)
HAS_FLOATING_IP=$(curl -s http://169.254.169.254/metadata/v1/floating_ip/ipv4/active)

if [ $HAS_FLOATING_IP = "false" ]; then
n=0
while [ $n -lt 10 ]
do
    python /usr/local/bin/assign-ip $IP $ID && break
    n=$((n+1))
    sleep 3
done
fi`

这里是分配 IP 脚本

`#!/usr/bin/python

import os
import sys
import requests
import json

api_base = 'https://api.digitalocean.com/v2'


def usage():
print('{} [Floating IP] [Droplet ID]'.format(sys.argv[0]))
print('\nYour DigitialOcean API token must be in the "DO_TOKEN"'
      ' environmental variable.')


def main(floating_ip, droplet_id):
payload = {'type': 'assign', 'droplet_id': droplet_id}
headers = {'Authorization': 'Bearer {}'.format(os.environ['DO_TOKEN']),
           'Content-type': 'application/json'}
url = api_base + "/floating_ips/{}/actions".format(floating_ip)
r = requests.post(url, headers=headers,  data=json.dumps(payload))

resp = r.json()
if 'message' in resp:
    print('{0}: {1}'.format(resp['id'], resp['message']))
    sys.exit(1)
else:
    print('Moving IP address: {}'.format(resp['action']['status']))

if __name__ == "__main__":
if 'DO_TOKEN' not in os.environ or not len(sys.argv) > 2:
    usage()
    sys.exit()
main(sys.argv[1], sys.argv[2])
`

【问题讨论】:

  • 请描述什么不起作用
  • 我运行 sh 脚本,该脚本使用 python 执行下面的脚本。我得到的错误是顶部的内容。
  • 我已经通过安装 python3 和 pip3 解决了这个问题

标签: python linux centos


【解决方案1】:

偶然发现了这个。我实际上在上面写了the Python script。它链接的教程针对的是 Ubuntu 14.04。您看到的错误是由于 CentOS 6 附带 Python 2.6 而脚本使用了仅在 Python 2.7 中可用的功能。 gist containing it 已更新为与 Python 2.6 和 CentOS 6 兼容。

具体来说,错误是由于在字符串格式中省略了位置参数。例如:

print('{} [Floating IP] [Droplet ID]'.format(sys.argv[0]))

在 Python

print('{0} [Floating IP] [Droplet ID]'.format(sys.argv[0]))

From the docs:

2.7 版更改:位置参数说明符可以省略,因此'{} {}' 等效于'{0} {1}'

【讨论】:

    猜你喜欢
    • 2015-09-28
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    相关资源
    最近更新 更多