在ansible中从ping输出中获取数据

问题描述

从“shell”模块执行 ping 命令后,我无法从寄存器 var 中提取 ip。

ping.yml

---
- name: "Ping computers"
  shell:
    cmd: "ping -c1 -w 2 {{ pinging_host }}"
  register: pingged_host
  ignore_errors: yes
  with_items:
    - 192.168.1.27
    - 192.168.1.42
  loop_control:
    loop_var: pinging_host

- name: "Result ping"
  debug:
    var: pingged_host

- name: " ***Ip  ping"
  debug:
    var: pingged_host.results.value.pinging_host

...

詹金斯的输出


TASK [ Result ping] **********************

ok: [computer1] => {
    "pingged_host": {
        "changed": true,"Failed": true,"msg": "All items completed","results": [
            {
                "ansible_loop_var": "pinging_host","changed": true,"cmd": "ping -c1 -w 2 192.168.1.27","delta": "0:00:00.003363","end": "2021-02-25 17:08:48.994930","Failed": false,"invocation": {
                    "module_args": {
                        "_raw_params": "ping -c1 -w 2 192.168.1.27","_uses_shell": true,"argv": null,"chdir": null,"creates": null,"executable": null,"removes": null,"stdin": null,"stdin_add_newline": true,"strip_empty_ends": true,"warn": true
                    }
                },"pinging_host": "192.168.1.27","rc": 0,"start": "2021-02-25 17:08:48.991567","stderr": "","stderr_lines": [],"stdout": "PING 192.168.1.27 (192.168.1.27) 56(84) bytes of data.\n64 bytes from 192.168.1.27: icmp_seq=1 ttl=128 time=0.337 ms\n\n--- 192.168.1.27 ping statistics ---\n1 packets transmitted,1 received,0% packet loss,time 0ms\nrtt min/avg/max/mdev = 0.337/0.337/0.337/0.000 ms","stdout_lines": [
                    "PING 192.168.1.27 (192.168.1.27) 56(84) bytes of data.","64 bytes from 192.168.1.27: icmp_seq=1 ttl=128 time=0.337 ms","","--- 192.168.1.27 ping statistics ---","1 packets transmitted,time 0ms","rtt min/avg/max/mdev = 0.337/0.337/0.337/0.000 ms"
                ]
            },{
                "ansible_loop_var": "pinging_host","cmd": "ping -c1 -w 2 192.168.1.42","delta": "0:00:02.003313","end": "2021-02-25 17:08:51.269047","invocation": {
                    "module_args": {
                        "_raw_params": "ping -c1 -w 2 192.168.1.42","msg": "non-zero return code","pinging_host": "192.168.1.42","rc": 1,"start": "2021-02-25 17:08:49.265734","stdout": "PING 192.168.1.42 (192.168.1.42) 56(84) bytes of data.\n\n--- 192.168.1.42 ping statistics ---\n2 packets transmitted,0 received,100% packet loss,time 10ms","stdout_lines": [
                    "PING 192.168.1.42 (192.168.1.42) 56(84) bytes of data.","--- 192.168.1.42 ping statistics ---","2 packets transmitted,time 10ms"
                ]
            }
        ]
    }
}


TASK [ ***Result ping] *******************
ok: [computer1] => {
    "pingged_host.results.value.pinging_host": "VARIABLE IS NOT DEFINED!"
}

注意:“变量未定义!”或“...模板字符串时出现模板错误:预期名称...”,当我放置其他路径时,我得到了这个结果:

  • pingged_host.results.value.pinging_host
  • pingged_host.results.pinging_host
  • pingged_host.results.[pinging_host]
  • pingged_host.results[pinging_host]
  • pingged_host.results['pinging_host']

我如何从我的寄存器 var 中读取“pinging_host”或“rc”???????

谢谢

解决方法

你在 yaml 中的数据结构是这样的

pingged_host:
  results:
    - pinging_host: 192.168.1.27
      rc: 0
    - pinging_host: 192.168.1.42
      rc: 0

由于结果包含一个数组,您必须引用该数组的确切元素。

即获得您应该使用的第一个结果

  - name: " {{ role_name }} | ***Ip  ping"
    debug:
      var: pingged_host.results[0].pinging_host

要获取每个属性,您可以使用 maplist 过滤器,如此处所述 https://ansiblemaster.wordpress.com/2017/02/24/debug-properly-data-registered-with-a-loop/ ,如果您想获取所有 rc,您可以使用以下内容:

  - name: " {{ role_name }} | ***Ip  ping"
    debug:
      msg: "{{  pingged_host.results|map(attribute='rc')|list }}"

导致:

TASK [{{ role_name }} | ***Ip  ping] **********************************************************************************************************************************************
ok: [localhost] => {
    "msg": [
        0,0
    ]
}