如何让 Ansible 只打印有 stdout 的任务

Mee*_*han 6 ansible

我有一本包含多个任务的剧本。我需要 Ansible 只打印包含 STDOUT /debug 任务的任务

- hosts: "{{ v_host }}"
gather_facts: no
tasks:

- name: "Create /tmp in target in all VM's "
  file:
    path: /tmp
    state: directory
    owner: oracle
    group: oinstall
    mode: 0775

- copy:
    src: /xxx
    dest: /yyy
    owner: oracle
    group: oinstall
    force: yes
    mode: 0755

- name:  "Performing {{ patch_action }} of CPU patch on {{ v_host }} "
  shell: |
    cd /tmp
    sudo -u oracle ./patch.sh
  register: out
  
- debug: var=out.stdout_lines
Run Code Online (Sandbox Code Playgroud)

我执行不带 -v 选项的剧本以获得更清晰的输出。输出如下所示。

ansible-playbook test.yml --extra-vars v_host=xyz.com.
    
TASK [Create /tmp in target in all VM's] ********************************************************************
ok: [ixyz.com]

TASK [copy] ********************************************************************
ok: [xyz.com]

TASK [Performing  of CPU patch on xyz.com] ***
changed: [xyz.com]

TASK [debug] *******************************************************************
ok: [xyz.com] => {
    "out.stdout_lines": [
        "Patch  123456     : applied on Tue Sep 29 10:11:58 GMT 2020", 
        "Patch description:  \"one-off\"", 
        "Patch  987654     : applied on Tue Sep 29 10:08:39 GMT 2020", 
        "Patch description:  \"One-off\"", 

    ]
}
Run Code Online (Sandbox Code Playgroud)

当我执行剧本时,是否有一个选项,它只为我提供 stdout/debug 的输出。我需要的唯一输出是

TASK [debug] *******************************************************************
ok: [xyz.com] => {
    "out.stdout_lines": [
        "Patch  123456     : applied on Tue Sep 29 10:11:58 GMT 2020", 
        "Patch description:  \"one-off\"", 
        "Patch  987654     : applied on Tue Sep 29 10:08:39 GMT 2020", 
        "Patch description:  \"One-off\"", 

    ]
}
Run Code Online (Sandbox Code Playgroud)

Vla*_*tka 5

可以使用回调actionable仅选择已更改的任务。请参阅“ansible-doc -t 回调可操作”

“当您不关心“确定”或“已跳过”时,请使用此回调。此回调会抑制任何非“失败”或“已更改”状态。”

例如,下面的剧本

shell> cat pb.yml
- hosts: localhost
  tasks:
    - stat:
        path: /etc/passwd
      register: result
    - debug:
        var: result.stat.mode
    - debug:
        msg: test message
      changed_when: actionable|default(false)|bool
Run Code Online (Sandbox Code Playgroud)

给出

shell> ansible-playbook pb.yml

PLAY [localhost] ****

TASK [stat] ****
ok: [localhost]

TASK [debug] ****
ok: [localhost] => {
    "result.stat.mode": "0644"
}

TASK [debug] ****
ok: [localhost] => {
    "msg": "test message"
}

PLAY RECAP ****
localhost: ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Run Code Online (Sandbox Code Playgroud)

可操作的回调将抑制输出。例如

shell> ANSIBLE_STDOUT_CALLBACK=actionable ansible-playbook pb.yml

PLAY [localhost] ****

PLAY RECAP ****
localhost: ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Run Code Online (Sandbox Code Playgroud)

您可以通过控制所选任务的更改状态来启用其输出。例如

shell> ANSIBLE_STDOUT_CALLBACK=actionable ansible-playbook pb.yml -e "actionable=true"

PLAY [localhost] ****

TASK [debug] ****
changed: [localhost] => {
    "msg": "test message"
}

PLAY RECAP ****
localhost: ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Run Code Online (Sandbox Code Playgroud)

问:如何使用‘默认’而不是‘可操作’来执行我的剧本?

A:下面的命令给出相同的结果

shell> ANSIBLE_STDOUT_CALLBACK=default ANSIBLE_DISPLAY_SKIPPED_HOSTS=false ANSIBLE_DISPLAY_OK_HOSTS=false  ansible-playbook pb.yml -e "actionable=true"
Run Code Online (Sandbox Code Playgroud)

  • 不客气。它已被弃用。你说得对。为了简单起见,我仍然保留它。在配置文件或环境中配置回调。我添加了一个如何配置环境的示例。 (2认同)
  • “选择性”回调看起来很有希望。请参阅“ansible-doc -t 选择性回调”。不幸的是,atm 格式无法正常工作。 (2认同)