木偶heredoc在不同行中带有双引号

时间:2018-11-29 14:25:48

标签: puppet

我想将多行命令传递到Puppet(4.10.12)exec资源中。以下内容失败,并显示“'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语法是什么?

2 个答案:

答案 0 :(得分:1)

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

您可以在“禁止文字换行符”下查看文档here

答案 1 :(得分:1)

以下内容现在有效:

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建议)

我将接受另一个答案,因为它包含一个重要元素(由新贡献者提供:-)