代码之家  ›  专栏  ›  技术社区  ›  anish anil

如何从ansible中的stdout.lines中提取准确的输出

  •  0
  • anish anil  · 技术社区  · 6 年前

    我的责任剧本:

    #Tag --> B.6 -->
      - name: Change the Security Realm to CustomRealm from ManagementRealm
    command: /jboss-as-7.1.1.Final/bin/jboss-cli.sh --connect--command="/core-service=management/management-interface=http-interface:read-attribute(name=security-realm)"
    register: Realm
    
      - debug:
      msg: "{{ Realm.stdout_lines }}"
    

    消息中上述命令的输出如下:

    ok: [342f2f7bed8e] => {
    "msg": [
    "{",
    "    \"outcome\" => \"success\","
    "    \"result\" => \"ManagementRealm\"",
    "}"
    ]
    }
    

    有没有一种方法可以精确地“result”=>“managementrealm”。 我试着用

    Realm.stdout_lines.find('result')
    

    但这失败了,awk&grep命令在这里似乎不起作用。

    任何想法都是非常感激的。

    谢谢你

    1 回复  |  直到 6 年前
        1
  •  1
  •   clockworknet    6 年前

    我想有几种方法可以解决这个问题。

    1)在输出变为可接受之前,将输出变为可接受的:

    # Note the change of 'command' to 'shell'
    - name: Change the Security Realm to CustomRealm from ManagementRealm
      shell: /jboss-as-7.1.1.Final/bin/jboss-cli.sh --connect--command="/core-service=management/management-interface=http-interface:read-attribute(name=security-realm)" | grep -o 'result.*'
      register: Realm
    

    2)如果源脚本的输出始终为4行,则只需获取第3行:

    # List indexes start at 0
    - debug:
      msg: "{{ Realm.stdout_lines[2] | regex_replace('^ *(.*$)', '\\1') }}"
    

    3)如果您可以选择修改jboss-cli.sh,最好的方法是让jboss-cli.sh输出有效的json,然后由ansible解析:

    # Assuming jboss-cli.sh produces {"outcome": "success", "result": "ManagementRealm"}
    - set_fact:
        jboss_data: "{{ Realm.stdout | from_json }}"
    - debug:
        var: jboss_data.result