2013-09-26 4 views
6

ich eine einfache Puppe definierte Ressource haben, die wie folgt aussieht:Berufung Marionette definierte Ressource mit mehreren Parametern, mehrfach

define mything($number, $device, $otherthing) { 
    file{"/place/${number}": 
     ensure => directory 
    } 
    mount { "/place/${number}": 
     device => $device, 
     ensure => mounted, 
     require => File["/place/${number}"] 
    } 
    file {"/place/${number}/${otherthing}": 
     ensure => directory, 
     require => Mount['/place/${number}'] 
    } 
} 

Ich brauche mit unterschiedlichen Parametern dieser Ressource mehrere Male rufen, sondern kann Finde das nicht heraus, ohne explizit mything() aufzurufen.

Idealerweise würde ich die alle Parameter für in irgendeiner Art von Array gespeichert sind, und dann mything($array) rufen Sie einfach an, ein bisschen wie folgt aus:

$array = [ 
    {number => 3, something => 'yes', otherthing => 'whatever'}, 
    {number => 17, something => 'ooo', otherthing => 'text'}, 
    {number => 4, something => 'no', otherthing => 'random'}, 
] 

mything($array) 

Aber das scheint nicht zu funktionieren. Ich bin ziemlich sicher, dass dies funktionieren würde, wenn meine Ressource nur einen einzigen Parameter und ich hätte nur ein flaches Array von Werten, aber kann ich das gleiche mit mehreren benannten Parameter tun?

+0

ich es fleshed habe sich als ein Ich hatte gehofft, dass die Details nicht wichtig sind und dass es eine vernünftige generische Art gibt, dies zu tun. – growse

+0

Ja. Überprüfen Sie meine Antwort ... – iamauser

Antwort

7

Dies kann für Ihren Fall funktionieren. Anstatt das Array in einer Variablen zu definieren, sollten Sie sie beim Aufruf des Typs als Parameter festlegen.

define mything($number, $device, $otherthing) { 
    file{"/place/${number}": 
     ensure => directory 
    } 
    mount { "/place/${number}": 
     device => $device, 
     ensure => mounted, 
     require => File["/place/${number}"] 
    } 
    file {"/place/${number}/${otherthing}": 
     ensure => directory, 
     require => Mount['/place/${number}'] 
    } 
} 

mything { 
    "k1" : number => "3", device => "Yes", otherthing => "Whatever"; 
    "k2" : number => "17", device => "Noo", otherthing => "Text"; 
    "k3" : number => "5", device => "Oui", otherthing => "ZIP"; 
} 

ich die ganze Sache nicht getestet haben, was ich getestet habe, ist dies define statt und es funktioniert:

define mything($number, $device, $otherthing){ 
    notify{"$device is $number not $otherthing":} 
} 

Ergebnisse:

Mything[k1]/Notify[Yes is 3 not Whatever]/message: 
Mything[k2]/Notify[Noo is 17 not Text]/message: 
+0

Interessant - wusste nicht, dass Sie das tun könnten. Ich denke, ich möchte sie in eine Variable einfügen, wenn ich diese Struktur auf mehr als eine Definition übertragen möchte, aber das ist sicherlich besser als das, was ich ursprünglich hatte. – growse