2017-09-18 55 views
0

我有一個基於解析的參數創建libvirt guest的ansible playbook。我試圖用一個額外的參數來擴展劇本,這將允許我將guest虛擬機操作系統附加到specidied虛擬網絡並分配寫入文件的自定義mac地址。Ansible - 複雜的循環與條件和寄存器標準輸出

的劇本應該被調用是這樣的:

ansible-playbook -e "CPU=2 MEMORY=1024 VM_STORAGE=/tmp/zz VM_NAME=desktop5 VM_NETWORK=bridge,Isolated2" vm.yml

的最後一個步驟之一,我不得不創建網卡,並使用這些定義在一個文件中的格式如下特定MAC地址:

#NAT#52:54:00:aa:aa:01#desktop1 
#bridge#52:54:00:aa:bb:01#desktop1 
#Isolated1#52:54:00:aa:cc:01#desktop1 
#Isolated2#52:54:00:aa:dd:01#desktop1 

如何根據指定的額外參數-e VM_NETWORK使用恰當的劇本功能來連接網絡接口,並確定MAC地址。

到目前爲止,我想出了以下內容:

- name: Setting up network 
    shell: "/bin/grep -e {{ vm_name }} {{ mac_file }} | grep -e {{ item }} | awk -F\"#\" '{print $3}'" 
    register: vm_mac 
    command: "/usr/bin/virsh attach-interface --domain {{ vm_name }} --type bridge --source 'bridge0' --model virtio --mac {{ vm_mac }} --config" 
    when: item == "bridge" 
    with_items: 
    - "{{ VM_NETWORK.split(',') }}" 

,但問題是我不能有指揮和外殼動作一個任務? 我應該通過調用一個shell腳本來獲取mac地址,然後在命令中使用它嗎?

目前我有一個bash腳本執行virsh命令以附加或分離接口,但我想知道是否有辦法在ansible中動態地執行它。

回答

0

你是對的,你只會有兩個任務。第一個將獲得MAC並註冊變量vm_mac,而第二個將變量使用

對於它的價值,你shell任務可以大大簡化,到底事情,所以也許看起來像:

- name: Get MAC 
    command: > 
    awk -F# -vvm_name="{{ vm_name }}" -vvm_network="{{ item }}" 
    '$4 == vm_name && $2 == vm_network {print $3}' "{{ mac_file }}" 
    register: vm_macs 
    with_items: "{{ vm_networks.split(',') }}" 

對於每一個網絡,這將打印出與虛擬機名稱相關聯的MAC地址。在vm_macs變量的內容將包括vm_macs.results關鍵結果列表,這個列表中的每個元素將包括在item關鍵的網絡名稱和stdout關鍵的MAC地址:

"vm_macs.results": [ 
    { 
     "item": "bridge", 
     "stdout": "52:54:00:aa:bb:01", 
    }, 
    { 
     "item": "Isolated2", 
     "stdout": "52:54:00:aa:dd:01", 
    } 
] 

有一個那裏還有其他一些東西,但這是我們關心的。

然後,您可以使用,在後續的任務是這樣的:

- name: attach interface 
    command: > 
    virsh attach-interface 
    --domain {{ vm_name }} 
    --type bridge 
    --source bridge0 
    --model virtio 
    --mac {{ item.stdout }} 
    --config 
    when: item.item == "bridge" 
    with_items: "{{ vm_macs.results }}" 
0

如果您在本地主機上執行命令和搜索mac_file,您可以使用pipe查找(見more lookups章):

- name: Setting up network 
    command: > 
      /usr/bin/virsh 
      attach-interface 
      --domain {{ vm_name }} 
      --type bridge 
      --source 'bridge0' 
      --model virtio 
      --mac {{ vm_mac }} 
      --config 
    vars: 
    vm_mac: "{{ lookup('pipe', grep_cmd) }}" 
    grep_cmd: "/bin/grep -e {{ vm_name }} {{ mac_file }} | grep -e {{ item }} | awk -F\"#\" '{print $3}'" 
    when: item == "bridge" 
    with_items: "{{ VM_NETWORK.split(',') }}" 

注:我沒有測試這個確切的grep_cmd

這將工作o很少在本地主機上,因爲插件是在本地執行的。