Esta não é realmente uma pergunta específica de marionete, mas mais uma questão JSON. Para poder incluir conteúdo com novas linhas, você precisa fugir das novas linhas ou removê-las.
Se você escolher escapar, terá que substituir cada nova linha por uma sequência de escape. Seu endpoint precisaria reconhecer as novas linhas com escape e convertê-las de volta para novas linhas regulares antes de continuar o processamento.
exec { 'create_index':
command => 'curl -XPUT http://localhost:9200/_river/my_jdbc_river/_meta -d "{ \"type\": \"jdbc\", \"jdbc\": \"sql\": \"'cat /vagrant/puppet/scripts/data.sql | tr \'\n\' \'\\n\''\" } }"'
}
A outra opção é simplesmente remover a nova linha. Isto tem a vantagem de não requerer modificações no endpoint:
exec { 'create_index':
command => 'curl -XPUT http://localhost:9200/_river/my_jdbc_river/_meta -d "{ \"type\": \"jdbc\", \"jdbc\": \"sql\": \"'cat /vagrant/puppet/scripts/data.sql | tr \'\n\' \' \''\" } }"'
}
No entanto, eu recomendaria a criação de um script separado que simplesmente pega o caminho para o arquivo sql e faz toda a mágica e faz com que o comando create_index chame esse script:
exec { 'create_index':
command => '/vagrant/puppet/scripts/create_index.sh /vagrant/puppet/scripts/data.sql'
}
#!/bin/sh
file=$1
contents='cat "$file"'
return curl -XPUT http://localhost:9200/_river/my_jdbc_river/_meta -d "{ \"type\": \"jdbc\", \"jdbc\": \"sql\": \"${contents}\" }"