首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用openstacksdk启动实例时执行自定义脚本

使用openstacksdk启动实例时执行自定义脚本
EN

Stack Overflow用户
提问于 2021-08-12 09:53:06
回答 1查看 138关注 0票数 0

我是Openstack的新手,我正在尝试创建一个工具,这样我就可以在Openstack云中启动任意数量的实例。这很容易使用openstacksdk的nova客户端模块来完成。现在的问题是,我想让实例在创建时执行bash脚本,方法是将其添加为userdata文件,但它不执行。这令人困惑,因为我没有任何错误或警告信息。有人知道会是什么吗?

代码的重要部分

Python程序最重要的部分是获取云信息的函数,即创建实例和主函数的函数。科里说:“我会把它们贴在这里。”

代码语言:javascript
复制
"""
 Function that allow us to log at cloud with all the credentials needed. 
 Username and password are not read from env.
"""
def get_nova_credentials_v2():
    d = {}
    user = ""
    password = ""
    print("Logging in...")
    user = input("Username: ")
    password = getpass.getpass(prompt="Password: ", stream=None)
    while (user == "" or password == ""):
        print("User or password field is empty")
        user = input("Username: ")
        password = getpass.getpass(prompt="Password: ", stream=None)
    d['version'] = '2.65'
    d['username'] = user
    d['password'] = password
    d['project_id'] = os.environ['OS_PROJECT_ID']
    d['auth_url'] = os.environ['OS_AUTH_URL']
    d['user_domain_name'] = os.environ['OS_USER_DOMAIN_NAME']
    return d

然后我们有了create_server函数:

代码语言:javascript
复制
"""
 This function creates a server using the info we got from JSON file
"""

def create_server(server):
    s = {}
    print("Creating "+server['compulsory']['name']+"...")
    s['name'] = server['compulsory']['name']
    s['image'] = server['compulsory']['os']
    s['flavor'] = server['compulsory']['flavor']
    s['min_count'] = server['compulsory']['copyNumber']
    s['max_count'] = server['compulsory']['copyNumber']
    s['userdata'] = server['file']
    s['key_name'] = server['compulsory']['keyName']
    s['availability_zone'] = server['compulsory']['availabilityZone']
    s['nics'] = server['compulsory']['network']
    print(s['userdata'])
    if(exists("instalacion_k8s_docker.sh")):
        print("Exists")
        s['userdata'] = server['file']
        nova.servers.create(**s)

现在主要的功能是:

代码语言:javascript
复制
"""
 Main process: First we create a connection to Openstack using our credentials.
 Once connected we cal get_serverdata function to get all instance objects we want to be created.
 We check that it is not empty and that we are not trying to create more instances than we are allowed.
 Lastly we create the instances and the program finishes.
"""
credentials = get_nova_credentials_v2()
nova = client.Client(**credentials)
instances = get_serverdata()
current_instances = len(nova.servers.list())
if not instances:
    print("No instance was writen. Check instances.json file.")
    exit(3)
num = 0
for i in instances:
    create_server(i)    
exit(0)

对于其余的代码,您可以在github上访问这个公共回购。非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-13 12:14:54

问题求解

正如@Corey所说,问题在于server['file']的内容。它不能是写入数据的文件的路径,而是它的内容或文件类型对象的路径。在OpenstackSDK的情况下,它必须是base64编码的,但在Novaclient中并非如此。

非常感谢@Corey提供的所有帮助!:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68755184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档