如何打印 Ansible playbook 使用的所有变量的实际值?

问题描述 投票:0回答:3

StackOverflow 上的 answer 建议使用

- debug: var=vars
- debug: var=hostvars
打印出 Ansible playbook 使用的所有变量。

使用

var=hostvars
并没有打印出所有变量。但是,当我将以下行添加到我的剧本执行的角色的 main.yml 文件顶部时,我确实打印出了所有变量:

- name: print all variables
  debug:
    var=vars

问题在于,如果打印出来的变量值依赖于其他变量的值,则这些值不会被完全评估。例如,以下是打印出来的部分内容:

"env": "dev", 
"rpm_repo": "project-subproject-rpm-{{env}}",
"index_prefix": "project{{ ('') if (env=='prod') else ('_' + env) }}",
"our_server": "{{ ('0.0.0.0') if (env=='dev') else ('192.168.100.200:9997') }}",

如何让 Ansible 打印出像这样完全评估的变量?

"env": "dev", 
"rpm_repo": "project-subproject-rpm-dev",
"index_prefix": "project_dev",
"our_server": "0.0.0.0",

编辑:

answer
中的 tasks 部分合并到我的剧本文件中并删除
roles
部分后,我的剧本文件如下所示(其中
install-vars.yml
包含一些变量定义):

- hosts: all
  become: true
  vars_files:
    - install-vars.yml
  tasks:
    - debug:
        msg: |-
          {% for k in _my_vars %}
          {{ k }}: {{ lookup('vars', k) }}
          {% endfor %}
      vars:
        _special_vars:
          - ansible_dependent_role_names
          - ansible_play_batch
          - ansible_play_hosts
          - ansible_play_hosts_all
          - ansible_play_name
          - ansible_play_role_names
          - ansible_role_names
          - environment
          - hostvars
          - play_hosts
          - role_names
        _hostvars: "{{ hostvars[inventory_hostname].keys() }}"
        _my_vars: "{{ vars.keys()|
                      difference(_hostvars)|
                      difference(_special_vars)|
                      reject('match', '^_.*$')|
                      list|
                      sort }}"

当我尝试运行剧本时,出现此失败:

shell> ansible-playbook playbook.yml 
SSH password: 
SUDO password[defaults to SSH password]: 

PLAY [all] *********************************************************************

TASK [setup] *******************************************************************
ok: [192.168.100.111]

TASK [debug] *******************************************************************
fatal: [192.168.100.111]: FAILED! => {"failed": true, "msg": "lookup plugin (vars) not found"}
to retry, use: --limit @/usr/local/project-directory/installer-1.0.0.0/playbook.retry

PLAY RECAP *********************************************************************
192.168.100.111             : ok=1    changed=0    unreachable=0    failed=1  
variables ansible
3个回答
10
投票

寻找同一问题的答案,我从此链接找到了以下解决方案:

- name: Display all variables/facts known for a host
  debug:
    var: hostvars[inventory_hostname]
  tags: debug_info

4
投票

下面的最小剧本

shell> cat pb.yml
- hosts: localhost
  gather_facts: false
  vars:
    test_var1: A
    test_var2: "{{ test_var1 }}"
  tasks:
    - debug:
        var: vars

重现您所描述的问题。对于示例

shell> ansible-playbook pb.yml | grep test_var
    test_var1: A
    test_var2: '{{ test_var1 }}'

问:如何打印 Ansible playbook 使用的所有变量的实际值?

A:当你评估变量时,你可以得到变量的实际值。例如,

shell> cat pb.yml
- hosts: localhost
  gather_facts: false
  vars:
    test_var1: A
    test_var2: "{{ test_var1 }}"
  tasks:
    - debug:
        msg: |-
          {% for k in _my_vars %}
          {{ k }}: {{ lookup('vars', k) }}
          {% endfor %}
      vars:
        _special_vars:
          - ansible_dependent_role_names
          - ansible_play_batch
          - ansible_play_hosts
          - ansible_play_hosts_all
          - ansible_play_name
          - ansible_play_role_names
          - ansible_role_names
          - environment
          - hostvars
          - play_hosts
          - role_names
        _hostvars: "{{ hostvars[inventory_hostname].keys() }}"
        _my_vars: "{{ vars.keys()|
                      difference(_hostvars)|
                      difference(_special_vars)|
                      reject('match', '^_.*$')|
                      list|
                      sort }}"

给出评估的剧本的变量

  msg: |-
    test_var1: A
    test_var2: A

0
投票

您可以在命令行输出中获取所有主机变量:

ansible all -m setup -i IP-ADDRESS-HERE,
© www.soinside.com 2019 - 2024. All rights reserved.