簡體   English   中英

來自另一個任務輸出的可疑事實

[英]ansible set fact from another task output

我遇到了一些麻煩的模塊。 我這樣編寫了自定義模塊及其輸出:

ok: [localhost] => {
    "msg": {
        "ansible_facts": {
            "device_id": "/dev/sdd"
        },
        "changed": true,
        "failed": false
    }
}

我的自定義模塊:

#!bin/env python
from ansible.module_utils.basic import *
import json
import array
import re

def find_uuid():
  with open("/etc/ansible/roles/addDisk/library/debug/disk_fact.json") as disk_fact_file, open("/etc/ansible/roles/addDisk/library/debug/device_links.json") as device_links_file:
    disk_fact_data = json.load(disk_fact_file)
    device_links_data = json.load(device_links_file)
    device = []
    for p in disk_fact_data['guest_disk_facts']:
      if disk_fact_data['guest_disk_facts'][p]['controller_key'] == 1000 :
        if disk_fact_data['guest_disk_facts'][p]['unit_number'] == 3:
           uuid = disk_fact_data['guest_disk_facts'][p]['backing_uuid'].split('-')[4]
           for key, value in device_links_data['ansible_facts']['ansible_device_links']['ids'].items():
              for d in device_links_data['ansible_facts']['ansible_device_links']['ids'][key]:
                  if uuid in d:
                     if key not in device:
                        device.append(key)
  if len(device) == 1:
     json_data={
         "device_id": "/dev/" + device[0]
     }
     return True, json_data
  else:
    return False

check, jsonData = find_uuid()

def main():
  module = AnsibleModule(argument_spec={})

  if check:
     module.exit_json(changed=True, ansible_facts=jsonData)
  else:
     module.fail_json(msg="error find device")
main()

我想在其他任務上使用device_id變量。 我認為使用module.exit_json方法可以處理,但是我該怎么辦呢?

我想在其他任務上使用device_id變量

您正在尋找的是register:為了使該值持久存在於運行該任務的主機的“主機事實”中。 然后,您可以使用“推”模型,在該模型中將事實設置在您感興趣的其他所有主機上,也可以使用“拉”模型,在該模型中,感興趣的主機可以在需要時伸出手來獲得價值。

讓我們看看這兩種情況,以進行比較。

首先,獲取該值,為了方便討論,我將使用一個名為“ alpha”的主機:

- hosts: alpha
  tasks:
  - name: find the uuid task
    # or whatever you have called your custom task
    find_uuid:
    register: the_uuid_result

現在,輸出在主機“ alpha”上可用,為{{ vars["the_uuid_result"]["device_id"] }} ,在上面的示例中為/dev/sdd 也可以將其縮寫為{{ the_uuid_result.device_id }}

在“推送”模型中,您現在可以遍歷所有主機,也可以僅遍歷特定組中的主機,這些主機也應接收該device_id事實; 對於此示例,讓我們以一個名為“ need_device_id”的現有主機組為目標:

- hosts: alpha  # just as before, but for context ...
  tasks:
  - find_uuid:
    register: the_uuid_result

  # now propagate out the value
  - name: declare device_id fact on other hosts
    set_fact:
       device_id: '{{ the_uuid_result.device_id }}'
    delegate_to: '{{ item }}'
    with_items: '{{ groups["need_device_id"] }}'

最后,相反,如果主機“ beta”需要查找主機“ alpha”發現的device_id ,則可以device_id這一事實:

- hosts: alpha
  # as before
- hosts: beta
  tasks:
  - name: set the device_id fact on myself from alpha
    set_fact:
      device_id: '{{ hostvars["alpha"]["the_uuid_result"]["device_id"] }}'

您還可以在“ alpha”上運行相同的set_fact: device_id: business,以防止名為the_uuid_result的“本地”變量從alpha的劇本中泄漏出來。 由你決定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM