前面已经介绍了OpenStack虚拟机从Nova Metadata服务获取metadata的过程。有时候我们可能需要调试虚拟机的metadata信息,验证传递的数据是否正确,而又嫌麻烦不希望进入虚拟机内部去调试。有什么方法能够直接调用nova-api-metadata服务获取虚拟机信息呢。
根据前面介绍的原理,我写了两个脚本实现:
第一个Python脚本sign_instance.py用于生成secret:
- sign_instance.py
-
- import six
- import sys
- import hmac
- import hashlib
-
- def sign_instance_id(instance_id, secret=''):
- if isinstance(secret, six.text_type):
- secret = secret.encode('utf-8')
- if isinstance(instance_id, six.text_type):
- instance_id = instance_id.encode('utf-8')
- return hmac.new(secret, instance_id, hashlib.sha256).hexdigest()
- print(sign_instance_id(sys.argv[1]))
第二个bash脚本get_metadata.py实现获取虚拟机metadata:
- #!/bin/bash
- metadata_server=http://192.168.1.16:8775
- metadata_url=$metadata_server/openstack/latest
- instance_id=$1
- data=$2
- if [[ -z $instance_id ]]; then echo "Usage: $0 <instance_id>"
- exit 1
- fi tenant_id=$(nova show $instance_id | awk '/tenant_id/{print $4}')
- sign_instance_id=$(python sign_instance.py $instance_id)
- curl -sL -H "X-Instance-ID:$instance_id" -H "X-Instance-ID-Signature:$sign_instance_id" -H "X-Tenant-ID:$tenant_id" $metadata_url/$data
其中metadata_server为Nova Metadata服务地址。
用法如下:
- # ./get_metadata.sh daf32a70-42c9-4d30-8ec5-3a5d97582cff
- meta_data.json
- password
- vendor_data.json
- network_data.json
- # ./get_metadata.sh daf32a70-42c9-4d30-8ec5-3a5d97582cff network_data.json | python -m json.tool
- {
- "links": [
- {
- "ethernet_mac_address": "fa:16:3e:e8:81:9b",
- "id": "tap28468932-9e",
- "mtu": 1450,
- "type": "ovs",
- "vif_id": "28468932-9ea0-43d0-b699-ba19bf65cae3"
- }
- ],
- "networks": [
- {
- "id": "network0",
- "link": "tap28468932-9e",
- "network_id": "2c4b658c-f2a0-4a17-9ad2-c07e45e13a8a",
- "type": "ipv4_dhcp"
- }
- ],
- "services": []
- }
5 总结
最后通过一张工作流图总结:
(编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|