使用 ad-hoc 命令的 Ansible 过滤器

问题描述 投票:0回答:4

如何使用 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
4个回答
1
投票

如果你想尝试使用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"
}

1
投票

几个月前也有同样的问题,但答案是如果你需要访问特定的内部块,你需要使用 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

0
投票

我不知道如果没有经过操作的脚本它是否可用。要快速解决方案,您可以运行以下临时命令

ansible centos -m setup -a 'filter=ansible_memtotal_mb'
ansible centos -m setup -a 'filter=ansible_memfree_mb'

0
投票

引用文档

此模块由 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>
© www.soinside.com 2019 - 2024. All rights reserved.