繁体   English   中英

人偶.erb模板:语法错误,意外的$ end,应为')'(或:在代码结束后将.erb中声明的变量插入文本中)

[英]Puppet .erb template: syntax error, unexpected $end, expecting ')' (or: inserting variables declared in .erb into text after end of code)

我正在使用Puppet中的.erb来管理Apache Flume配置文件。 (Flume会将日志发送到Elasticsearch,因此可以在Kibana中对其进行搜索和排序。)

一些背景:它是从一个称为logpaths的自定义事实中获取此信息的,该事实将我的日志路径保持为以下格式:

>MysqlBlah;/var/logs/mysql/error.log:/var/logs/mysql/slow_query.log
>TomcatBlah;/var/logs/tomcat/catalina.out:/var/logs/tomcat/error.log

因此,每个服务均以>开头,日志列表以;开头,并且日志路径以:分隔。

我希望我的ERB能够阅读该内容,并遍历每个日志文件,以产生可以放入水槽配置文件中的文本。

一切似乎都不错,但是我遇到了一个无法跟踪的错误:

-:58: syntax error, unexpected $end, expecting ')'

我似乎在任何地方都没有任何未封闭的括号,因此我不确定如何查找造成此问题的原因。

编辑1:

对于@Daiku,我在所有变量周围添加了双引号,并且它现在正在通过语法检查。 但是,Puppet现在出现此错误:

Could not find value for 'sourcenamelist'

这是范围问题吗? %>之后还有另一种方法来访问变量(我在此erb中声明)吗?

编辑2:

我应该查看行号。 事实证明,我可以按原样插入变量,导致问题的行号是我要追加到列表中的行(这很有意义,因为在开始追加变量之前没有声明该变量)。 我现在回到正轨; 一旦解决了我的其余bug,就会发布完成的代码。

我的代码如下:

<%
#split on > to get each service
services = @logpaths.split(">")
services.each do |serviceline| 
#split on semicolon
service = serviceline.split(";")
servicename = service[0]
#split into logs on colon
logs = service[1].string.split(":")
lognumber = 0
logs.each do |log|
#sourcelist is a space-delimited list of names for each logfile (eg mysql3311-1)
lognumber += 1
sourcename = servicename + "-" + lognumber.to_s + " "
sourcenamelist << sourcename    
#sourceconfigs assigns each source to channel, exec path
sourceconfig = "a1.sources.#{sourcename}.type = exec\na1.sources.#{sourcename}.command = tail -F #{log}\na1.sources.#{sourcename}.channels = c1"
sourceconfiglist << sourceconfig
#sourceinterceptors appends sourcename, path, and servicename (you know, for search)
sourceinterceptors = "a1.sources.#{sourcename}.interceptors = i1 i2 i3 i4\na1.sources.#{sourcename}.interceptors.i1.type = timestamp"
sourceinterceptorlist << sourceinterceptors
end
end 
-%>

# Name the components on this agent
a1.sources = <%= #{sourcenamelist} -%>
a1.sinks = k1
a1.channels = c1

# Describe/configure the source 
<%= #{sourceconfiglist} -%>

# Describe the sink
a1.sinks.k1.type = elasticsearch
a1.sinks.k1.hostNames = (my elasticsearch host):9300
a1.sinks.k1.indexName = flume
a1.sinks.k1.indexType = flume_logs
a1.sinks.k1.clusterName = elasticsearch
a1.sinks.k1.batchSize = 1000
a1.sinks.k1.ttl = 2
a1.sinks.k1.serializer = org.apache.flume.sink.elasticsearch.ElasticSearchLogStashEventSerializer

# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100

# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

#interceptor
<%= #{sourceinterceptorlist} -%>

您需要在插入的红宝石材料周围加上双引号:

a1.sources = <%= "#{sourcenamelist}" -%>

等等

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM