Puppet 在不同的行中使用双引号的木偶

Puppet 在不同的行中使用双引号的木偶,puppet,Puppet,我想将一个多行命令传递给Puppet(4.10.12)execresource。以下操作因“sudo处的语法错误”而失败: 我认为这个案例的挑战在于两个双引号出现在不同的行上。那么,对于这种情况,正确的语法是什么呢 我认为您需要将L开关添加到您的heredoc中,并在每行末尾添加一个\以跳出新行 $command = $("EOT"/L) sudo -u postgres psql -c\ "CREATE DATABASE db1 ENCODING 'utf8' LC_COLLATE '

我想将一个多行命令传递给Puppet(4.10.12)
exec
resource。以下操作因“sudo处的语法错误”而失败:


我认为这个案例的挑战在于两个双引号出现在不同的行上。那么,对于这种情况,正确的语法是什么呢

我认为您需要将
L
开关添加到您的heredoc中,并在每行末尾添加一个
\
以跳出新行

$command = $("EOT"/L)
  sudo -u postgres psql -c\
  "CREATE DATABASE db1 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8';\
  CREATE DATABASE db2 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8';\
  CREATE DATABASE db3 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8'"
  |-EOT

exec { 'create databases':
  command => $command,
}

您可以在“抑制文字换行符”下查看文档。

以下功能现在可以正常工作:

exec { 'create databases':
  command => @("EOT"/L)
    sudo -u postgres psql \
    -c "CREATE DATABASE db1 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8'" \
    -c "CREATE DATABASE db2 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8'" \
    -c "CREATE DATABASE db3 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8'"
    |-EOT
}
有必要进行以下修改:

  • 使用“@”而不是“$”来引用heredoc(打字错误)
  • 使用三个
    -c
    选项,而不是一个(为了避免错误
    无法从函数或多命令字符串执行创建数据库
  • 使用
    L
    (按照@mardotio的建议)

我会接受另一个答案,因为它包含一个重要的元素(并且是由一个新的参与者:-)

我建议将命令放在模块
files
目录中的一个文件中,然后使用
file
函数()返回一个字符串作为
command
属性的值。然后,您将删除格式问题。你觉得这可行吗?
exec { 'create databases':
  command => @("EOT"/L)
    sudo -u postgres psql \
    -c "CREATE DATABASE db1 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8'" \
    -c "CREATE DATABASE db2 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8'" \
    -c "CREATE DATABASE db3 ENCODING 'utf8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8'"
    |-EOT
}