问题描述
我正在尝试在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 }}"