2016-08-23 39 views
0

我在附加附加磁盘的情况下制作vm图像时出现问题。我使用这里描述的捕获方法https://softlayer-python.readthedocs.io/en/v3.3.0/api/managers/cci.html。虽然我将additional_disks设置为False,但我的图像也包含可连接的设备。它会影响所有设备。有谁知道什么是错的?提前致谢。Softlayer API - 附加附加磁盘的图像捕获

我的脚本看起来像如下:

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 /默认/ sl_snapshots文件具有以下结构:

[email protected]:~# cat /etc/default/sl_snapshots 
SL_USERNAME=my_username 
SL_API_KEY=my_key 

谢谢你提前提供任何帮助。

回答

1

看来,问题是你如何分析你的价值观:

parser.add_argument(
     '--additionaldisks', 
     dest='additionaldisks', 
     help='Create snapshot for any additional disk attached to the machine.', 
     required=True) 

目前你是parsign值是一个字符串不是booelan,所以你得到的东西是这样的:

additionaldisks ='False'

对于python空字符串评估为False,但其他一切评估为True。所以这就是为什么你编码捕获所有的磁盘。

如果您不想捕获所有需要从通话中删除“--additionaldiskks False”的磁盘。如果你想保持它在你的电话,你neeed更改解析代码里发现,以了解更多信息Parsing boolean values with argparse

问候

+0

That's我需要什么。现在工作。谢谢! –

+0

太好了,如果你能将答案标记为正确,我会很感谢你。 –