Ansible - 复杂的循环与条件和寄存器标准输出
我有一个基于解析的参数创建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中动态地执行它。
你是对的,你只会有两个任务。第一个将获得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 }}"
如果您在本地主机上执行命令和搜索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很少在本地主机上,因为插件是在本地执行的。