可靠的自定义事实返回string不是数组

我有一个自定义的事实,我的服务器检索客户数据。 这在机器上正常工作,并返回有效的JSON。 我可以写输出到另一个事实文件,这也很好地工作。 但是,当我做了安全的设置脚本返回所有的数据作为一个string在一个键和一个空的值,如下所示:

"custom_fact": { "{data...}": {} } 

这是我的事实脚本:

 #!/bin/bash #{{ ansible_managed }} ### extracting information from moodle instances cd /home/vhosts/moodle function getinstances() { MDL_INSTANCES=`find * -maxdepth 0 -not -name "_*" |xargs echo` } getinstanceinfo() { INSTANCE_ARRAY=() for i in $MDL_INSTANCES do source /home/vhosts/moodle/$i/_update.conf firstname="$(mysql -u $UM_DBUSER -p$UM_DBPASS -h mysql -e 'SELECT firstname FROM mdl_user WHERE id=2;' $UM_DBNAME)" firstname=${firstname#firstname} lastname="$(mysql -u $UM_DBUSER -p$UM_DBPASS -h mysql -e 'SELECT lastname FROM mdl_user WHERE id=2;' $UM_DBNAME)" lastname=${lastname#lastname} email="$(mysql -u $UM_DBUSER -p$UM_DBPASS -h mysql -e 'SELECT email FROM mdl_user WHERE id=2;' $UM_DBNAME)" email=${email#email} supportemail="$(mysql -u $UM_DBUSER -p$UM_DBPASS -h mysql -e "SELECT value FROM mdl_config WHERE name='supportemail';" $UM_DBNAME)" supportemail=${supportemail#value} string="\"domain\":\"$i\",\"firstname\":\"$firstname\",\"lastname\":\"$lastname\",\"email\":\"$email\",\"supportemail\":\"$supportemail\"" string=$(echo $string | tr -d '\n') INSTANCE_ARRAY+=("$string") done } # creating json for ansible extraction writetostdout() { printf '[' for (( i=0; i<${#INSTANCE_ARRAY[@]}-1; i++ )) do printf "{ ${INSTANCE_ARRAY[$i]} }," done printf "{ ${INSTANCE_ARRAY[-1]} }" printf ']' } getinstances getinstanceinfo writetostdout 

有没有人有一个想法,为什么这是行不通的? 我真的被卡住了。 感谢帮助。

如果我没有弄错你的JSON输出如下所示:

 [{ "domain": "foo", ... },{ "domain": "foo", ... },{ "domain": "foo", ... }] 

所以这是一个列表,它肯定是有效的JSON,但Ansible不知道如何处理这个列表。 你需要给它一个关键,所以Ansible知道列表应该分配给哪个事实:

 { "myList": [{ "domain": "foo", ... },{ "domain": "foo", ... },{ "domain": "foo", ... }] }