fatos personalizados ansible retornando string não array

2

Tenho um costume para os meus servidores recuperarem dados do cliente. Isso funciona bem na máquina e retornando json válido. Eu posso escrever a saída para outro arquivo de fatos e isso funciona perfeitamente bem também. Mas quando eu faço uma configuração ansible, o script retorna todos os dados como uma string em uma chave e um valor vazio da seguinte forma:

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

Este é o meu script de fatos:

#!/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

Alguém tem uma idéia de por que isso não funciona? Eu estou realmente preso. Obrigado pela ajuda.

    
por Timo 21.03.2016 / 16:26

1 resposta

2

Se não estou enganado, sua saída JSON é semelhante a esta:

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

Então, essa é uma lista, e com certeza é um JSON válido, mas a Ansible não saberia o que fazer com essa lista. Você precisa dar uma chave para que o Ansible saiba a qual fato a lista deve ser atribuída:

{
  "myList": [{
    "domain": "foo",
    ...
  },{
    "domain": "foo",
    ...
  },{
    "domain": "foo",
    ...
  }]
} 
    
por 21.03.2016 / 16:44