2017-09-07 8 views
0

N個のアレイホストから利用可能な空きメモリが最大で空き容量が最も少ないホストを見つけ、VMを最も空きが少ないメモリホストから最大のメモリホストに移行したいと考えています。現在、私のスクリプトは3つのホストだけで動作していますが、動的なホスト数のスクリプトが必要です。あなたは誰でもスクリプトの論理について私を助けてくれますか?前もって感謝します。N個のホストから大容量で空きメモリが少ないホストを見つけるにはどうすればよいですか?

#!/usr/bin/bash 
array_host=($(xe host-list params=uuid | cut -c 17-)) 
#Loop throguh each xen server node 

for i in ${array_host[@]}; 

do 
    host_name+=($(xe host-list params=name-label uuid=$i| cut -c 23-)) 

    free_mem1=$(xe host-data-source-query data-source=memory_free_kib uuid=$i) 

    mem_int=(${free_mem1/\.*}) 

    mem_mb=$(($mem_int/1024)) 

    free_mem+=($mem_mb) 

    total_mem+=($(xe host-data-source-query data-source=memory_total_kib uuid=$i)) 

    load_avg+=($(xe host-data-source-query data-source=loadavg uuid=$i)) 

    cpu_avg+=($(xe host-data-source-query data-source=cpu_avg uuid=$i)) 

    no_vms+=$(xe vm-list resident-on=$i | grep -c running) 

done 


if ((${free_mem[2]} < ${free_mem[1]} && ${free_mem[2]} < ${free_mem[0]})); 
then 

vm_list=($(xe vm-list params=uuid is-control-domain=false resident-on=${array_host[2]} | cut -c 17-)) 

for vm in ${vm_list[@]}; 

do 
    if ((${free_mem[1]} < ${free_mem[0]})); then 

     xe vm-migrate uuid=${vm_list[0]} host-uuid=${array_host[0]} --live 

     echo ${vm_list[0]} has been migrated from xen-node2 to xen-node3 
    else 

     xe vm-migrate uuid=${vm_list[0]} host-uuid=${array_host[1]} --live 

     echo ${vm_list[0]} has been migrated from xen-node2 to xen-node1 
fi 

done 

fi 

if ((${free_mem[1]} < ${free_mem[2]} && ${free_mem[1]} < ${free_mem[0]})); 
then 


vm_list=($(xe vm-list params=uuid is-control-domain=false resident-on=${array_host[1]} | cut -c 17-)) 

for vm in ${vm_list[@]}; 

do 

    if ((${free_mem[2]} < ${free_mem[0]})); then 

     xe vm-migrate uuid=${vm_list[0]} host-uuid=${array_host[0]} --live 

     echo ${vm_list[0]} has been migrated from xen-node1 to xen-node3 

    else 

     vm_list=($(xe vm-list params=uuid is-control-domain=false resident-on=${array_host[1]} | cut -c 17-)) 

     xe vm-migrate uuid=${vm_list[0]} host-uuid=${array_host[2]} --live 

     echo ${vm_list[0]} has been migrated from xen-node1 to xen-node2 
fi 

done 

fi 



if ((${free_mem[0]} < ${free_mem[1]} && ${free_mem[0]} < ${free_mem[2]})); 
then 

vm_list=($(xe vm-list params=uuid is-control-domain=false resident-on=${array_host[0]} | cut -c 17-)) 

for vm in {vm_list[@]}; 

do 
    if ((${free_mem[1]} < ${free_mem[2]})); then 

     xe vm-migrate uuid=${vm_list[0]} host-uuid=${array_host[2]} --live 

     echo ${vm_list[0]} has been migrated from xen-node3 to xen-node2 
    else 

     xe vm-migrate uuid=${vm_list[0]} host-uuid=${array_host[1]} --live 

     echo ${vm_list[0]} has been migrated from xen-node3 to xen-node1 
fi 

done 

fi 

答えて

0

使用tmp_min_memorytmp_min_hosttmp_max_memorytmp_max_host一時的な変数:

は、ここに私のコードです。ホストに関するデータを配列に入れ、最初の要素データをtmp_min_memorytmp_min_hosttmp_max_memorytmp_max_hostに入れます。ループスルー配列。使用可能なメモリが少ないホストが見つかったら、tmp_min_memorytmp_min_memoryおよびtmp_min_hostを更新します。同様に、tmp_max_memoryより多くのメモリを持つホストに遭遇するたびに、tmp_max_memorytmp_max_hostを更新してください。最後に、同じ操作を実行します。

+0

ありがとうございました!私がそれをするのは難しいようです。サンプルスクリプトが利用可能であれば素晴らしいことでしょう。ありがとう。 – rmstmg

+0

私はオフィスに戻った時に提供します、心配はありません;)1〜2時間で期待して、あなたは気にしないでください。 – campovski

+0

問題はありません!ありがとう。 :) – rmstmg

0

は、それぞれの順序で6つの配列があるようですhost_name free_mem total_mem load_avg cpu_avg no_vms

配列インデックスを流れる、例は

tmp_min_free_mem=9999999999999 
tmp_max_free_mem=0 

for ((i=0;i<${#host_name[@]};i+=1)); do 

    if ((free_mem[i]<tmp_min_free_mem)); then 

     tmp_min_free_mem=${free_mem[i]} 
     tmp_min_free_mem_host=${host_name[i]} 

    fi 


    if ((free_mem[i]>tmp_max_free_mem)); then 

     tmp_max_free_mem=${free_mem[i]} 
     tmp_max_free_mem_host=${host_name[i]} 

    fi 


done 

echo "$tmp_min_free_mem_host $tmp_min_free_mem" 
echo "$tmp_max_free_mem_host $tmp_max_free_mem" 

EDIT最大と最小の空きメモリとホストを持っている:最初の答えは、最小値と最大値を維持する方法を示していますコメントした後、テーブル全体をソートする

# sort to a file 
for ((i=0;i<${#host_name[@]};i+=1)); do 
    echo "$i,${host_name[i]},${free_mem[i]}" 
done | sort -t, -nk3 > sorted.txt 

# loop read the file to feed new arrays 
new_hosts=() 
new_freemem=() 
while IFS=, read index host freemem; do 
    new_hosts+=("$host") 
    new_freemem+=("$freemem")   
done < sorted.txt 
+0

ありがとうございました。私はちょうど混乱しています、tmp_max_free_mem_host = $ {host_name [i-1]}は2番目の最大メモリを持つホストを返しますか? – rmstmg

+0

ホストminとmaxだけがtmp変数に記憶されているわけではなく、2番目の変数が必要な場合は、新しい変数を追加して正しいifセクションに前の値を記憶してください。 –

+0

ありがとう!いくつかのソートを追加し、既存のコードから2番目のmax_memory_hostを取得できますか?何を持っている[I-1] – rmstmg

関連する問題