Ansible

Ansible 檢查屬性列表中是否存在變數

  • August 22, 2020

我有一個包含網路上主機詳細資訊的變數(稱為“主機列表”-我相信您將其稱為字典,但我不確定術語。該變數在 group_vars/all 的文件中定義,所以它是在所有劇本中都可用(不確定這是否重要)。

我有一個劇本,只有在 hostlist 的主機名列表中找不到 ansible_hostname 時我才想執行它。hostlist 中的主機名是變數的屬性之一,但我再次不確定“屬性”是否是正確的術語……

主機列表定義為:

hostlist:
 - { name: 'host1', ip_addr: '192.168.2.31', hostgrp: 'physical_workstation' }
 - { name: 'host2', ip_addr: '192.168.2.32', hostgrp: 'physical_workstation' }
 - { name: 'host3', ip_addr: '192.168.2.33', hostgrp: 'virtual_machine' }

我用來嘗試使其正常工作的遊戲是:

- name: Conditional test
 debug:
   msg: "ansible_hostname not found in hostlist."
 when: ansible_hostname not in hostlist.name

我不確定條件中所需的語法,或者我想要的是否可以通過這種方式實現?

大概有更優雅的方式來做這件事,但這樣的事情對我有用:

如果您的庫存文件如下所示

host1
host2
host3
host4

然後,只有以下內容的劇本才會被執行,host4因為它在 hostlist var 中不匹配:

$ cat test.yml

- hosts: all
 vars:
   hostlist:
     - { name: 'host1', ip_addr: '192.168.2.31', hostgrp: 'physical_workstation' }
     - { name: 'host2', ip_addr: '192.168.2.32', hostgrp: 'physical_workstation' }
     - { name: 'host3', ip_addr: '192.168.2.33', hostgrp: 'virtual_machine' }
 tasks:

   - name: Conditional test
     debug:
       msg: "ansible_hostname not found in hostlist."
     when: hostlist|selectattr("name", "equalto", ansible_hostname)|list|length == 0

當這樣呼叫時:

ansible-playbook test.yml

意味著只有 host4 執行任務塊….

PLAY [all] *************************************************

TASK [Gathering Facts] *************************************
ok: [host1]
ok: [host2]
ok: [host3]
ok: [host4]

TASK [debug] ***********************************************
ok: [host4] => {
   "msg": "hostname not in hostlist name list"
}
skipping: [host1]
skipping: [host2]
skipping: [host3]

引用自:https://serverfault.com/questions/1031041