2016-05-11 3 views
0

Ich versuche mehrere separate .conf-Dateien für ein Array von Vhosts auf meinem Webserver mit Chef 11.10 zu erstellen. Ich möchte, dass der Inhalt dieser Dateien per vhost leicht unterschiedlich ist.Mehrere Chef-Vorlagen mit einer For Each-Anweisung und einem Attribut-Array

Die aktuelle Implementierung erstellt verschiedene Dateinamen (1 für jeden im Array.), Aber die Vorlage enthält jedes Mal nur das letzte Element im Array.

Zum Beispiel gibt es 3 vhosts - example1.com, example2.com, example3.com in einem Array. In meinem /var/www/conf.d/ Verzeichnis habe ich 3 Dateien nach dem Rezept

> example1.com.conf 
> example2.com.conf 
> example3.com.conf 

laufen wird, das ist ein guter Anfang, aber der Inhalt dieser Dateien alle mit dem letzten Variablen gleich sind in das verwendete Array. Alle haben "example3.com" als Host zB.

server { 
    listen 80; 
    server_name example3.com; 
    return 301 https://$host$request_uri; 
} 

Mein Rezept containts diese

vhosts = node['nginx']['vhosts'] 

vhosts.each do |vhost| 
    node.default['nginx']['hostname'] = vhost 

    template "#{node[:nginx][:conf_dir]}/#{vhost}.conf" do 
    source "#{node[:nginx][:vhost_template]}" 
    owner "root" 
    group "root" 
    mode 0644 
    notifies :restart, resources(:service => "nginx") 
    end 
end 

und meine Vorlage in den folgenden Code

server { 
    listen 443; 
    server_name <%= node[:nginx][:hostname] %>; 
    return 301 http://$host$request_uri; 
} 

und in meine Attribute/default.rb Datei i die folgende Array.

Antwort

1

Es macht keinen Sinn, ein einzelnes Knotenattribut in einer Schleife zu setzen. Aufgrund der Ausführung von Chef gilt nur der letzte Wert, wenn die Vorlagenressource tatsächlich erstellt wird. Versuchen Sie fallen diese Zeile:

node.default['nginx']['hostname'] = vhost 

und dann pass vhost in the template variables Attribut und verwenden, die in der .erb Datei.

(auch als Referenz, Sie wollen normalerweise nicht Standard-Knoten-Attribute in einem Rezept setzen, das, was node.default[...] verwendet, ist der Fall, aber das ist nicht die Wurzel geht es hier.)

+0

Das funktionierte perfekt Dank Kamerad . Ja, Variablen waren der richtige Weg. Und definitiv in Bezug auf die Standardattribute! :) Vielen Dank – jimmy

Verwandte Themen