2017-09-18 54 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很少在本地主机上,因为插件是在本地执行的。