Softlayer API - 附加磁盘的图像捕获
Softlayer API - Image captures with additional disks attached
我在制作带有附加磁盘的虚拟机映像时遇到问题。我使用此处描述的捕获方法 https://softlayer-python.readthedocs.io/en/v3.3.0/api/managers/cci.html。虽然我将 additional_disks 设置为 False,但我的图像也包含可连接的设备。它会影响所有设备。有谁知道什么是错的?提前致谢。
我的脚本如下所示:
import SoftLayer
import argparse
import sys
import datetime
def initialize_sl_connection():
with open('/etc/default/sl_snapshots', 'r') as f:
for line in f:
if 'SL_USERNAME' in line:
SL_USERNAME = line.rstrip().split('=')[1]
if 'SL_API_KEY' in line:
SL_API_KEY = line.rstrip().split('=')[1]
client = SoftLayer.Client(username = SL_USERNAME, api_key = SL_API_KEY)
mgr_vs = SoftLayer.VSManager(client)
mgr_image = SoftLayer.ImageManager(client)
return (mgr_vs, mgr_image)
def get_instance_id_by_hostname_and_datacenter(mgr_vs, hostname, datacenter):
instance = (mgr_vs.list_instances(hostname = hostname, datacenter = datacenter)[0:]+[{}])[0]
return instance['id'] if instance.has_key('id') else None
def capture_sl_snapshot(mgr_vs, hostname, additionaldisks, instance_id):
name = hostname + '_' + str(datetime.date.today()).replace('-','_')
mgr_vs.capture(instance_id = instance_id, name = name, additional_disks = additionaldisks, notes = None)
def clean_old_sl_snapshots(mgr_image, hostname):
image_list = mgr_image.list_private_images(name = hostname+'*')
number_of_snapshots = len(image_list)
if number_of_snapshots > 4:
for i in range(0, number_of_snapshots-4):
mgr_image.delete_image(image_list[i]['id'])
def main():
parser = argparse.ArgumentParser(
description='Automate creating SL snapshots with Ansible.')
parser.add_argument(
'--hostname',
dest='hostname',
help='Servers hostname.',
required=True)
parser.add_argument(
'--datacenter',
dest='datacenter',
help='Datacenters name.',
required=True)
parser.add_argument(
'--additionaldisks',
dest='additionaldisks',
help='Create snapshot for any additional disk attached to the machine.',
required=True)
args = parser.parse_args()
mgr_vs = initialize_sl_connection()[0]
mgr_image = initialize_sl_connection()[1]
instance_id = get_instance_id_by_hostname_and_datacenter(mgr_vs, args.hostname, args.datacenter)
if instance_id:
capture_sl_snapshot(mgr_vs, args.hostname, args.additionaldisks, instance_id)
clean_old_sl_snapshots(mgr_image, args.hostname)
if __name__ == "__main__":
main()
我的电话是这样的:
/usr/bin/python /opt/scripts/sl_take_snapshot.py --hostname my_servers_hostname --datacenter lon02 --additionaldisks False
/etc/defaults/sl_snapshots 文件具有以下结构:
root@ip-10-0-3-84:~# cat /etc/default/sl_snapshots
SL_USERNAME=my_username
SL_API_KEY=my_key
提前感谢您提供的任何帮助。
问题似乎出在您解析值的方式上:
parser.add_argument(
'--additionaldisks',
dest='additionaldisks',
help='Create snapshot for any additional disk attached to the machine.',
required=True)
目前你的 parsign 值是一个字符串而不是 booelan,所以你会得到这样的东西:
额外磁盘 = 'False'
对于 python,空字符串被评估为 False,但其他所有内容都被评估为 True。所以这就是为什么你正在编码是捕获所有磁盘。
如果您不想捕获所有需要的磁盘,请从您的调用中删除“--additionaldisks False”。如果你想在你的通话中保留它,你需要更改你的解析代码,请参阅此以获取更多信息 Parsing boolean values with argparse
此致
我在制作带有附加磁盘的虚拟机映像时遇到问题。我使用此处描述的捕获方法 https://softlayer-python.readthedocs.io/en/v3.3.0/api/managers/cci.html。虽然我将 additional_disks 设置为 False,但我的图像也包含可连接的设备。它会影响所有设备。有谁知道什么是错的?提前致谢。
我的脚本如下所示:
import SoftLayer
import argparse
import sys
import datetime
def initialize_sl_connection():
with open('/etc/default/sl_snapshots', 'r') as f:
for line in f:
if 'SL_USERNAME' in line:
SL_USERNAME = line.rstrip().split('=')[1]
if 'SL_API_KEY' in line:
SL_API_KEY = line.rstrip().split('=')[1]
client = SoftLayer.Client(username = SL_USERNAME, api_key = SL_API_KEY)
mgr_vs = SoftLayer.VSManager(client)
mgr_image = SoftLayer.ImageManager(client)
return (mgr_vs, mgr_image)
def get_instance_id_by_hostname_and_datacenter(mgr_vs, hostname, datacenter):
instance = (mgr_vs.list_instances(hostname = hostname, datacenter = datacenter)[0:]+[{}])[0]
return instance['id'] if instance.has_key('id') else None
def capture_sl_snapshot(mgr_vs, hostname, additionaldisks, instance_id):
name = hostname + '_' + str(datetime.date.today()).replace('-','_')
mgr_vs.capture(instance_id = instance_id, name = name, additional_disks = additionaldisks, notes = None)
def clean_old_sl_snapshots(mgr_image, hostname):
image_list = mgr_image.list_private_images(name = hostname+'*')
number_of_snapshots = len(image_list)
if number_of_snapshots > 4:
for i in range(0, number_of_snapshots-4):
mgr_image.delete_image(image_list[i]['id'])
def main():
parser = argparse.ArgumentParser(
description='Automate creating SL snapshots with Ansible.')
parser.add_argument(
'--hostname',
dest='hostname',
help='Servers hostname.',
required=True)
parser.add_argument(
'--datacenter',
dest='datacenter',
help='Datacenters name.',
required=True)
parser.add_argument(
'--additionaldisks',
dest='additionaldisks',
help='Create snapshot for any additional disk attached to the machine.',
required=True)
args = parser.parse_args()
mgr_vs = initialize_sl_connection()[0]
mgr_image = initialize_sl_connection()[1]
instance_id = get_instance_id_by_hostname_and_datacenter(mgr_vs, args.hostname, args.datacenter)
if instance_id:
capture_sl_snapshot(mgr_vs, args.hostname, args.additionaldisks, instance_id)
clean_old_sl_snapshots(mgr_image, args.hostname)
if __name__ == "__main__":
main()
我的电话是这样的:
/usr/bin/python /opt/scripts/sl_take_snapshot.py --hostname my_servers_hostname --datacenter lon02 --additionaldisks False
/etc/defaults/sl_snapshots 文件具有以下结构:
root@ip-10-0-3-84:~# cat /etc/default/sl_snapshots
SL_USERNAME=my_username
SL_API_KEY=my_key
提前感谢您提供的任何帮助。
问题似乎出在您解析值的方式上:
parser.add_argument(
'--additionaldisks',
dest='additionaldisks',
help='Create snapshot for any additional disk attached to the machine.',
required=True)
目前你的 parsign 值是一个字符串而不是 booelan,所以你会得到这样的东西:
额外磁盘 = 'False'
对于 python,空字符串被评估为 False,但其他所有内容都被评估为 True。所以这就是为什么你正在编码是捕获所有磁盘。
如果您不想捕获所有需要的磁盘,请从您的调用中删除“--additionaldisks False”。如果你想在你的通话中保留它,你需要更改你的解析代码,请参阅此以获取更多信息 Parsing boolean values with argparse
此致