在Chef Template(ERB)中循环遍历数组

时间:2016-10-31 13:27:16

标签: ruby chef ansible jinja2 erb

我是chef的新手并且开始学习绳索并想知道下面是否可行以及如何实现它。我是来自过去两年一直在使用ansible的人。

我想知道如何操纵.erb模板

ansible code - varible.yml

apache_vhosts:
  - servername: "{{ enterprise }}.test.io"
    serveralias: "{{ inventory_hostname }}"
    documentroot: "/var/www/test/current/web"
    symfony_prod: true
    redirect_https: true
  - servername: "{{ enterprise }}forms.test.io"
    documentroot: "/var/www/test/current/web"
    symfony_form: true
    redirect_https: true
  - servername: "{{ enterprise }}trk.test.io"
    documentroot: "/var/www/test/current/web"
    symfony_track: true
    redirect_https: true

ansible code - vhosts.conf.j2jinja template

{% for vhost in apache_vhosts %}
<VirtualHost *:{{ apache_listen_port_http }}>
  ServerName {{ vhost.servername }}
{% if vhost.redirect_https is defined and vhost.redirect_https == true %}
  Redirect 301 / https://{{ vhost.servername }}/
  {% else %}
  DocumentRoot {{ vhost.documentroot }}
{% if vhost.serveradmin is defined %}
  ServerAdmin {{ vhost.serveradmin }}
{% endif %}

{% if vhost.symfony_dev is defined %}

  DirectoryIndex app_dev.php

  <Directory "{{ vhost.documentroot }}">
    AllowOverride None
    Options -Indexes +FollowSymLinks
    Order allow,deny
    Allow from all
    # Symfony2 rewriting rules
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule .? - [L]
    RewriteRule .? %{ENV:BASE}/app_dev.php [L]
  </Directory>
{% elif vhost.symfony_prod is defined %}

  DirectoryIndex app.php

  <Directory "{{ vhost.documentroot }}">
    AllowOverride None
    Options -Indexes +FollowSymLinks
    Order allow,deny
    Allow from all
    # Symfony2 rewriting rules
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule .? - [L]
    RewriteRule .? %{ENV:BASE}/app.php [L]
  </Directory>
{% else %}

  <Directory "{{ vhost.documentroot }}">
    AllowOverride All
    Options -Indexes +FollowSymLinks
    Order allow,deny
    Allow from all
  </Directory>

{% endif %}

{% if vhost.extra_parameters is defined %}
  {{ vhost.extra_parameters }}
{% endif %}

{% endif %}

</VirtualHost>

{% endfor %}

从上面的代码中,您可以看到我在apache_vhosts文件中循环.yml并在创建模板时使用内部对象。 .erb是否可以在.rb属性文件中复制此内容。

目前我只有以下内容;

chef code - default.rb

# Apache attributes
default["altostack"]["apache_conf_path"] = "/etc/apache2/sites-enabled"
default["altostack"]["apache_redirect_https"] = false
default["altostack"]["apache_servername"] = "test.test.io"
default["altostack"]["apache_documentroot"] = "/var/www/test/current/web"
default["altostack"]["apache_ssl_crt_dir"] = case node.environment
when '_default'
  default["altostack"]["apache_ssl_crt_dir"] = "/etc/apache2/ssl/"
end

1 个答案:

答案 0 :(得分:1)

要或多或少地复制ansible格式:

# Apache attributes

default["altostack"]["test.test.io"]["apache_conf_path"] = "/etc/apache2/sites-enabled"
default["altostack"]["test.test.io"]["apache_redirect_https"] = false
default["altostack"]["test.test.io"]["apache_documentroot"] = "/var/www/test/current/web"
default["altostack"]["test.test.io"]["apache_ssl_crt_dir"] = case node.environment
when '_default'
   "/etc/apache2/ssl/"
end

#Alternative synteax with hash:

default["altostack"]["test_2.test.io"]= {
  "apache_conf_path" => "/etc/apache2/sites-enabled",
  "apache_redirect_https" => false,
  "apache_documentroot" => "/var/www/test/current/web"
}

# For the case statement, better use the usual approach, easier to maitain IMHO
default["altostack"]["test_2.test.io"]["apache_ssl_crt_dir"] = case node.environment
  when '_default'
     "/etc/apache2/ssl/"
  end

在模板文件中:

<% node['altostack'].each do |servername,properties| -%>
  <VirtualHost *:<%= properties['apache_redirect_https'] %>
    ServerName <%= servername %>
    <% if !properties['redirect_https'].nil? and properties['redirect_https'] == true -%>
  Redirect 301 / https://<%= servername %>/
  <% else -%>
  DocumentRoot <%= properties['documentroot'] %>
<% if !properties['serveradmin'].nil? -%>
  ServerAdmin <%= properties['serveradmin'] %>
<% endif -%>
# Rest of template to be translated by yourself :)
  

chef中的模板语法使用的是erb,它在documentation here中有所涉及,它接受模板中的普通红宝石。

通常的推荐是利用社区烹饪书,即apache2,其自述文件中包含一个很好的Usage部分,以及web_app资源的基本示例用法。