如何过滤剧本中收集的事实?
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
我正在扮演一个只需要收集一个事实的角色。
性能是一个问题,我知道收集事实很耗时。
我正在寻找某种方法来过滤 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