- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在编写脚本来创建实例的 AMI 镜像。
我的目标是只保 stub 卷。
我正在使用 boto3。
我的测试实例附加了 2 个 EBS 卷。我只想用 AMI 保 stub 卷。
我的代码是这样工作的:
instance.create_image
来触发,并为根设备传递 ONLY BlockDeviceMappings
。 预期结果: AMI 只有我在 create_image
调用中定义的 block 设备。
实际结果:AMI 具有所有附加到源实例的 block 设备,无论在 create_image
期间定义的显式 BlockDeviceMappings
p>
在我下面的代码中,我编写了一个函数,它在别处获取已经收集的源实例数据。我只定义了根卷信息,BlockDeviceMappings
没有声明附加到源卷的任何其他设备。
def create_image(inst, instance, inst_dict):
nowtime = datetime.datetime.now().strftime('%Y-%m-%d')
try:
image = instance.create_image(
BlockDeviceMappings=[
{
'DeviceName': inst_dict[inst]['root_dev_name'],
'Ebs': {
'Encrypted': inst_dict[inst]['vol_encr'],
'DeleteOnTermination': inst_dict[inst]['vol_del_rule'],
'VolumeSize': inst_dict[inst]['vol_size'],
'VolumeType': inst_dict[inst]['root_dev_type']
},
},
],
Description=inst_dict[inst]['inst_name'] + " " + str(nowtime),
DryRun=False,
Name=inst_dict[inst]['inst_name'] + " " + str(nowtime),
NoReboot=True
)
except Exception, e:
logging.error("Failed to create image! Instance: " + inst_dict[inst]['inst_name'])
return 1
我确实看到 boto3 有一个 'NoDevice': 'string'
参数可以添加到 BlockDeviceMapping
对象。但它附加到映射本身 - 这让我感到困惑,你为什么要声明 block 设备映射,只是为了“排除”它。我不确定如何或为什么要使用此 NoDevice
值。
另外:一个具体的问题:
create_image
将创建所有 block 设备,而不管 BlockDeviceMappings
中放入了什么,那么为什么 BlockDeviceMappings
甚至存在,如果它只是复制源实例 block 设备?感谢您的帮助。
编辑/更新:
我试图为我不想要的卷声明设备映射。然后使用 NoDevice
参数:
BlockDeviceMappings=[
{
'DeviceName': inst_dict[inst]['root_dev_name'],
'Ebs': {
'Encrypted': inst_dict[inst]['vol_encr'],
'DeleteOnTermination': inst_dict[inst]['vol_del_rule'],
'VolumeSize': inst_dict[inst]['vol_size'],
'VolumeType': inst_dict[inst]['root_dev_type']
},
},
{
'DeviceName': '/dev/sdf',
'Ebs': {
'Encrypted': True,
'DeleteOnTermination': False,
'VolumeSize': 24,
'VolumeType': 'gp2'
},
'NoDevice': '',
},
],
我唯一能看到的是为 NoDevice
值设置一个空字符串。将它设置为 bool 或其他任何东西都会出错。我试过了“NoDevice”:“true”
和 “NoDevice”:“false”
和 “NoDevice”:True
和 “NoDevice”: False
和 'NoDevice': '/dev/sdf'
它们都会出错。唯一接受的是 'NoDevice': ''
但结果是一样的,两个设备都连接到 AMI。
最佳答案
好的,明白了。
诀窍是如果您想使用 NoDevice
现在可以使用了,向映射添加任何更多信息将使 NoDevice
无效并被忽略。
希望将来能帮助别人:
{
'DeviceName': '/dev/sdf',
'NoDevice': ''
},
关于python - 用于创建 AMI 的 Boto3 create_image - 仅保 stub 卷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46980189/
我是一名优秀的程序员,十分优秀!