この記事は約11分10秒で読むことができます。

kvm上の仮想マシンmacアドレスをkey-value形式のファイルで管理してみようと思った話

まえがき

役に立つと思ったので、作ってみた。なお、rootユーザで作業する前提。sudoでパスワード渡しにくいから。

コマンドファイル作成

エスケープ回避したい。あんまりに気にしたくない。

コード表示

[root@centos vx]# cat get_macaddr_cmd
virsh dumpxml vx_node@ | grep "mac address" | awk 'match($0, /[a-f0-9]{2}(:[a-f0-9]{2}){5}/) {print substr($0, RSTART, RLENGTH)}'

ノードファイル作成

仮想マシンをノードファイルで管理する。

コード表示

[root@centos vx]# seq 3 | xargs -I{} bash -c 'echo node{}' > nodename
[root@centos vx]# cat nodename
node1
node2
node3

3つの仮想マシンを立ち上げる

コード表示

[oracle@centos vx]$ vagrant status
Current machine states:

node1                     running (libvirt)
node2                     running (libvirt)
node3                     running (libvirt)

This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.

実行例

コード表示

[root@centos vx]# seq 3 | xargs -I{} bash -c 'sed -e s/@/{}/ get_macaddr_cmd | bash ' > macaddr
[root@centos vx]# cat macaddr
52:54:00:91:02:58
52:54:00:8d:fd:14
52:54:00:cd:fe:3a
[root@centos vx]# seq 3 | xargs -I{} bash -c 'echo node{}' > nodename
[root@centos vx]# cat nodename
node1
node2
node3
[root@centos vx]# paste -d ' ' nodename macaddr
node1 52:54:00:91:02:58
node2 52:54:00:8d:fd:14
node3 52:54:00:cd:fe:3a
[root@centos vx]# virsh dumpxml vx_node1 | awk '/<interface/,/interface>/'
    <interface type='network'>
      <mac address='52:54:00:91:02:58'/>
      <source network='vagrant-libvirt' bridge='virbr0'/>
      <target dev='vnet2'/>
      <model type='virtio'/>
      <alias name='net0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </interface>
[root@centos vx]# virsh dumpxml vx_node2 | awk '/<interface/,/interface>/'
    <interface type='network'>
      <mac address='52:54:00:8d:fd:14'/>
      <source network='vagrant-libvirt' bridge='virbr0'/>
      <target dev='vnet1'/>
      <model type='virtio'/>
      <alias name='net0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </interface>
[root@centos vx]# virsh dumpxml vx_node3 | awk '/<interface/,/interface>/'
    <interface type='network'>
      <mac address='52:54:00:cd:fe:3a'/>
      <source network='vagrant-libvirt' bridge='virbr0'/>
      <target dev='vnet0'/>
      <model type='virtio'/>
      <alias name='net0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </interface>

こういうの全部まとめておきたい

必要なもの

コード表示

[root@centos vx]# cat get_nodename_cmd
echo node@
[root@centos vx]# cat get_macaddr_cmd
virsh dumpxml vx_node@ | grep "mac address" | awk 'match($0, /[a-f0-9]{2}(:[a-f0-9]{2}){5}/) {print substr($0, RSTART, RLENGTH)}'
[root@centos vx]# seq 3 | xargs -I{} bash -c 'sed -e s/@/{}/ get_nodename_cmd | bash ' > nodename
[root@centos vx]# cat nodename
node1
node2
node3
[root@centos vx]# seq 3 | xargs -I{} bash -c 'sed -e s/@/{}/ get_macaddr_cmd | bash ' > macaddr
[root@centos vx]# cat macaddr
52:54:00:91:02:58
52:54:00:8d:fd:14
52:54:00:cd:fe:3a
[root@centos vx]# paste -d ' ' nodename macaddr
node1 52:54:00:91:02:58
node2 52:54:00:8d:fd:14
node3 52:54:00:cd:fe:3a
[root@centos vx]# cat cmd_list
get_nodename_cmd
get_macaddr_cmd
[root@centos vx]# cat script_run.sh
#!/bin/bash
RPT="$1"

while read line; do
  rm -rf $(echo ${line} | sed -e s/\_/\\t/g | awk '{print $2}');
  seq ${RPT} | while read rpt; do
    cat ${line} | sed -e s/@/${rpt}/ | bash;
  done
done < <(cat cmd_list)

実行例

いいんじゃないかな。

コード表示

[root@centos vx]# ./script_run.sh 3 && paste -d ' ' nodename macaddr
node1 52:54:00:91:02:58
node2 52:54:00:8d:fd:14
node3 52:54:00:cd:fe:3a

Leave a Reply

Your email address will not be published. Required fields are marked *