Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从ansible中的stdout.line中提取输出_Ansible_Mikrotik_Ansible Template - Fatal编程技术网

如何从ansible中的stdout.line中提取输出

如何从ansible中的stdout.line中提取输出,ansible,mikrotik,ansible-template,Ansible,Mikrotik,Ansible Template,输出: --- - name: Mikrotik info hosts: mikrotik connection: network_cli remote_user: root gather_facts: false tasks: - name: show info routeros_command: commands: /system routerboard print register: rb_info - name: Debug inf

输出:

---
- name: Mikrotik info
  hosts: mikrotik
  connection: network_cli
  remote_user: root
  gather_facts: false
  tasks:
  - name: show info
    routeros_command:
     commands: /system routerboard print
    register: rb_info

  - name: Debug info
    debug:
      msg: "{{ rb_info.stdout_lines }}"
我需要过滤“升级固件”字符串,并获得如下输出:

 routerboard: yes
             model: 751G-2HnD
     serial-number: 3A6502B2A2E7
     firmware-type: ar7240
  factory-firmware: 3.0
  current-firmware: 6.42.3
  upgrade-firmware: 6.43.4
我应该用正则表达式替换吗?或者我可以用grep之类的

任何想法都非常感谢

谢谢

(更新)

使用from_yaml并合并词典。比如说

-设置事实:
minfo:{{minfo | default({})| combine(item | from_yaml)}
循环:“{rb_info.stdout_line}”
-调试:
变量:minfo['upgrade-firmware']
给予

minfo['upgrade-firmware']:6.43.4

(备案)

  • 健壮的解决方案是将数据写入模板并包含变量。下面的任务
  • -临时文件:
    寄存器:tempfile
    -模板:
    src:minfo.j2
    dest:{{tempfile.path}}
    -包括以下变量:
    文件:“{tempfile.path}”
    姓名:明福
    -调试:
    var:minfo
    
    使用模板

    shell>cat minfo.j2
    {rb_info.stdout_行%中项目的%
    {{item}}
    {%endfor%}
    
    应该给

    “minfo”:{
    “当前固件”:“6.42.3”,
    “工厂固件”:3.0,
    “固件类型”:“ar7240”,
    “型号”:“751G-2HnD”,
    “线路板”:没错,
    “序列号”:“3A6502B2A2E7”,
    “升级固件”:“6.43.4”
    }
    
  • 下面的任务创建可变升级\u固件
  • -设置事实:
    升级固件:“{item.split(':').1 | trim}”
    循环:{rb_info.stdout_line | map('quote')| map('trim')| list}}
    何时:项目为搜索(“^upgrade firmware”)
    -调试:
    var:升级固件
    
  • 可以将所有参数放入字典中
  • -设置事实:
    minfo:{{minfo}默认值({})|
    组合({item.split(':').0:item.split(':').1 | trim}})
    循环:{rb_info.stdout_line | map('quote')| map('trim')| list}}
    -调试:
    变量:minfo['upgrade-firmware']
    
    谢谢!但是我遇到了一个错误
    致命:[10.1.1.1]:失败!=>{“msg”:“条件检查”项为搜索(“^upgrade firmware”)”失败。错误为:({%if项为搜索(“^upgrade firmware”)%}真{%else%}假{%endif%})上发生意外的模板类型错误:应为字符串或缓冲区\n\n错误出现在“/home/user/scripts/mikrotik.update/mikrotik info.yml”:第12行第5列,但可能\n出现在文件的其他位置,具体取决于语法问题。\n\n错误行可能是:\n\n register:rb\u info\n-set\u fact:\n^ here\n“}
    Try
    item\124; quote is search(“^upgrade firmware”)
    。您必须对其进行测试。抱歉,我没有rb_信息。是的,我已更改。现在输出为:
    任务[设置事实]*跳过:[10.1.1.1]=>(项=[u'RouteBoard:yes',u'model:750',u'serial number:3B0202EEEFB4',u'firmware type:ar7240',u'factory firmware:2.38',u'current firmware:3.19',u'upgrade firmware:6.43.4'])任务[debug]*******************************************************************************************确定:[10.1.1.1=>{“升级固件”:“未定义变量”]
    我应该在另一个剧本中定义变量?是否可以隐藏“任务[设置事实]部分?问题是字符串开头有多余的空间。添加过滤器
    映射('trim')
    。请参阅更新的答案。
    upgrade-firmware: 6.43.4