0

我正在编写一个脚本来在 Openstack 上创建一个 VM。如果浮动 IP 在池中耗尽,我可能会出错。如何检查该池中是否有可用的浮动 IP?有没有办法让 openstack 可以自动从所有可用池中选择池?

4

2 回答 2

1

您可以选择使用 API(例如使用 curl)或使用 openstack CLI,这是您在提交此问题时使用的。CLI 更容易直接编写脚本。以下是查询浮动 IP 的方法。警告:使用“-f json”输出然后使用“jq”命令进行字段查询变得非常普遍。您还可以使用“-f csv”或“-f value”并使用 grep 或 sed 进行解析。但是,尽管您以前可能没有这样做过,但我建议您尝试 json 和 jq。值得您花时间来解决您正在解决的问题。

(请注意“无”列是仅显示文本。实际存储的字段值为“空”。)

鉴于:

[user@system ~]$ openstack floating ip list
+--------------------------------------+---------------------+------------------+--------------------------------------+
| ID                                   | Floating IP Address | Fixed IP Address | Port                                 |
+--------------------------------------+---------------------+------------------+--------------------------------------+
| 2492aa71-cadf-4011-9c4f-87f856cd2551 | 172.25.250.29       | 192.168.3.10     | 1e0b868b-8b3c-4e8d-8f11-d6ed15d0e750 |
| 74c9233e-1420-4681-aaa7-357843f48962 | 172.25.250.36       | None             | None                                 |
| f235dfae-a01c-4290-864d-89b83f9a8de9 | 172.25.250.37       | None             | None                                 |
+--------------------------------------+---------------------+------------------+--------------------------------------+

在 json 中看起来像这样:

[stack@director ~]$ openstack floating ip list -f json
[
  {
    "Fixed IP Address": "192.168.3.10", 
    "ID": "2492aa71-cadf-4011-9c4f-87f856cd2551", 
    "Floating IP Address": "172.25.250.29", 
    "Port": "1e0b868b-8b3c-4e8d-8f11-d6ed15d0e750"
  }, 
  {
    "Fixed IP Address": null, 
    "ID": "74c9233e-1420-4681-aaa7-357843f48962", 
    "Floating IP Address": "172.25.250.36", 
    "Port": null
  }, 
  {
    "Fixed IP Address": null, 
    "ID": "f235dfae-a01c-4290-864d-89b83f9a8de9", 
    "Floating IP Address": "172.25.250.37", 
    "Port": null
  }
]

使用 'jq' 来解析这个输出,请允许我先用英语解释一下。jq 中的管道就像 bash shell 中的管道。所以“取全阵” | “选择此字段等于此值” | “返回这个其他字段”。如果需要,可以返回多个字段。

[user@system ~]$ openstack floating ip list -f json | jq  '.[] | select(.["Fixed IP Address"] == null ) | .["Floating IP Address"] '
"172.25.250.36"
"172.25.250.37"

如果您不想要引号中的结果,请询问原始输出(简称 -r)。

[user@system ~]$ openstack floating ip list -f json | jq  --raw-output '.[] | select(.["Fixed IP Address"] == null ) | .["Floating IP Address"]'
172.25.250.36
172.25.250.37

这些是您可用的浮动 IP。如果将它们拉入一个数组,您可以查询该数组以查看您有多少。

[user@system ~]$ floats=( $( openstack floating ip list -f json | jq  --raw-output '.[] | select(.["Fixed IP Address"] == null ) | .["Floating IP Address"]' ) )
[user@system ~]$ echo ${#floats[@]}
2
于 2017-06-18T01:10:23.400 回答
1

您可以查看您正在使用的脚本 API 的文档,但是从命令行列出分配给当前项目的所有浮动 IP 地址,运行:

   $ openstack floating ip list
   +--------------------------------------+---------------------+------------------+------+
   | ID                                   | Floating IP Address |  Fixed IP Address | Port |
    +--------------------------------------+---------------------+------------------+------+
   | 760963b2-779c-4a49-a50d-f073c1ca5b9e | 172.24.4.228        | None             | None |
   | 89532684-13e1-4af3-bd79-f434c9920cc3 | 172.24.4.235        | None             | None |
   | ea3ebc6d-a146-47cd-aaa8-35f06e1e8c3d | 172.24.4.229        | None             | None |
   +--------------------------------------+---------------------+------------------+------+

然后,您可以进行一些命令行编辑以提取 ip colmn 并获得 ip 计数。

于 2017-01-14T13:17:03.437 回答