Ansible vmware_vm_shell SED命令添加了额外的字符

时间:2019-05-01 17:04:03

标签: shell sed ansible virtual-machine vmware

我在弄错这个问题上遇到了麻烦。

我收集了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行帮助我,从而在额外的步骤中删除那些多余的字符。

谢谢

凯恩。

2 个答案:

答案 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"