连接 file_line 资源中的字符串

Concatenate strings in file_line resource

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

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'
}

我要么遇到语法错误,要么遇到上述情况:

The value '' cannot be converted to Numeric

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

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

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'
}

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

我知道你已经得到了答案,但你可以使用 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" ],
    ;
}