我想将多行命令传递到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语法是什么?
答案 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
}
以下更改是必要的:
-c
选项,而不是一个(以避免错误CREATE DATABASE cannot be executed from a function or multi-command string
)L
(由@mardotio建议)我将接受另一个答案,因为它包含一个重要元素(由新贡献者提供:-)