Ansible:仅打印用户定义的变量

时间:2020-10-02 11:00:47

标签: ansible

如何打印仅在group_varshost_vars处声明且没有明显事实的变量?

这样的代码很好:

- name: "Ansible | List all known variables and facts"
  debug:
    var: hostvars[inventory_hostname]

但是我不需要主机IP,磁盘等

我的意思是在继续执行Play之前再检查一次我的所有变量。

1 个答案:

答案 0 :(得分:1)

有3类变量:ansible factsspecial variables和用户变量。从hostvars中删除明显的事实和特殊变量,剩下的就是用户的变量。可疑事实的列表在变量 ansible_facts 中可用。我想必须创建特殊变量的列表。

创建特殊变量列表

如果您在下面运行该剧本,则会看到特殊变量和用户变量的列表

- hosts: localhost
  tasks:
    - debug:
        msg: "{{ hostvars[inventory_hostname]|
                 difference(ansible_facts) }}"

消除用户的var,并将特殊变量列表放入文件中。例如

shell> cat special_vars.yml
special_vars:
  - ansible_python_interpreter
  - ansible_connection
  - inventory_hostname
    ...

此特殊变量列表可能不完整,仅用于此主机。

从hostvars中删除不可理解的事实和特殊变量

- hosts: localhost
  vars_files:
    - special_vars.yml
  tasks:
    - set_fact:
        user_var1: AAA
    - debug:
        msg: "{{ hostvars[inventory_hostname]|
                 difference(ansible_facts)
                 difference(special_vars) }}"

仅提供用户变量列表

  msg:
  - user_var1

用户变量还将包括用户设置的配置变量(例如connection variables:ansible_user或priviledge escalation:ansible_become)。


名称空间

更好的做法是“命名空间”变量。例如

- hosts: localhost
  vars:
    prj51_var1: AAA
    prj51_var2: BBB
  tasks:
    - debug:
        msg: "{{ item }}: {{ query('vars', item)|first }}"
      loop: "{{ query('varnames', 'prj51_.+$') }}"

给予

  msg: 'prj51_var1: AAA'
  msg: 'prj51_var2: BBB'