mkfs不使用fabric

时间:2014-02-23 00:57:59

标签: boto fabric

我正在编写一个python脚本,用于创建亚马逊卷并使用boto将其附加到实例。 为此,我需要使用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 = False和/或shell = False

我通过SSH连接到VM并执行了这些命令,它运行正常!但没有使用面料。

1 个答案:

答案 0 :(得分:1)

虽然这可能不是一个直接的解决方案,但如果你需要的只是一个更大的驱动器,它是一个明确的选择。你可以用Boto做这样的事情来创建驱动器和实例(你可能已经有类似的了,我把它从我的代码中取出并清理干净,因此可能会有一些额外的设置)

步骤1:使用块设备创建实例

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

第2步:准备设备

使用 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)

你可以添加任何其他东西,比如安装或启动基本守护进程,添加用户等等。我希望这很有用。