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

Puppet heredoc with double-quotes in different lines

我想将多行命令传递到 Puppet (4.10.12) exec 资源中。以下失败 "syntax error at 'sudo'":

exec { 'create databases':
  command => $("EOT")
    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,
}

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

我相信您需要将 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,
}

您可以在 "suppressing literal line breaks" 下查看文档 here

以下现在有效:

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 选项而不是一个(为了避免错误 CREATE DATABASE cannot be executed from a function or multi-command string
  • 使用 heredoc switch L(如@mardotio 所建议)

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