2016-08-23 43 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

太好了,如果你能將答案標記爲正確,我會很感謝你。 –