1 votes

Interpoler le contenu du fichier dans l'argument de commande utilisé dans le manifeste de Puppet

J'ai une commande SQL que je voudrais utiliser comme valeur d'un nœud JSON, qui fait partie d'une définition d'index. Tout ceci est passé comme une commande dans un manifeste Puppet. Je voudrais externaliser le sql script afin qu'il puisse être édité indépendamment, mais je n'arrive pas à trouver comment faire en sorte que tout cela fonctionne bien.

Manifeste de la marionnette :

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

Le problème est que, pour améliorer la lisibilité, j'ai des retours à la ligne et pour structurer l'index, j'utilise des guillemets comme ceci :

SQL script (data.sql) :

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

Y a-t-il un moyen d'y arriver ?

0voto

Jason Points 20255

Il ne s'agit pas vraiment d'une question spécifique à Puppet, mais plutôt d'une question sur JSON. Pour pouvoir inclure un contenu comportant des retours à la ligne, vous devez soit échapper les retours à la ligne, soit les supprimer.

Si vous choisissez de les échapper, vous devrez remplacer chaque nouvelle ligne par une séquence d'échappement. Votre point de terminaison devra reconnaître les nouvelles lignes échappées et les reconvertir en nouvelles lignes normales avant de poursuivre le traitement.

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

L'autre option consiste à supprimer tout simplement la nouvelle ligne. Cela présente l'avantage de ne pas nécessiter de modification du point de terminaison :

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

Cependant, je recommanderais de construire un script séparé qui prend simplement le chemin vers le fichier sql et fait toute la magie et avoir la commande create_index appeler ce 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}\" }"

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X