使用 Ansible 进行非常详细的库存选择

使用 Ansible 进行非常详细的库存选择

我正在现有系统上设计一个新的 ansible 实现。现有系统是一个大型硬件测试平台。我需要能够执行以下操作:

run task xyz on all version 3 hosts that are using a Broadcom BCM57412 network controller.

或者

run task xyz on all hosts in group QA2 that have firmware version 3 and HGST hard drives

我一直在使用 Ansible 阅读库存功能,由于它似乎没有条件库存选择,因此我假设我需要使用外部库存数据库。

我对么?

答案1

一般来说,任务应该至少根据适用的系统事实完成部分自己的选择。

例如,您可以编写一个适用于特定型号的硬盘的任务:

name: Upgrade firmware on HGST HUH728080AL5200 drive
command: /usr/bin/whatever arguments ...
when: ansible_devices['sda']['model'] == 'HGST HUH728080AL5200'

这不一定需要库存选择,因为它只会在具有命名模型驱动器(作为 sda;循环遍历已安装的驱动器留给读者练习)的主机上运行。

答案2

Ansible 可以收集有关您的系统的事实。使用“setup”模块。直接作为任务运行,或通过“gather_facts: yes”播放关键字运行。

如果您配置事实缓存并将收集设置为显式,然后创建涵盖您想要查询的所有信息变化的事实,那么您应该能够通过构建动态组根据缓存的事实运行播放。

ansible.cfg

[defaults]
fact_caching = jsonfile
fact_caching_connection = data/fact_cache
fact_caching_timeout = 86400
gathering = explicit

我们可以演一出这样的戏

- hosts: all
  tasks:
  # simple example, you could use any facts you have
  # make your filter as complex as you want.
  - name: construct a group of systems based on facts
    group_by:
      key: filtered_systems
    when: ansible_distribution is defined and ansible_distribution == 'Debian' and
          ansible_architecture is defined and ansible_architecture == 'x86_64'

  - name: report the systems
    debug:
      var: groups['filtered_systems']
      verbosity: 1
    run_once: true

- hosts: filtered_systems
  tasks:
  - name: simple ping of the systems
    ping:

相关内容