我正在处理一个只需要收集一个事实的角色。
表现令人担忧,我知道收集事实非常耗时。
我正在寻找一种方法来过滤剧本中的gather_facts
,这样我就可以只收集所需的事实。
使用安装核心模块可以实现:
ansible -m setup -a 'filter=ansible_hostname' my_host
10.200.0.127 | success >> {
"ansible_facts": {
"ansible_hostname": "my_host"
},
"changed": false
}
可以在剧本中使用此功能吗?像这样的东西?
- hosts: all
sudo: yes
gather_facts: True
filter: "filter=ansible_*"
PS: 上面的代码会引发语法异常。
编辑1 :如果有人需要获取主机名,那么另外一个有用的变量inventory_hostname。
答案 0 :(得分:21)
是的,这是可能的,但不是收集事实的默认行为。将gather_facts
设置为true
只需将setup module称为该剧的首要任务。这样您就无法参数化setup
模块调用。
但您可以使用filter参数禁用默认行为并自行调用设置。
- 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
答案 1 :(得分:8)
在向设置模块提出问题并回答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
答案 2 :(得分:5)
剧本顶部的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
答案 3 :(得分:2)
如果您感兴趣的是每个主机的主机名,那么只需执行此类操作就可以满足您的需求:
- hosts: all
gather_facts: false
tasks:
- name: Get hostname
command: /bin/hostname
register: my_hostname
- debug: var=my_hostname
如果您感兴趣的是其他事实,那么只需指定适当的命令,并通过注册变量引用该事实。