Puppet:如果命令超过80个字符,我该如何将其拆分成两行?

29

在 Puppet 中,如果定义的命令超过 80 个字符,我该如何将其拆分为两行来定义?

  exec { 'create_domain':
    command => "some command exceed 80 character...........................................................how to do how to do?.......",
  }
4个回答

22

如果字符串的最后一个字符是\,并且紧跟着一个换行符,则该字符串将继续到下一行。虽然不太美观,但我的sample.pp清单如下:

exec { 'wrapped_string_example':
  command => "/bin/echo 12345678901234567890123456789012345678901234567890\
wrapped > /var/tmp/test.txt";
}

使用puppet apply sample.pp运行此命令将得到以下输出

$ puppet apply sample.pp
notice: /Stage[main]/Exec[wrapped_string_example]/returns: executed successfully
notice: Finished catalog run in 0.10 seconds

并且连接所创建的文件会显示行已经被换行:

$ cat /var/tmp/test.txt 
12345678901234567890123456789012345678901234567890wrapped

请参见https://github.com/puppetlabs/puppet/blob/9fbb36de/lib/puppet/parser/lexer.rb#L537(截至 Puppet v2.7.0)。

此外,这是一个已知问题:http://projects.puppetlabs.com/issues/5022


gvim 只带有 Ruby 语法高亮。 - TheOneTeam
1
如果命令中间的空格不重要,那么在反斜杠后继续命令时,仍然可以将下一行缩进到“正确”的列。 - David Gardner
这并不是问题的答案,但你可以使用# lint:ignore:140chars在本地忽略 puppet-lint 的警告,具体方法请参考 http://puppet-lint.com/controlcomments/ - Peterino

9
对于大块数据,heredocs 是处理 Puppet manifests 中长行的最佳方式。特别有用的是 /L 插值选项。/L 会导致行末的 \ 去除换行符。例如,以下代码会按预期工作,去除缩进和换行符,包括尾随的换行符。
  sshkey { 'example.com':
    ensure  => present,
    type    => 'ssh-rsa',
    key     => @(KEY/L),
      RfrXBrU1T6qMNllnhXsJdaud9yBgWWm6OprdEQ3rpkTvCc9kJKH0k8MNfKxeBiGZVsUn435q\
      e83opnamtGBz17gUOrzjfmpRuBaDDGmGGTPcO8Dohwz1zYuir93bJmxkNldjogbjAWPfrX10\
      8aoDw26K12sK61lOt6GTdR9yjDPdG4zL5G3ZjXCuDyQ6mzcNHdAPPFRQdlRRyCtG2sQWpWan\
      3AlYe6h6bG48thlo6vyNvOD8s9K0YBnwl596DJiNCY6EsxnSAhA3Uf9jeKqlVqqrxhEzHufx\
      07iP1nXIXCMUV
      |-KEY
    target  => '/home/user/.ssh/authorized_keys',
  }

或者保留最后一个换行符,将结束文本前的-省略即可:
exec { 'create_domain':
  command => @(CMD/L),
    /bin/echo 123456789012345678901234567890123456789012345678901234567890123456\
    wrapped > /var/tmp/test.txt
    | CMD
}

@(KEY/L) 后面的逗号是打错了吗? - Flo
@Flo 不,逗号不是打错了。看起来很奇怪,但由于解析器处理heredocs的方式,它是必需的。 - Jon

7

从 Puppet 3.5 开始,您有几个选项可供使用。Ruby 允许您在多行上连接字符串。

string = "line #1"\
         "line #2"\
         "line #3"

p string # => "line #1line #2line #3"

另一种选择是,从Puppet 3.5版本开始,他们增加了HereDoc功能。这将允许您将字符串放置在源代码文件的某个部分中,就像它是一个单独的文件一样处理。

$mytext = @(EOT)
    This block of text is
    visibly separated from
    everything around it.
    | EOT

这里是 Puppet 的文档:https://docs.puppet.com/puppet/4.9/lang_data_string.html#heredocs


2
请注意,您提供的 HereDoc 示例保留了换行符。问题是要求在清单中将属于一行的命令拆分为多行。 - Steztric

5

如果你真的关心80列限制,你总是可以滥用模板来达到这个目标。

exec {'VeryLongExec':
    command => template("${module}/verylongexec")
 }

然后将实际命令放入该模板文件中

感谢Jan Vansteenkiste的贡献,他解决了这个问题


1
实际上,您需要使用$module_name而不是$module(至少对于Puppet 3.7)。 - Thom4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接