gpt4 book ai didi

linux - 来自另一个任务输出的ansible set fact

转载 作者:太空宇宙 更新时间:2023-11-04 11:46:09 24 4
gpt4 key购买 nike

我遇到了一些 ansible 模块的问题。我这样编写自定义模块及其输出:

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 方法处理,但我该怎么做?

最佳答案

I want to use device_id variable on the other tasks

您正在寻找的东西是 register:,以便使该值持久保存到运行该任务的主机的“主机事实”中。然后,您可以使用“推”模型,在该模型中,您将这个事实设置在您感兴趣的所有其他主机上,或者您可以使用“拉”模型,其中感兴趣的主机可以在他们需要时伸出手来获取值(value).

让我们看看这两种情况,以便进行比较。

首先,捕获该值,为了便于讨论,我将使用名为“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,则可以获取并提取该事实:

- 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: 业务,以防止名为 the_uuid_result 的“本地”变量从 alpha 的剧本中泄露出来。由你决定。

关于linux - 来自另一个任务输出的ansible set fact,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57680365/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com