Puppet 是否在我的 YAML 数据中评估变量?

Is Puppet Evaluating Variables in my YAML data?

我的 hiera 数据的 yaml 文件中有这个:

wsgi_keystone_conf_contents: |
 Listen 5000 
 Listen 35357

 <VirtualHost *:5000>
     WSGIDaemonProcess keystone-public processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
     WSGIProcessGroup keystone-public
     WSGIScriptAlias / /var/www/cgi-bin/keystone/main
     WSGIApplicationGroup %{GLOBAL}
     WSGIPassAuthorization On
     LogLevel info 
     ErrorLogFormat "%{cu}t %M"
     ErrorLog /var/log/httpd/keystone-error.log
     CustomLog /var/log/httpd/keystone-access.log combined
 </VirtualHost>

 <VirtualHost *:35357>
     WSGIDaemonProcess keystone-admin processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
     WSGIProcessGroup keystone-admin
     WSGIScriptAlias / /var/www/cgi-bin/keystone/admin
     WSGIApplicationGroup %{GLOBAL}
     WSGIPassAuthorization On
     LogLevel info 
     ErrorLogFormat "%{cu}t %M"
     ErrorLog /var/log/httpd/keystone-error.log
     CustomLog /var/log/httpd/keystone-access.log combined
 </VirtualHost>

然后我尝试在我的人偶清单中创建一个 wsgi-keystone.conf 文件,如下所示:

file { '/etc/httpd/conf.d/wsgi-keystone.conf':
    ensure   => present,
    content  => $wsgi_keystone_conf_contents,
}

但这会导致文件看起来像这样...

Listen 5000
Listen 35357

<VirtualHost *:5000>
    WSGIDaemonProcess keystone-public processes=5 threads=1 user=keystone group=keystone display-name=
    WSGIProcessGroup keystone-public
    WSGIScriptAlias / /var/www/cgi-bin/keystone/main
    WSGIApplicationGroup
    WSGIPassAuthorization On
    LogLevel info
    ErrorLogFormat "t %M"
    ErrorLog /var/log/httpd/keystone-error.log
    CustomLog /var/log/httpd/keystone-access.log combined
</VirtualHost>

<VirtualHost *:35357>
    WSGIDaemonProcess keystone-admin processes=5 threads=1 user=keystone group=keystone display-name=
    WSGIProcessGroup keystone-admin
    WSGIScriptAlias / /var/www/cgi-bin/keystone/admin
    WSGIApplicationGroup
    WSGIPassAuthorization On
    LogLevel info
    ErrorLogFormat "t %M"
    ErrorLog /var/log/httpd/keystone-error.log
    CustomLog /var/log/httpd/keystone-access.log combined
</VirtualHost>

上述文件有语法错误,httpd 不会重新启动。我应该如何将数据放入我的 YAML 文件中?我需要转义 % 吗?

简答,是的。

在Hiera中,有interpolation tokens:

Interpolation tokens look like %{variable} or %{function("input")}. That is, they consist of:

  • A percent sign (%)
  • An opening curly brace ({)

One of:

  • A variable name
  • A lookup function and its input (Hiera 1.3 and later)
  • 右大括号

如果配置文件中的任何设置或数据源中的值包含插值标记,Hiera 将在 运行 时用它引用的值替换该标记。

这意味着您的 %{GLOBAL} 与插值标记完全匹配。在您的最终输出中,Puppet 显示变量 GLOBAL 没有值,并且输出空白。

SO 上的 上有一个线程,但我认为这通常不是您想要做的。最好的做法是编写一个 erb 模板,并简单地将值传递给您要放入的模板,而不是配置文件的全部内容。