我在弄错这个问题上遇到了麻烦。
我收集了vm的事实,并进行了测试调试,为我提供了vm的正确mac地址。但是,当我将查询添加到sed命令时,我得到了额外的字符。
这有效
- name: Get MAC address of VMs to add to eth0 configuration
debug:
msg: "{{ vm_guest_facts.results | json_query(s_query) }}"
vars:
s_query: "[?instance.hw_name == '{{ item }}'].instance.hw_eth0.macaddress"
with_items: "{{ inventory_hostname }}"
输出
ok: [server1] => (item=server1) => {
"msg": [
"00:50:56:80:e0:a1"
]
这失败了
- name: fix network phase 2 - replace template MAC
vars:
s_query: "[?instance.hw_name == '{{ item }}'].instance.hw_eth0.macaddress"
vmware_vm_shell:
hostname: '{{ deploy_vsphere_host }}'
username: '{{ deploy_vsphere_user }}'
password: '{{ deploy_vsphere_password }}'
datacenter: "{{ vsphere_datacenter }}"
validate_certs: no
vm_id: "{{ item }}"
vm_username: xxx
vm_password: xxx
vm_shell: '/bin/sed'
vm_shell_args: " -i.bak 's/^HWADDR.*/HWADDR={{ vm_guest_facts.results | json_query(s_query) }}/' /etc/sysconfig/network-scripts/ifcfg-eth0"
with_items:
- "{{ inventory_hostname }}"
delegate_to: localhost
输出(已剪切)
"vm_id": "server1",
"vm_id_type": "vm_name",
"vm_password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
"vm_shell": "/bin/sed",
"vm_shell_args": " -i.bak 's/^HWADDR.*/HWADDR=[u'00:50:56:80:e0:a1']/' /etc/sysconfig/network-scripts/ifcfg-eth0",
"vm_shell_cwd": null,
"vm_shell_env": null,
"vm_username": "xxx",
"wait_for_process": false
最后一行的mac地址在开头加上了[u,在结尾]了
是否可以解决此问题,或者有人可以通过sed行帮助我,从而在额外的步骤中删除那些多余的字符。
谢谢
凯恩。
答案 0 :(得分:0)
任何with_items
的任务始终具有结果的列表,并且您可以在包含Python 列表的msg:
输出中看到字符[
和]
。因此,vm_guest_facts.results | json_query()
需要附加[0]
或| first
才能将其解析为一个事物
答案 1 :(得分:0)
我放弃了多次尝试[0]的尝试。
这是针对此特定问题的作弊/肮脏修复程序:
" -i.bak 's/^HWADDR.*/HWADDR={{ vm_guest_facts.results | json_query(s_query)| regex_replace(']') | regex_replace('\\[u') }}/' /etc/sysconfig/network-scripts/ifcfg-eth0"