注意:这里的示例旨在显示我的问题的上下文,而不是真实的示例。
我在attributes/default.rb
文件中有以下示例:
default[:php] = {
version: '7.3',
repository: 'ondrej/php',
extensions: [
"php7.3",
"php7.3-common",
"php7.3-gd",
"php7.3-mysql",
"php7.3-curl",
"php7.3-intl",
"php7.3-xsl",
"php7.3-mbstring",
"php7.3-zip",
"php7.3-bcmath",
"php7.3-iconv",
"php7.3-soap",
"php7.3-fpm",
"libapache2-mod-php7.3"
],
options: {
:timezone => 'America/Los Angeles',
:memory_limit => '2G',
:max_execution_time => 1800,
:zlib_output_compression => 'On',
:session_save_path => '/var/lib/sessions'
}
}
接下来,我将其传递给这样的模板:
template '/home/vagrant/php_test.txt' do
source node['url'] % {version: node['version']}
source 'php_test.txt.erb'
owner 'vagrant'
group 'vagrant'
mode '0755'
variables(
php: node[:php]
)
end
然后我像这样引用模板中的值:
PHP Version : <%= @php[:version] %>
PHP Repository : <%= @php[:repository] %>
PHP Extension List:
<% @php[:extensions].each do |extension| %>
<%= "#{extension}" %>
<% end %>
PHP Options List
<% @php[:options].each do |option, value| %>
<%= "#{option}: #{value}" %>
<% end %>
这将产生以下文本文件:
PHP Version : 7.3
PHP Repository : ondrej/php
PHP Extension List:
php7.3
libapache2-mod-php7.3
php7.3-common
php7.3-gd
php7.3-mysql
php7.3-curl
php7.3-intl
php7.3-xsl
php7.3-mbstring
php7.3-zip
php7.3-bcmath
php7.3-iconv
php7.3-soap
php7.3-fpm
PHP Options List
timezone: America/Los Angeles
memory_limit: 2G
max_execution_time: 1800
zlib_output_compression: On
session_save_path: /var/lib/sessions
一切正常;但是,我里面的DRY管理员看到了所有这些7.3
,然后说:“嘿,为什么不只在列表中每个扩展名的值内引用version
的值呢?”因此,我在attributes/default.rb
文件中尝试了此操作:
...
extensions: [
"php#{node[:php][:version]}",
"php#{node[:php][:version]}-common",
"php#{node[:php][:version]}-gd",
"php#{node[:php][:version]}-mysql",
"php#{node[:php][:version]}-curl",
"php#{node[:php][:version]}-intl",
"php#{node[:php][:version]}-xsl",
"php#{node[:php][:version]}-mbstring",
"php#{node[:php][:version]}-zip",
"php#{node[:php][:version]}-bcmath",
"php#{node[:php][:version]}-iconv",
"php#{node[:php][:version]}-soap",
"php#{node[:php][:version]}-fpm",
"libapache2-mod-#{node[:php][:version]}"
]
...
(至少有两个问题。首先,它没有达到我的期望。当我遍历模板中的数组时,每个值都打印为字符串而不是插值。其次,它违反了此处提到的厨师最佳做法:https://github.com/pulseenergy/chef-style-guide#attributes
那么,在另一个属性中使用一个属性值的最佳方法是什么?
考虑这一点,我可以想到两种选择:
我的问题是我不太了解建议的概念如何工作,因为我的红宝石技能还没有达到标准。
php-
后缀的扩展名,然后在配方中对其进行循环,然后将php
,版本字符串和扩展名连接为每个扩展名的单个值。将每个参数存储在一个新数组中,该数组将传递到模板中。]还有另一种方法可以实现这一目标;可能通过强制"php{node[:php][:version]}"
属性在模板中插值?
注意:这里的示例旨在显示我的问题的上下文,而不是真实的示例。我在attributes / default.rb文件中以以下示例为例:default [:php] = {版本:'7 ....
我不了解Chef,但是在阅读最佳实践页面时,通过延迟插值派生属性是正确的方法。它应该非常简单: