2016-10-31 4 views
0

Я новичок в chef и начинаю изучать канаты и хочу знать, возможно ли ниже и как его достичь. Я иду от кого-то, кто использовал ansible последние 2 года.Loop through array in Chef Template (ERB)

Я хочу знать, как манипулировать .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.j2 (jinja 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

Чтобы воспроизвести более или менее ваш 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 :) 

Шаблон синтаксис шеф-повар использует erb, он покрывается в documentation here и он принимает простой рубин внутри шаблона.

Обычным является Рекомендации для воспользоваться сообщества кулинарных книг, здесь именно apache2, который имеет хороший Usage раздел в это ридми и простой пример использования это web_app ресурс.

+0

спасибо за это, я избегаю фокусировки много на кулинарных книжках сообщества, поскольку я считаю, что они очень подавляющие, сравнивая с ними эквивалентные роли в галактике. Я, конечно, буду смотреть на их образцы и структуру. Моя цель - понять синтаксис и уметь создавать шаблоны и работать с атрибутами, чтобы, когда я начал создавать свои кулинарные книги, я не сталкивался с неожиданностями. –

+0

@shady Я очень рекомендую вам пройти через http://learn.chef.io в этом случае;) – Tensibai

+0

Я считаю, что это нечто большее, чем знать язык 'ruby' и движок' erb'. То же самое способ обучения 'ansible' не научит вас, как использовать шаблоны' jinja2', а не ваши знания о 'python' в дополнение к документам механизма шаблонов –