如何过滤剧本中收集的事实?

How to filter gathering facts inside a playbook?

我正在扮演一个只需要收集一个事实的角色。

性能是一个问题,我知道收集事实很耗时。

我正在寻找某种方法来过滤 gather_facts 剧本中的内容,这将使我能够仅收集所需的事实。

这可以使用设置核心模块:

ansible -m setup -a 'filter=ansible_hostname' my_host

10.200.0.127 | success >> {
    "ansible_facts": {
        "ansible_hostname": "my_host"
    },
    "changed": false
}

可以在 playbook 中使用这个功能吗?是这样的吗?

- hosts: all
  sudo: yes
  gather_facts: True
    filter: "filter=ansible_*"

PS: 上面的代码抛出语法异常。

编辑 1:如果有人需要获取主机名,还有另一个有用的变量 inventory_hostname.

如果您只对每个主机的主机名感兴趣,那么只需执行类似这样的操作就可以满足您的需要:

- hosts: all
  gather_facts: false
  tasks:

    - name: Get hostname
      command: /bin/hostname
      register: my_hostname

    - debug: var=my_hostname

如果您对其他一些事实感兴趣,那么只需指定适当的命令,并通过已注册的变量引用该事实。

是的,这是可能的,但不是收集事实的默认行为。将 gather_facts 设置为 true 后,只需调用 setup module 作为游戏的第一个任务。这样你就没有任何方法来参数化 setup 模块调用。

但是您可以禁用默认行为并使用过滤器参数自行调用设置。

- hosts: all
  sudo: yes
  gather_facts: False
  tasks:
   - setup:
       filter: ansible_*

由于您正在处理一个角色并且可能不想在您的角色中进行此设置调用,您可以使用 pre_tasks.

- hosts: all
  sudo: yes
  gather_facts: False
  pre_tasks:
   - setup:
       filter: ansible_*
  roles:
   - your_role_here

在提出并回答了这个问题后,Ansible 2.1 added the gather_subset option 到设置模块,因此现在可以使用文档中描述的 !facter,!ohai,network 语法而不是正则表达式过滤器:

- hosts: all
  sudo: yes
  gather_facts: False
  pre_tasks:
   - setup:
       gather_subset: !facter,!ohai,network
  roles:
   - your_role_here

剧本顶部的 Ansible 方式(附加方式):

----
- hosts: web
  gather_facts: True
  gather_subset:
    - network
    - virtual

调试变量:

  - name: Print some debug information 
    vars: 
      msg: |
          Module Variables ("vars"):
          --------------------------------
          {{ vars | to_nice_json }} 

          Environment Variables ("environment"):
          --------------------------------
          {{ environment | to_nice_json }} 

          GROUP NAMES Variables ("group_names"):
          --------------------------------
          {{ group_names | to_nice_json }}

          GROUPS Variables ("groups"):
          --------------------------------
          {{ groups | to_nice_json }}

          HOST Variables ("hostvars"):
          --------------------------------
          {{ hostvars | to_nice_json }} 

    debug: 
      msg: "{{ msg.split('\n') }}"       
    tags: debug_info