从输出中提取值并发送到下一个任务

问题描述

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

当我运行此Ansible任务

C:\\full\\path\\config.js

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

我尝试使用- name: Find active controller shell: '/bin/zookeeper-shell 192.168.129.227 get /controller' register: resultAC ,但这不起作用。

resultAC.stdout_lines[5].brokerid的结构:

resultAC

解决方法

由于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 match stdout_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,\"timestamp\":\"1597241391146\"}"
      
  tasks:
    - debug: 
        msg: "{{ (resultAC.stdout_lines | select('match','{.*\"brokerid\":.*}') | first | from_json).brokerid }}"

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...