2016-08-23 5 views
0

追加のディスクが接続された状態でvm`sイメージを作成する際に問題があります。ここで説明するキャプチャ方法を使用します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と評価されます。だからこそ、あなたはコーディングがすべてのディスクをキャプチャしているのです。

すべてのディスクをキャプチャしたくない場合は、 "--additionaldisks False"を削除する必要があります。あなたがあなたの解析コードを変更するneeedお電話でそれを維持したい場合、私は必要なものをより多くの情報Parsing boolean values with argparse

よろしく

+0

That'sのためにこれを参照してください。今働いている。ありがとうございました! –

+0

偉大な、私は正しいと答えをマークすることができれば感謝します。 –

関連する問題