2015-01-09 17 views
5

Tôi có định nghĩa sau đây trong một tập tin yaml:Complex hiera tra cứu không làm việc

keepalived: 
    cluster_name: "cluster.example.lan" 
    cluster_ip: "192.168.1.10" 
    cluster_nic: "eth0" 
haproxy: 
    bind_address: %{hiera('keepalived::cluster_ip')} 

Và như một kết quả trong bind_address Tôi đã có một chuỗi rỗng.

Nếu tôi sử dụng %{hiera('keepalived')} Tôi đã in toàn bộ số băm, nhưng tôi chỉ cần cluster_ip từ mã băm này. Làm thế nào tôi có thể tra cứu cluster_ip?

Trả lời

8

Tôi nghĩ rằng nó không phải là possible:

Hiera chỉ có thể suy biến có giá trị là chuỗi. (Số từ Rối cũng được chuyển thành chuỗi và có thể được sử dụng an toàn.) Bạn không thể nội suy các biến có giá trị là boolean, số không từ Puppet, mảng, hashes, tài nguyên tham khảo hoặc giá trị undef rõ ràng.

Ngoài ra, Hiera không thể nội suy phần tử riêng lẻ của bất kỳ mảng hoặc băm nào, ngay cả khi giá trị của phần tử đó là một chuỗi.

Bạn luôn có thể xác định cluster_ip như là một biến:

common::cluster_ip: "192.168.1.10" 

và hơn sử dụng nó:

keepalived: 
    cluster_name: "cluster.example.lan" 
    cluster_ip: "%{hiera('common::cluster_ip')}" 
    cluster_nic: "eth0" 

haproxy: 
    bind_address: "%{hiera('common::cluster_ip')}" 
3

Hiera sử dụng. trong nội suy chuỗi để tra cứu các phần tử con trong mảng hoặc băm. Thay đổi mã hiera của bạn để trông giống như sau:

keepalived: 
    cluster_name: "cluster.example.lan" 
    cluster_ip: "192.168.1.10" 
    cluster_nic: "eth0" 
haproxy: 
    bind_address: %{hiera('keepalived.cluster_ip')} 

Đối với mảng, bạn sử dụng chỉ số mảng (0 dựa) thay vì khóa băm.

Xem interpolating hash or array elements

+0

Kể từ khi trả lời chấp nhận được chấp nhận này đã thay đổi trong nhiều phiên bản gần đây của hiera và bây giờ đã có thể, như trong câu trả lời này. Vì vậy, nó phụ thuộc vào phiên bản của bạn của hiera! –