我正在准备一个剧本来从 vmware 中查找新扫描的 HDD,我使用以下过滤来获取 HDD 的数量:
before_add: "{{ hostvars[inventory_hostname].ansible_devices.keys() | select('string') | list }}"
输出- ['sr0'、'sda'、'sdb'、'sdc'、'dm-2'、'dm-3'、'dm-0'、'dm-1']
然后使用 vmware_guest_disk 模块添加新的硬盘,然后我执行设置模块来获取最新的磁盘数量
after_add: "{{ hostvars[inventory_hostname].ansible_devices.keys() | select('string') | list }}"
输出:['sr0'、'sda'、'sdb'、'sdc'、'sdd'、'dm-2'、'dm-3'、'dm-0'、'dm-1']
由于托管主机是远程节点,我无法想到查找和差异过滤。请建议如何获取差异:“SDD”
答案1
添加自定义事实就是您要找的内容。这正好可以用于存储持久的自定义事实。例如,为自定义事实创建目录并显示变量ansible_local
- name: Create directory for ansible custom facts
ansible.builtin.file:
state: directory
recurse: true
path: /etc/ansible/facts.d
- debug:
var: ansible_local
变量ansible_local如果你之前没有配置过自定义事实,则应为空字典
ansible_local: {}
设置变量添加之前和添加后,并显示差异
- set_fact:
before_add: "{{ ansible_local.devices.general.before_add|
default([]) }}"
after_add: "{{ hostvars[inventory_hostname].ansible_devices.keys()|
select('string')|list }}"
- debug:
msg: "{{ after_add|difference(before_add) }}"
第一次运行该游戏时,变量添加之前将是一个空列表,并且调试任务应显示所有设备,例如
msg:
- loop1
- nvme0n1
...
接下来是存储持久自定义事实的最重要的部分。例如,将字典复制到文件中
- name: Install custom devices fact
ansible.builtin.copy:
content: |
{"general": {"before_add": {{ after_add }} }}
dest: /etc/ansible/facts.d/devices.fact
当你再次演绎设置应该读ansible_local
ansible_local:
devices:
general:
before_add:
- loop1
- nvme0n1
...
并且不应有区别添加之前和添加后
msg: []
如果你添加设备,调试将显示差异,例如
msg:
- sda
但是,如果您移除设备,差异将为空。如果您想查看添加和移除的设备,请使用对称差分代替不同之处例如
- debug:
msg: "{{ after_add|symmetric_difference(before_add) }}"