在Chef的相同属性文件中的其他属性中使用属性值

问题描述 投票:0回答:1

注意:这里的示例旨在显示我的问题的上下文,而不是真实的示例。

我在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

那么,在另一个属性中使用一个属性值的最佳方法是什么?

考虑这一点,我可以想到两种选择:

  1. 使用延迟插值,如下所示:https://coderanger.net/derived-attributes/

我的问题是我不太了解建议的概念如何工作,因为我的红宝石技能还没有达到标准。

  1. 存储不带php-后缀的扩展名,然后在配方中对其进行循环,然后将php,版本字符串和扩展名连接为每个扩展名的单个值。将每个参数存储在一个新数组中,该数组将传递到模板中。]
  2. 还有另一种方法可以实现这一目标;可能通过强制"php{node[:php][:version]}"属性在模板中插值?

注意:这里的示例旨在显示我的问题的上下文,而不是真实的示例。我在attributes / default.rb文件中以以下示例为例:default [:php] = {版本:'7 ....

ruby chef
1个回答
1
投票

我不了解Chef,但是在阅读最佳实践页面时,通过延迟插值派生属性是正确的方法。它应该非常简单:

© www.soinside.com 2019 - 2024. All rights reserved.