Ansible 檢查屬性清單中是否存在變數

Ansible 檢查屬性清單中是否存在變數

我有一個包含網路上主機詳細資訊的變數(稱為「主機清單」 - 我相信您將其稱為字典,但我不確定術語。該變數是在group_vars/all 中的檔案中定義的,因此它是在所有劇本中都可使用(不確定這是否重要)。

我有一個遊戲,只有在主機列表中的主機名稱列表中找不到 ansible_hostname 時才運行該遊戲。主機清單中的主機名稱是變數的屬性之一,但我再次不確定「屬性」是否是正確的術語...

主機清單定義為:

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

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

答案1

可能有更優雅的方法來做到這一點,但這樣的方法對我有用:

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

host1
host2
host3
host4

然後,只有包含以下內容的劇本才會被運行,host4因為它在主機清單變數中不匹配:
$ 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]

答案2

可選地,這個條件更乾淨

    when: inventory_hostname not in hostlist|map(attribute="name")|list

如果您想與庫存別名清單進行比較,請使用inventory_hostname而不是。ansible_hostnameinventory_hostname 和 ansible_hostname 有什麼差別

答案3

另一種解決方案是(如問題評論中所建議的)是將主機清單重構到清單中,如下所示:

[physical_workstation]
host1 ansible_host=192.168.2.31
host2 ansible_host=192.168.2.32

[virtual_machine]
host3 ansible_host=192.168.2.33

[all]
host4 ansible_host=192.168.2.34

然後,您可以簡化劇本,使用特殊群組來針對不屬於任何群組的主機執行遊戲,該群組會從不屬於任何其他群組的主機中ungrouped選擇主機:all

- hosts: ungrouped
  tasks:
    - name: only ungrouped
      debug:
        msg: "host not found in any other group."

或針對這些特定主機分組運行......

- hosts: physical_workstation:virtual_machine
  tasks:
    - name: only in specified groups
      debug:
        msg: |
          This will run on machines that are in groups:
          physical_workstation or virtual_machine

輸出

PLAY [ungrouped] ***********************************************

TASK [only ungrouped] ******************************************
ok: [host4] => {
    "msg": "host not found in any other group."
}

PLAY [physical_workstation:virtual_machine] ********************

TASK [only in specified groups] ********************************
ok: [host1] => {
    "msg": "This will run on machines that are in groups:\nphysical_workstation or virtual_machine"
}
ok: [host2] => {
    "msg": "This will run on machines that are in groups:\nphysical_workstation or virtual_machine"
}
ok: [host3] => {
    "msg": "This will run on machines that are in groups:\nphysical_workstation or virtual_machine"
}

相關內容