首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在使用Anaconda引导时运行virt脚本与使用Python的subprocess.run()函数时会出现不一致?

为什么在使用Anaconda引导时运行virt脚本与使用Python的subprocess.run()函数时会出现不一致?
EN

Stack Overflow用户
提问于 2020-05-14 22:01:07
回答 1查看 178关注 0票数 0

我正在尝试将用BASH编写的kvm构建脚本转换为Python。在BASH中,我在脚本中编写了以下行,以执行从ISO映像构建的新的KVM实例:

代码语言:javascript
复制
virt-install \
    --name=${VMNAME} \
    --ram=${MEMSIZE} \
    --vcpus=${VCPUS} \
    --os-type "linux" \
    --location ${ISOFILE} \
    --file=/var/lib/libvirt/images/${VMNAME}.dsk \
    --file-size=${DISKSIZE} \
    --network bridge=br0 \
    --graphics=none \
    --os-variant="rhel7" \
    -x 'console=ttyS0,115200n8 serial' \
    -x "ks=http://192.168.1.10/boot/centos7.ks"

这将创建一个成功的构建,并且通过使用virt的"virsh“控制台可以看到。

我在Python中使用的脚本模拟了我的BASH脚本中正在发生的事情,如下所示:

代码语言:javascript
复制
kvm_cmd = ['/usr/bin/virt-install', \
           '--name=' + SELECT_SPECS[0], \
           '--ram=' + SELECT_SPECS[2], \
           '--vcpus=' + SELECT_SPECS[3], \
           '--os-type=linux', \
           '--location=' + CONFIG_VM[1], \
           '--file=/var/lib/libvirt/images/' + SELECT_SPECS[0] + '.dsk', \
           '--file-size=' + SELECT_SPECS[4], \
           '--network=bridge:br0', \
           '--nographics', \
           '--os-variant=' + CONFIG_VM[2], \
           '-x "console=ttyS0,115200n8 serial"', \
           '-x "ks=' + KS_REPO + CONFIG_VM[0] + '.ks"']
process = subprocess.run(kvm_cmd, stdout=subprocess.PIPE)
print(kvm_cmd)
print('VM ' + SELECT_SPECS[0] + ' created!')
return

现在,我正在尝试使用Python的subprocess.run()函数来执行BASH命令。虽然我没有在运行时看到串行输出,但在Python脚本运行时,我可以发送一个^]信号,以便退出控制台,并在另一个窗口/终端中重新输入virsh控制台。

进入控制台,我可以看到安装遇到了一些anaconda问题,报告"Kickstart文件/run/install/ks.cfg丢失“。

我可以确认我所有的命令参数变量都属于它们。我使用了这两种--网络桥:br0和--bridge=br0进行测试,并在本地使用'-x "ks= file :/centos7.ks‘和-initrd-inject=/path/to/centos7.ks定义了一个具有相同结果的启动文件。

代码语言:javascript
复制
['/usr/bin/virt-install', '--name=test', '--ram=2048', '--vcpus=1', '--os-type=linux', \
 '--location=/DataStore/ISOs/CentOS-7-x86_64-Minimal-1708.iso', '--file=/var/lib/libvirt/images/test.dsk', \ 
 '--file-size=20', '--bridge=br0', '--graphics=none', '--os-variant=rhel7', '-x  \
 "console=ttyS0,115200n8 serial"', '-x "ks=http://192.168.1.10/boot/centos7.ks"']

有谁能帮我弄清楚为什么用python的Subprocess.run()函数不能加载kickstart,但我在BASH中运行命令时没有问题。

除了在子进程中使用(最好是使用Python库)之外,还有更好的方法来创建我的kvm吗?我看过libvirt,但是找不到BASH查询的解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-14 22:58:53

等效于shell脚本片段:

代码语言:javascript
复制
    -x 'console=ttyS0,115200n8 serial' \
    -x "ks=http://${KS_REPO}/boot/${CONFIG_VM}.ks"

is (假设一个新的Python足以支持f-字符串的简洁性):

代码语言:javascript
复制
[
    '-x', 'console=ttyS0,115200n8 serial',
    '-x', f'ks=http://{KS_REPO}/boot/{CONFIG_VM[0]}.ks',
]

在两种语言中,没有文字引号,只有句法引号。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61808187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档