【问题标题】:Extract value from output and send to next task从输出中提取值并发送到下一个任务
【发布时间】:2020-08-19 18:14:38
【问题描述】:

我正在尝试在 Ansible Tower 中定义一个模板,我想在其中提取 Kafka Broker 中活动控制器的 id,然后在另一个模板/任务中使用该值,该模板/任务将执行滚动重启,但将确保活动控制器最后启动

当我运行这个 Ansible 任务时

- name: Find active controller
  shell: '/bin/zookeeper-shell 192.168.129.227 get /controller'
  register: resultAC

我得到以下结果。我想提取 brokerid 并将值 2 分配给一个变量,该变量可以在同一模板中的不同任务中使用,或者当模板是工作流定义的一部分时将其传递给另一个模板。

我尝试使用resultAC.stdout_lines[5].brokerid,但这不起作用。

resultAC的结构:

{
    "resultAC": {
        "stderr_lines": [],
        "changed": true,
        "end": "2020-08-19 07:36:01.950347",
        "stdout": "Connecting to 192.168.129.227\n\nWATCHER::\n\nWatchedEvent state:SyncConnected type:None path:null\n{\"version\":1,\"brokerid\":2,\"timestamp\":\"1597241391146\"}",
        "cmd": "/bin/zookeeper-shell 192.168.129.227 get /controller",
        "failed": false,
        "delta": "0:00:02.843972",
        "stderr": "",
        "rc": 0,
        "stdout_lines": [
            "Connecting to 192.168.129.227",
            "",
            "WATCHER::",
            "",
            "WatchedEvent state:SyncConnected type:None path:null",
            "{\"version\":1,\"brokerid\":2,\"timestamp\":\"1597241391146\"}"
        ],
        "start": "2020-08-19 07:35:59.106375"
    },
    "_ansible_verbose_always": true,
    "_ansible_no_log": false,
    "changed": false
}

【问题讨论】:

    标签: ansible task data-extraction ansible-tower


    【解决方案1】:

    因为您的 JSON 只是字符串列表的一部分,所以它不会被解析或视为 JSON。
    您必须使用 Ansible 过滤器 from_json 才能将其解析回字典。

    鉴于剧本:

    - hosts: all
      gather_facts: no
      vars: 
        resultAC:
          stdout_lines: 
            - "Connecting to 192.168.129.227"
            - ""
            - "WATCHER::"
            - ""
            - "WatchedEvent state:SyncConnected type:None path:null"
            - "{\"version\":1,\"brokerid\":2,\"timestamp\":\"1597241391146\"}"
          
      tasks:
        - debug: 
            msg: "{{ (resultAC.stdout_lines[5] | from_json).brokerid }}"
    

    这给出了回顾:

    PLAY [all] *************************************************************************************************************************************************************
    
    TASK [debug] ***********************************************************************************************************************************************************
    ok: [localhost] => {
        "msg": "2"
    }
    
    PLAY RECAP *************************************************************************************************************************************************************
    localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
    

    再进一步,也许我会select and matchstdout_lines 列表中的 JSON,以防万一它并不总是在第六行:

    - hosts: all
      gather_facts: no
      vars: 
        resultAC:
          stdout_lines: 
            - "Connecting to 192.168.129.227"
            - ""
            - "WATCHER::"
            - ""
            - "WatchedEvent state:SyncConnected type:None path:null"
            - "{\"version\":1,\"brokerid\":2,\"timestamp\":\"1597241391146\"}"
          
      tasks:
        - debug: 
            msg: "{{ (resultAC.stdout_lines | select('match','{.*\"brokerid\":.*}') | first | from_json).brokerid }}"
    

    【讨论】:

    • 谢谢。我会尽快尝试的。如何将此值用作另一个任务中的变量或将其传递给工作流中的模板?
    • 这行得通。如何将其分配给变量并稍后使用?谢谢
    猜你喜欢
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 2019-09-11
    • 2019-05-19
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 2021-07-01
    相关资源
    最近更新 更多