Ansible:自定义事实 - 将事实加载为 JSON 或 ini 时出错

Ansible: Custom facts - error loading facts as JSON or ini

shell> ansible ubuntu-c -m setup -m "filter=ansible_local"
...

我正在尝试练习 Ansible 自定义事实:/etc/ansible/facts.d/try.fact

#!bin/bash
echo {\""thing\"" : \""value\""}

但不断收到此错误:

"try": "error loading facts as JSON or ini - please check content: /etc/ansible/facts.d/try.fact" 

当我尝试使用 :

执行它时的想法
sh ./etc/ansible/facts.d/try.fact

它 returns 正确的 JSON 格式:

shell> sh /etc/ansible/facts.d/try.fact
{"thing": "value"}

the documentation 中所述,如果您希望文件被执行,则应将其标记为可执行文件,否则会将其视为包含结构化数据的静态文件。要对此进行测试,您应该直接执行文件 (/etc/ansible/facts.d/try.fact),而不是将其传递给 sh.

chmod +x /etc/ansible/facts.d/try.fact
/etc/ansible/facts.d/try.fact

让我们使用一个简单的剧本

- hosts: localhost
  gather_facts: true
  tasks:
    - debug:
        var: ansible_local

sh/bashpython scripts

shell> cat /etc/ansible/facts.d/try-exe.fact
#!/bin/sh
printf '%s' '{"thing": "value"}'
shell> cat /etc/ansible/facts.d/try-exe.fact
#!/usr/bin/env python
import sys
print('{"thing": "value"}')
shell> /etc/ansible/facts.d/try-exe.fact
{"thing": "value"}

按预期工作

TASK [debug] ******************************************************
ok: [localhost] => 
  ansible_local:
    try-exe:
      thing: value

此外,静态文件 JSON 和 INI 都按预期工作

shell> cat /etc/ansible/facts.d/try-json.fact
{"thing": "value"}
shell> cat /etc/ansible/facts.d/try-ini.fact
[default]
thing=value

给予

TASK [debug] *******************************************************
ok: [localhost] => 
  ansible_local:
    try-ini:
      default:
        thing: value
    try-json:
      thing: value