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

标签 ansible task data-extraction ansible-tower

我正在尝试在 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/

相关文章:

ansible - 一本剧本会调用很多剧本吗?

python - 如何捕获一系列 Celery 任务执行过程中产生的所有 python 日志记录?

Android 重复任务不起作用

java - 为什么使用 Jsoup 解析网站时的 HTML 代码与使用浏览器解析网站时不同

java - 在 Java 中检索数据

Ruby - 在控制台上显示反引号输出

ansible - 按空格分割字符串,然后在 ansible/jinja2 中再次加入

operating-system - Ansible 可以用于通过网络启动将操作系统配置为裸机启动吗?

c# - 将任务实例传递给任务的委托(delegate)

Python + 散点图 + 其他废话