我是Openstack的新手,我正在尝试创建一个工具,这样我就可以在Openstack云中启动任意数量的实例。这很容易使用openstacksdk的nova客户端模块来完成。现在的问题是,我想让实例在创建时执行bash脚本,方法是将其添加为userdata文件,但它不执行。这令人困惑,因为我没有任何错误或警告信息。有人知道会是什么吗?
代码的重要部分
Python程序最重要的部分是获取云信息的函数,即创建实例和主函数的函数。科里说:“我会把它们贴在这里。”
"""
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函数:
"""
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)现在主要的功能是:
"""
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上访问这个公共回购。非常感谢!
发布于 2021-08-13 12:14:54
问题求解
正如@Corey所说,问题在于server['file']的内容。它不能是写入数据的文件的路径,而是它的内容或文件类型对象的路径。在OpenstackSDK的情况下,它必须是base64编码的,但在Novaclient中并非如此。
非常感谢@Corey提供的所有帮助!:)
https://stackoverflow.com/questions/68755184
复制相似问题