Интерполировать содержимое файла в командный аргумент, используемый в Puppet Manifest

1

У меня есть команда SQL, которую я хотел бы использовать в качестве значения узла JSON, который является частью определения индекса. Все это передается как команда в манифесте марионетки. Я хотел бы вывести скрипт sql так, чтобы он мог редактироваться независимо, но не могу понять, как заставить все это играть хорошо

Кукольный Манифест:

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

Проблема в том, что для повышения читабельности у меня есть новые строки и для структурирования индекса я использую такие кавычки:

SQL Script (data.sql):

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

Есть ли способ, которым я могу это осуществить?

Benny
источник
Не могли бы вы уточнить свой вопрос? Я не уверен, что вы подразумеваете под внешним сценарием SQL, чтобы он мог редактироваться независимо
spuder

Ответы:

0

Это на самом деле не вопрос, связанный с марионетками, а скорее вопрос JSON. Чтобы иметь возможность включать контент, в котором есть новые строки, вам нужно либо экранировать новые строки, либо удалить их.

Если вы решите избежать их, вам придется заменить каждую новую строку на escape-последовательность. Ваша конечная точка должна будет распознать экранированные новые строки и преобразовать их обратно в обычные новые строки перед дальнейшей обработкой.

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

Другой вариант - просто удалить символ новой строки. Это имеет то преимущество, что не требует изменений в конечной точке:

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

Тем не менее, я бы порекомендовал создать отдельный скрипт, который просто берет путь к файлу sql и выполняет всю магию, а команда create_index вызывает этот скрипт:

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}\" }"
T0xicCode
источник