api调用openstack组件

使用python3 [文件]创建资源。
【api调用创建flavor】
import requests           #调用requests模块
import json               #调用json模块
import os                 #调用os模块
headers = {"a":"b"}       #设置一个字典,没有后面headers无法写入
data = {                  #这里给data赋值,这里赋的值是json文件,放置发起请求需要用到的用户密码认证
    "auth": {
        "identity": {
            "methods": ["password"],
            "password": {
                "user": {
                    "domain": {
                        "name": "demo"
                    },
                    "name": "admin",
                    "password": "000000"
                }
            }
        },
        #更准确的规定用户
        #因为一个域里一个项目不允许存在相同用户,一个域里面有多个项目不同项目可以存在相同的用户名。
        "scope": {
            "project": {
                "domain": {
                    "name": "demo"
                },
                "name": "admin"
            }
        }
    }
}
headers["X-Auth-Token"] = requests.post('http://192.168.100.10:5000/v3/auth/tokens', headers=headers, json=data).headers["X-Subject-Token"]
#这里给字典写入数据,X-Auth-Token做键,通过链接访问页面获取token写入,token做值,keystone有两个端口,一个是35357的admin端口
#一个是5000端口,属于public和internal端口
data = {                                          #这里一样是给data赋值一个json文件
    'flavor': {
        'name': 'test_flavor',
        'id': '666',
        'ram': 2048,
        'disk': 20,
        'vcpus': 2
    }
}
requests.post('http://192.168.100.10:8774/v2.1/flavors', headers=headers, json=data).json()
#再次发起请求,模拟命令向api发起的请求,然后创建flavor。
print("创建成功")
注意点:链接,认证信息中的密码需要“”必须是键值对的格式。
使用diff可以核对文件的差异。
【api调用创建image】
import requests
import json
import os
headers = {"a":"b"}
data = {
    "auth": {
        "identity": {
            "methods": ["password"],
            "password": {
                "user": {
                    "domain": {
                        "name": "demo"
                    },
                    "name": "admin",
                    "password": "000000"
                }
            }
        },
        "scope": {
            "project": {
                "domain": {
                    "name": "demo"
                },
                "name": "admin"
            }
        }
    }
}
headers["X-Auth-Token"] = requests.post('http://192.168.100.10:5000/v3/auth/tokens', headers=headers, json=data).headers["X-Subject-Token"]
data = {                                                #这里设置镜像信息,上面都是发起请求需要的认证和token。
    "container_format": "bare",
    "disk_format": "qcow2",
    "name": "centos",
    "visibility": "public"
}
a=requests.post('http://192.168.100.10:9292/v2/images', headers=headers, json=data).json()              #这里提交请求
headers["Content-Type"] = "application/octet-stream"    #content-type需要修改,修改为二进制方式
                                                        #其他openstack不涉及文件调用时,都是默认为Application/json的方式
                                                        #请求头规范了我们请求内容,所以需要在请求头中声明我们的请求类型。 
requests.put(f"http://192.168.100.10:9292{a['file']}", headers=headers, data=open("/www/CentOS_7.2_x86_64_XD.qcow2", 'rb')).status_code
print("创建成功")              #这里真正提交镜像后面设置本地镜像路径
【api调用创建用户】
import requests
import json
import os
headers={"a":"b"}
data={
    "auth": {
        "identity": {
            "methods": ["password"],
            "password": {
                "user": {
                    "domain": {
                        "name": "demo"
                    },
                    "name": "admin",
                    "password": "000000"
                }
            }
        },
        "scope": {
            "project": {
                "domain": {
                    "name": "demo"
                },
                "name": "admin"
            }
        }
    }
}
headers["X-Auth-Token"] = requests.post('http://192.168.100.10:5000/v3/auth/tokens', headers=headers, json=data).headers["X-Subject-Token"]
data={
    "user": {
        "name": "sbzzy",
        "password": "sbzzy",
        "domain_id": "b20ce9996ba743deaa11b6130e432c20"      #复制域id
    }
}
requests.post('http://controller:35357/v3/users', headers=headers, json=data).json()
print("用户创建成功")
【api调用volume】
import requests
import json
import os
headers={"a":"b"}
data={
    "auth": {
        "identity": {
            "methods": ["password"],
            "password": {
                "user": {
                    "domain": {
                        "name": "demo"
                    },
                    "name": "admin",
                    "password": "000000"
                }
            }
        },
        "scope": {
            "project": {
                "domain": {
                    "name": "demo"
                },
                "name": "admin"
            }
        }
    }
}
headers["X-Auth-Token"]=requests.post("http://controller:5000/v3/auth/tokens",headers=headers,json=data).headers["X-Subject-Token"]
data={
    "volume": {
        "name": "iii",
        "size": 5,
    }
}
requests.post("http://controller:8776/v2/b57bd68bfccc495f834592987728df8a/volumes",headers=headers,json=data).json()
print("创建完成")
#这里无法使用http://controller:8776/v2/%(tenant_id)s,这里无法识别%(tenant_id)s,所以这里需要进入图形化界面,查看
这里实际的id为当前项目的id。
【api调用创建network】

 

import requests
import json
import os
headers={"a":"b"}
data={
    "auth": {
        "identity": {
            "methods": ["password"],
            "password": {
                "user": {
                    "domain": {
                        "name": "demo"
                    },
                    "name": "admin",
                    "password": "000000"
                }
            }
        },
        "scope": {
            "project": {
                "domain": {
                    "name": "demo"
                },
                "name": "admin"
            }
        }
    }
}
headers["X-Auth-Token"]=requests.post("http://controller:5000/v3/auth/tokens",headers=headers,json=data).headers["X-Subject-Token"]
data={
    "network": {
        "name": "aaa",
        "shared": "true",
        "provider:physical_network": "provider",
        "provider:network_type": "flat",
    }
}
requests.post("http://controller:9696/v2.0/networks",headers=headers,json=data).json()
print("创建成功")
创建子网
import requests
import json
import os
headers={"a":"b"}
data={
    "auth": {
        "identity": {
            "methods": ["password"],
            "password": {
                "user": {
                    "domain": {
                        "name": "demo"
                    },
                    "name": "admin",
                    "password": "000000"
                }
            }
        },
        "scope": {
            "project": {
                "domain": {
                    "name": "demo",
                },
                "name": "admin"
            }
        }
    }
}
headers["X-Auth-Token"]=requests.post("http://controller:35357/v3/auth/tokens",headers=headers,json=data).headers["X-Subject-Token"]
data={
    "subnet": {
        "name": "wai-sub",
        "cidr": "192.168.200.0/24",
        "gateway_ip": "192.168.200.1",
        "network_id": "f8b4eaa1-6020-47d0-b4ff-61251a33bc63",  #提前获取网络的id
        "ip_version": 4
    }
}
requests.post("http://controller:9696/v2.0/subnets",headers=headers,json=data).json()
print("子网创建完成")
也可以同时创建网络和子网
headers={"a":"b"}
qwe={
    "auth": {
        "identity": {
            "methods": ["password"],
            "password": {
                "user": {
                    "domain": {
                        "name": "demo"
                    },
                    "name": "admin",
                    "password": "000000"
                }
            }
        },
        "scope": {
            "project": {
                "domain": {
                    "name": "demo",
                },
                "name": "admin"
            }
        }
    }
}
headers["X-Auth-Token"]=requests.post("http://controller:35357/v3/auth/tokens",headers=headers,json=qwe).headers["X-Subject-Token"]
data={
    "network": {
        "name": "wai",
        "shared": "true",
        "provider:network_type": "flat",
        "provider:physical_network": "provider",
    }
}
a=requests.post("http://controller:9696/v2.0/networks",headers=headers,json=data).json()   #至此网络创建完毕
b=a['network']['id']     #这里赋值给b的是一个带有此网络信息的字典,这里将字典中的字典里的id值提取出来,也就是network_id。
print("网络创建成功")
data={
    "subnet": {
        "name": "wai-sub",
        "cidr": "192.168.200.0/24",
        "gateway_ip": "192.168.200.1",
        "ip_version": "4"
    }
}
data["subnet"]["network_id"]=str(b)              #这里给上面写入data的字典中的字典添加network_id:[id]键值对,添加一创建网络的id,就不用自行复制了。
requests.post("http://controller:9696/v2.0/subnets",headers=headers,json=data).json()
print("^_^!!")
print("子网创建完成")
【创建实例】
import requests
import json
import os
headers={"a":"b"}
data={
    "auth": {
        "identity": {
            "methods": ["password"],
            "password": {
                "user": {
                    "domain": {
                        "name": "demo"
                    },
                    "name": "admin",
                    "password": "000000"
                }
            }
        },
        "scope": {
            "project": {
                "domain": {
                    "name": "demo"
                },
                "name": "admin"
            }
        }
    }
}
headers["X-Auth-Token"]=requests.post("http://controller:5000/v3/auth/tokens",headers=headers,json=data).headers["X-Subject-Token"]
data={
    "server": {
        "name": "server1",
        "imageRef": "86a415e0-d7b0-48b7-82f2-423e8ce43fa9",
        "flavorRef": "1",
        "networks": [{"uuid": "ff66a808-d19e-488a-8c67-a55987ebc0b4"}]          #不设置使用网段,则使用已有子网,如果已有多个子网,此选项为必须配置。
    }
}
requests.post("http://controller:8774/v2.1/servers",headers=headers,json=data).json()
print("创建完成")

  

posted @ 2023-03-30 14:42  ning-cloud  阅读(86)  评论(0)    收藏  举报