将文件内容插入到 Puppet Manifest 中使用的命令参数中

将文件内容插入到 Puppet Manifest 中使用的命令参数中

我有一个 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}\" }"

相关内容