【问题标题】:Softlayer API - Image captures with additional disks attachedSoftlayer API - 附加磁盘的图像捕获
【发布时间】:2016-08-23 10:00:35
【问题描述】:

我在制作带有附加磁盘的 vm 映像时遇到问题。我使用这里描述的捕获方法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

提前感谢您提供的任何帮助。

【问题讨论】:

    标签: ibm-cloud-infrastructure


    【解决方案1】:

    似乎问题在于您如何解析您的值:

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

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

    附加磁盘 = '假'

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

    如果您不想捕获所有磁盘,则需要从调用中删除“--additionaldisks False”。如果您想在通话中保留它,则需要更改解析代码,请参阅此以获取更多信息Parsing boolean values with argparse

    问候

    【讨论】:

    • 这就是我所需要的。现在工作。谢谢!
    • 太好了,如果您能将答案标记为正确,我将不胜感激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 2021-02-24
    • 2017-01-26
    • 1970-01-01
    相关资源
    最近更新 更多