2013-09-25 10 views
5

Tanımlanan türlerin örneklerinin içindeki değişkenlere başvurmak istiyorum. Örneğin, ne barda b ece'nin a arasında $x ve $y başvurmak yapabilirim? İşe bu istiyorum nedenKukla'da, tanımlanmış türde bir değişkene/özniteliğe nasıl erişebilirim?

define foo($x, $y) { 
    } 

    define bar($foo) { 
      notify { "${::$foo::x}": } # <- how to make this reference work? 
    } 

    foo { 'a': 
      x => 'oh bar may you reference me', 
      y => 'please' 
    } 

    bar { 'b': 
      foo  => Foo['a'], 
      require => Foo['a'] 
    } 

nedeni foo örneği Her onları gerekebilir her kaynak için tekrarlamak istemez birçok değerleri içeren olabilmesidir. Bu değerleri bir kez daha tekrarlamak yerine, kendimi tekrarlamak yerine, konteynerine bir referans göndermeyi tercih ederim.

Bütün bakan ve bir sürü şey denedim ama her yerde bu soruya bir cevap bulmak için görünmüyor olabilir oldum. Öznitelikler, referans kaynakları ve sınıf özniteliklerini değiştirmek mümkün olduğunu biliyorum, ancak bir kaynağın/tanımlanmış türün niteliklerini okumak mümkün mü? Öyleyse o zaman mümkün olan en iyi çalışma nedir?

cevap

7

Bu sorunu çözmek için Puppetlab's stdlib module'un bir getparam function içerdiğini öğrendim.

Yani burada sonunda kendi soruya çözüm:

define foo($x, $y) { 
} 

define bar($foo) { 
    notify { getparam(Foo[$foo], 'x'): } 
    notify { getparam(Foo[$foo], 'y'): } 
} 

foo { 'a': 
    x => 'oh bar may you reference me', 
    y => 'please' 
} 

bar { 'b': 
    foo => 'a' 
} 

Bar['b'] tanımında require => Foo['a'] gerekli görünmüyor unutmayın.

1

Size tanımlı türünün özelliklerini erişebilmesini görünmüyor. Possible explanation here. Bununla birlikte, ne yapabilirsiniz, hiera yoluyla dışsallaştırmak.

Hiera bunu doldurma verilerden Manifest'inizde mantığı ayırmak için harika bir yoldur, ancak kurmak değil zordur. İlk denemede ise

Installing

Sınıf referans olarak Hiera değişkenleri erişmeye çalışıyordu; Örneğin, foo::a, ancak bu tanımlanmış türler için çalışmıyor.

Configuring:

hiera.yaml

:backends: 
    - yaml 
:yaml: 
    :datadir: $hiera_dir 
:hierarchy: 
    - common 

$ hiera_dir/common.yaml bir kılavuz olarak http://drewblessing.com/blog/-/blogs/puppet-hiera-implement-defined-resource-types-in-hiera Kullanılması

, basit bir yapılandırma ile Hiera tüm bu özelliklerini beyan koyabilirsiniz

foo: 
    a: 
    x: 'oh bar may you reference me' 
    y: 'please' 

Ve sonra senin kukla mani fest:

define foo ($x, $y) { 
} 

define bar($foo) { 
    require create_my_foos 

    $all_foos = hiera('foo') 

    # This is just for proof of concept, to show that the variable can be passed. 
    file { '/tmp/output.txt': 
     content => $all_foos[$foo]['x'] 
    } 
} 

class create_my_foos { 
    $foo_instances = hiera('foo', []) 
    create_resources('foo', $foo_instances) 
} 

bar { 'b': 
    foo => 'a' 
} 

Şimdi foo 'ın niteliklerin dizisini almak için hiera('foo') işlevini çağırarak foo en değişkenleri erişebilir ve ihtiyacınız olan tam parametre almak için dizi aramalarını yapabilirsiniz. Eğer hiera('foo'['a']['x]) yapamaz, böylece only looks up top-level keys Hiera

Not.

+1

Kesinlikle ben, ama teşekkür için umuyordum cevap! Geçici çözümünü denedim ve işe yarıyor.Foo.x'in sonraki birkaç gün içinde hiera yoluyla erişilebilmesi şartı olmadan bir başkasının foo.x'a erişme yolu ile gelemediği sürece, cevabınızı benimle kabul ediyorum. –

+0

Bunun sadece Kukla dilini kullanarak neden mümkün olmadığını merak ediyorum. –

+0

Ayrıca neden bu kadar ilgileniyorum, bu yüzden biraz daha fazla araştırma yaptım ve ilgimi çeken bir şey buldum - http://docs.puppetlabs.com/guides/scope_and_puppet.html Cevabımı içerecek şekilde güncelledim. – xiankai

İlgili konular