我是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.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
答案 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
资源的基本示例用法。