我有一个 SQL 命令,我想将其用作 JSON 节点的值,该节点是索引定义的一部分。所有这些都作为 Puppet 清单中的命令传递。我想将 SQL 脚本外部化,以便可以独立编辑它,但不知道如何让它全部运行良好。
Puppet 清单:
...
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 脚本(data.sql):
SELECT
name as "data.name",
description as "data.description"
FROM
data
有什么办法可以实现这个目标吗?
答案1
这实际上不是针对 Puppet 的问题,而是一个 JSON 问题。为了能够包含带有换行符的内容,您需要转义换行符或将其删除。
如果您选择转义它们,则必须用转义序列替换每个换行符。您的端点需要识别转义的换行符并将其转换回常规换行符,然后才能进行进一步处理。
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}\" }"