我正在尝试在 Ansible Tower 中定义一个模板,我想在其中提取 Kafka Broker 中事件 Controller 的 ID,然后在另一个模板/任务中使用此值,该值将执行滚动重启但将确保事件 Controller 已启动最后的
当我运行这个 Ansible 任务时
- name: Find active controller
shell: '/bin/zookeeper-shell 192.168.129.227 get /controller'
register: resultAC
我得到以下结果。我想提取 经纪人并将值 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
}
最佳答案
因为您的 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,\"brokerid\":2,\"timestamp\":\"1597241391146\"}"
tasks:
- debug:
msg: "{{ (resultAC.stdout_lines | select('match','{.*\"brokerid\":.*}') | first | from_json).brokerid }}"
关于ansible - 从输出中提取值并发送到下一个任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63492767/