[英]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.