如何使用 ad-hoc 命令过滤
nocache
块或 free
块?我尝试了ansible centos1 -m setup -a 'filter=ansible_memory_mb.nocache'
,但没有过滤掉它。
ansible centos1 -m setup -a 'filter=ansible_memory_mb'
centos1 | SUCCESS => {
"ansible_facts": {
"ansible_memory_mb": {
"nocache": {
"free": 11808,
"used": 926
},
"real": {
"free": 10686,
"total": 12734,
"used": 2048
},
"swap": {
"cached": 0,
"free": 4096,
"total": 4096,
"used": 0
}
},
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false
}
如果你想尝试使用ansible命令,你必须与grep和head混合使用:
ansible centos -m setup -a 'filter=ansible_memory_mb' | grep -Eo [0-9]+ | head -1
但是你应该使用 playbook:var 结果将包含所需的值。
- name: test
hosts: centos1
tasks:
- name: set vars
set_fact: result="{{ ansible_memory_mb.nocache.free}}"
- name: show
debug:
var: result
结果:
TASK [show] ***********************************************************************************************************************************************************************
ok: [localhost] => {
"result": "712"
}
几个月前也有同样的问题,但答案是如果你需要访问特定的内部块,你需要使用 Ansible Playbook,不幸的是你不能使用临时命令来做到这一点。例如,在本地主机的日期时间中:
ansible -m setup localhost -a 'filter=ansible_date_time'
将返回很多具体信息,如秒、年、分等。如果您只想返回“2021-10-16”等格式日期,则需要使用剧本。这里有一些特定的剧本来创建具有特定日期格式的文件夹:
tasks:
- name: Collect Year, Month and Day.
setup:
filter: "ansible_date_time"
gather_subset: "!all"
- name: Put today's date in a variable.
set_fact:
DTG: "{{ ansible_date_time.date }}"
- name: Create directory with the following path C:\bkp_"year-month-day"\Switches\
file:
path: /mnt/c/bkp_{{ hostvars.localhost.DTG }}/Switches/
state: directory
我不知道如果没有经过操作的脚本它是否可用。要快速解决方案,您可以运行以下临时命令
ansible centos -m setup -a 'filter=ansible_memtotal_mb'
ansible centos -m setup -a 'filter=ansible_memfree_mb'
引用文档:
此模块由 playbook 自动调用,以收集有关可在 playbook 中使用的远程主机的有用变量。也可以直接由
执行来检查主机可以使用哪些变量。/usr/bin/ansible
subset
、filter
等不同参数限制从主机收集的信息。这些数据存储在 ansible_facts
字典中。
而且,最重要的是:
过滤器选项仅过滤 ansible_facts 下面的第一级子项
尽管如此,当
setup
模块从剧本运行时(或作为 gather_facts: true
),我们可以访问事实及其子项/元素,因为它 可用作变量。
一个非常简单的剧本就可以实现你想要的。示例:
# play.yml
- hosts: "{{ my_hosts }}"
gather_facts: false
tasks:
- name: filter memory facts
setup:
filter: ansible_memory_mb
# note that an intermediate set_fact task is not required as such
- name: show memory nocache values
debug:
var: ansible_memory_mb.nocache
然后运行它而不是临时命令(在
centos1
上):
ansible-playbook play.yml -e "my_hosts=centos1" -i <inventory-path>