连接file_line资源中的字符串

时间:2019-02-26 15:47:58

标签: regex puppet interpolation string-interpolation

我试图像这样连接人偶清单中的字符串:

file_line {'Append to /etc/hosts':
  ensure => present,
  line =>  "${networking['ip'] + '\t'}${networking['fqdn'] + '\t'}${networking['hostname']}",
  match => "${'^#?'+ networking['ip'] + '\s+' + networking['fqdn'] + '\s+' + networking['hostname']}",
  path =>  '/etc/hosts'
}

我或者遇到语法错误,或者在上述情况下:

  

值”不能转换为数字

我猜这意味着它不喜欢加号运算符。 那么如何在matchline属性中插入字符串?

2 个答案:

答案 0 :(得分:3)

这里的问题是运算符+仅限于Numeric类型(documentation)。不能与String类型一起使用。但是,在不尝试字符串连接的情况下,space和正则表达式仍可以照常使用。这些仅需放置在变量插值之外。因此:

file_line { 'Append to /etc/hosts':
  ensure => present,
  line   => "${networking['ip']}\t${networking['fqdn']}\t${networking['hostname']}",
  match  => "^#?${networking['ip']}\s+${networking['fqdn']}\s+${networking['hostname']}",
  path   => '/etc/hosts'
}

应解决类型不匹配和+运算符的问题。

答案 1 :(得分:1)

我知道您已经找到答案了,但是使用host管理/etc/hosts可以使生活更轻松:

host {
    "localhost": ip => "127.0.0.1";

    "$::puppet_server":
        ip           => "1.2.3.4",
        host_aliases => [ "puppetserver" ],
    ;

    "dns-01.tld":
        ip           => "1.2.3.5",
        host_aliases => [ "dns-01" ],
    ;

    "dns-02.tld":
        ip           => "1.2.3.6",
        host_aliases => [ "dns-02" ],
    ;
}