Назад | Перейти на главную страницу

доступные пользовательские факты, возвращающие строку, а не массив

У меня есть настраиваемый факт для моих серверов для получения данных о клиентах. Это отлично работает на машине и возвращает действительный json. Я могу записать вывод в другой файл фактов, и это тоже отлично работает. Но когда я выполняю настройку ansible, скрипт возвращает все данные в виде одной строки в ключе и пустого значения, например:

"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",
    ...
  }]
}