使用Ansible时访问stdout_lines

时间:2019-09-18 11:10:00

标签: debugging ansible

鉴于我已经使用var sonarqube_plugins_installed中的shell任务在目录中“注册”了文件,

- name: Debug
  debug:
    var: sonarqube_plugins_installed.results 

例如,我看到

TASK [sonarqube : Debug] ************************************************************************
ok: [sonarqube] => {
    "sonarqube_plugins_installed.results": [
        {
            "ansible_loop_var": "item", 
            "changed": true, 
            "cmd": "ls  /opt/sonarqube/sonarqube-6.7/extensions/plugins/sonar-build-breaker-plugin-*.jar", 
            "delta": "0:00:00.003748", 
            "end": "2019-09-18 04:04:54.355667", 
            "failed": false, 
            "invocation": {
                "module_args": {
                    "_raw_params": "ls  /opt/sonarqube/sonarqube-6.7/extensions/plugins/sonar-build-breaker-plugin-*.jar", 
                    "_uses_shell": true, 
                    "argv": null, 
                    "chdir": null, 
                    "creates": null, 
                    "executable": null, 
                    "removes": null, 
                    "stdin": null, 
                    "stdin_add_newline": true, 
                    "strip_empty_ends": true, 
                    "warn": true
                }
            }, 
            "item": "build_breaker", 
            "rc": 0, 
            "start": "2019-09-18 04:04:54.351919", 
            "stderr": "", 
            "stderr_lines": [], 
            "stdout": "/opt/sonarqube/sonarqube-6.7/extensions/plugins/sonar-build-breaker-plugin-2.2.jar", 
            "stdout_lines": [
                "/opt/sonarqube/sonarqube-6.7/extensions/plugins/sonar-build-breaker-plugin-2.2.jar"
            ]
        }
    ]
}

如何在另一个任务中访问例如stdout?在另一个任务中,我想使用results处理with_items中的每个项目并输出stdout

这怎么办?

1 个答案:

答案 0 :(得分:0)

以下应该是一个好的开始:

- name: show stdout for each result
  debug:
    var: item.stdout
  loop: "{{ sonarqube_plugins_installed.results }}"

正如您所猜测的,这正在遍历results列表中的每个元素。

如果要一次打印所有行,另一种方法是通过json_query处理数据结构,并使用相关的jmespath表达式以仅提取所需的信息

- name: show sdtout list for all results
  debug:
    msg: "{{ sonarqube_plugins_installed | json_query('results[].stdout[]') }}"

您还可以将两者结合起来,并仅在简单的stdout列表上循环

- name: show stdout for each result
  debug:
    var: item
  loop: "{{ sonarqube_plugins_installed | json_query('results[].stdout[]') }}"

您还可以使用map过滤器提取所需的属性:

- name: show stdout list of all results
  debug:
    msg: "{{ sonarqube_plugins_installed.results | map(attribute='stdout') | list }}"

还有其他可以使用的解决方案,我相信您可以在specific ansible filtersgeneral jinja2 filters文档中找到