Interpola o conteúdo do arquivo no argumento de comando usado no manifesto do fantoche

1

Eu tenho um comando SQL que gostaria de usar como o valor de um nó JSON, que faz parte de uma definição de índice. Tudo isso é passado como um comando em um manifesto de marionete. Eu gostaria de externalizar o script sql para que ele possa ser editado independentemente, mas não consigo descobrir como fazer tudo funcionar bem.

Manifesto de marionetes:

...
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'\" } }"
}
...

O problema é que, para aumentar a legibilidade, tenho novas linhas e para estruturar o índice, uso citações como esta:

Script SQL (data.sql):

SELECT
  name as "data.name",
  description as "data.description"
FROM
  data

Existe alguma maneira de eu conseguir isso?

    
por Benny 22.12.2014 / 03:03

1 resposta

0

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}\" }"
    
por 17.04.2015 / 00:36