【发布时间】:2017-06-23 12:55:04
【问题描述】:
有没有办法在主机上所有正在运行的 LXC 容器上运行命令,例如 fdisk -l?
lxc-execute requires --name option
【问题讨论】:
标签: lxc
有没有办法在主机上所有正在运行的 LXC 容器上运行命令,例如 fdisk -l?
lxc-execute requires --name option
【问题讨论】:
标签: lxc
只需几行bash就可以做到这一点,无需在主机上安装PHP。
LXC1.0
#!/bin/bash
for container in $(lxc-ls -1 --running); do
lxc-attach -n "$container" -- /bin/bash -c "fdisk -l"
done
LXD/LXC2.0+
#!/bin/bash
for container in $(lxc list volatile.last_state.power=RUNNING -c n --format csv); do
lxc exec "$container" "fdisk -l"
done
LXD/LXC3.0+(由@l422y 12/2020 添加)
#!/bin/bash
for container in $(lxc list volatile.last_state.power=RUNNING -c n --format csv); do
lxc exec "$container" -- fdisk -l
done
【讨论】:
以下命令将输出每个正在运行的容器的名称(并且仅是名称),每行一个:
lxc ls volatile.last_state.power=RUNNING -c n --format csv
我们可以在 bash for 循环中使用它,如下所示:
for container in `lxc ls volatile.last_state.power=RUNNING -c n --format csv`; do lxc exec $container <command>; done
【讨论】:
如果你在宿主节点上有一个 php 解释器,你可以使用这个 sn-p
#!/usr/bin/env php
<?php
if(!@is_executable('/usr/bin/lxc-attach'))
{
print "This host is probably not an LXC host.\n";
exit;
$ret=@exec('/usr/bin/lxc-ls');
$vzs=explode(' ',$ret);
exec('clear');
print "Executing \"".$argv[1]."\" command on all containers...\n";
sleep(1);
foreach($vzs as $k)
{
print "Executing \"".$argv[1]."\" command on $k...\n";
passthru('/usr/bin/lxc-attach -n '.$k.' -- '.$argv[1]);
echo PHP_EOL;
}
echo PHP_EOL;
【讨论】:
from pylxd import Client
import os
conn=Client()
def ExecuteCommandOn(command):
for i in conn.containers.all():
if i.status.upper()=="RUNNING":
query = "lxc exec %s -- %s" % (i.name,command)
os.system(query)
def main():
ExecuteCommandOn("uptime")
if __name__=="__main__":
main()
【讨论】: