2014-02-23 24 views
0

我正在写一个python脚本创建一个亚马逊卷,并将其附加到使用boto的实例。 为此,我需要使用mkfs命令创建一个文件系统。 所以,我写了这个代码:mkfs无法使用织物

with settings(host_string=instance.public_dns_name, user = "my_user", key_filename="my_pem", warn_only=True): 
    run('mkfs.ext4 /dev/xvdh') 
    run('mount -t ext4 /dev/xvdh /work') 

它返回:

Could not stat /dev/xvdh --- No such file or directory 
The device apparently does not exist; did you specify it correctly? 

我会尝试多种选择:

  • 使用sudo而不是使用PTY =假,并运行
  • /或shell = False

我SSH到虚拟机并执行这些命令,它工作正常!但没有使用织物。

回答

1

虽然这可能不是一个直接的修复,但它是一个明确的选择,如果你所需要的只是实例上更大的驱动器。你可以用Boto做这样的事情来创建驱动器和实例(你可能已经有类似的东西了,我把它从我的代码中清除出来,这样可能会有一些额外的设置)

Step1:与块设备创建实例

def run_instances(): 
    dev_sda1 = BlockDeviceType() 
    bdm = BlockDeviceMapping() 
    bdm['/dev/sda1'] = dev_sda1 
    reservation = ec2_conn.run_instances(
     default_ami[ec2_conn.region.name], 
     min_count=count, 
     max_count=count, 
     **user_data=generate_userdata_base64(),** 
     key_name='yourkey', 
     security_groups=ec2_security_groups, 
     instance_type=instance_type, 
     **block_device_map=bdm,** 
     placement=placement 
    ) 

的文档具有当然的方法的详细信息: http://boto.readthedocs.org/en/latest/ref/ec2.html#module-boto.ec2.blockdevicemapping

第二步:预习设备

使用resize2fs而不是创建卷,前面的块映射设备将交换EBS卷或块存储的常规实例设备,并将默认的AMI数据加载到它上,然后您需要的只是扩展分区而不是创建新的一个。

我喜欢创建一个base64用户数据脚本,只是当您第一次启动实例时(当您使用fab时为什么不全部使用它)使生活更容易执行一些基本初始化任务。

def generate_userdata_base64(): 
    script = '#!/bin/bash\n\n' 
    script += 'resize2fs /dev/sda1\n' 
    script += 'yum update -y\n' 
    return base64.b64encode(script) 

你可以添加任何东西,像基地守护进程安装或启动,用户添加等,我希望这是有用的。

+0

Thanks @RageLink。但是,这个解决方案并不是我所需要的。我想要附加的卷是独立的比与AMI数据。 –

+0

主要是这样的 http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-using-volumes.html –

+0

如果您使用的不是amazon linux,您可能需要统计块存储设备或重新扫描设备,然后再安装它们...尝试 'sudo partprobe' 然后再做...如果不行,您甚至可以在创建分区之前尝试使用fdisk,例如 '$ sudo sfdisk/dev/sdb RageLink