【问题标题】:Chef templates and how to do a for loop in rubyChef 模板以及如何在 ruby​​ 中执行 for 循环
【发布时间】:2017-05-04 00:09:37
【问题描述】:

我对红宝石和厨师很陌生。我正在尝试根据内核数在 nginx.conf 文件中创建条目。

for i in <%= node["cpu"]["total"]%>
upstream frontends {
        server 127.0.0.1:805x;
    }

end

所以..如果 4 核文件将如下所示:

upstream frontends {
            server 127.0.0.1:8051;
            server 127.0.0.1:8052;
            server 127.0.0.1:8053;
            server 127.0.0.1:8054;
        }

【问题讨论】:

  • 如果有 16 个核心呢?最后一个要使用 8066 端口还是 80516 端口?

标签: ruby chef-infra


【解决方案1】:

食谱

template "/etc/nginx/sites-available/my-site.conf" do
  variables :frontends_count => node["cpu"]["total"]
end

模板

upstream frontends {
<% @frontends_count.times do |i| %>
  server 127.0.0.1:805<%= i + 1 %>;
<% end %>
}

【讨论】:

    【解决方案2】:

    我不熟悉 Chef,因为我是 Puppet 用户。一般来说,我会这样处理它:

    n.times { |i| puts "server 127.0.0.1:805#{i+1}" }
    

    输出:

    server 127.0.0.1:8051
    server 127.0.0.1:8052
    server 127.0.0.1:8053
    server 127.0.0.1:8054
    

    显然,您必须将n 替换为node["cpu"]["total"](我假设这是一个整数)并使用puts 以外的其他内容,但这应该可以帮助您入门。我想这应该适用于 Chef:

    upstream frontends {
    <% node["cpu"]["total"].times do |i| -%>
      <%= "server 127.0.0.1:805#{i+1}" %>
    <% end -%>
    }
    

    【讨论】:

      【解决方案3】:

      这是一个带有 if 语句的示例。

      食谱:

      template "/opt/auth/users.xml" do
       ...
       variables(
         :users => auth_users
       )
      end
      

      模板:

      <% @users.each do |u| %>
        <user username="<%= u['username'] %>" password="<%= u['password'] %>" roles="<%= u['roles'] if u['roles'] %>" groups="<%= u['groups'] if u['groups'] %>" />
      <% end %>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-27
        • 1970-01-01
        • 1970-01-01
        • 2014-04-09
        • 2012-06-27
        • 2013-10-26
        • 1970-01-01
        相关资源
        最近更新 更多