2016-07-17 2 views
0

yaml hiera 파일에이 템플릿이 있습니다.인형극 : 템플릿의 hiera_hash를 반복하십시오.

reg_connection: 
    toronto: 
    - host: apple.net 
    - port: 701 
    - user: george 
    - ssl: true 
    - allowed: banana,orange 
    texas: 
    - host: pink.net 
    - port: 702 
    - user: joel 
    - ssl: false 
    - allowed: blue,gree,red 

host, port, user, ssl의 값에 액세스하고 toronto 및 texas에 허용하려고합니다.

내 매니페스트이 있습니다

$reg_connection= hiera_hash('reg_connection') 

내 템플릿이 있습니다

<% reg_connection.keys().sort.each do |location| -%> 
<%= location %>host=<%= location[host] %> 
<%= location %>port=<%= location[port] %> 
<%= location %>username=<%= location[user] %> 
<%= location %>ssl.enable=<%= location[ssl] %> 
<%= location %>allowed.list=<%= location[allowed] %> 
<% end -%> 

내 템플릿에 출력 구성의 두 블록이 원하는 : 토론토 하나 하나 텍사스.

필자의 퍼핏 출력은 호스트에 대한 값이 없음을 보여줍니다. 어떻게 그 값에 접근 할 수 있습니까?

+0

'hiera_hash()'의 요점은 * 해시 - 병합 * 검색을 수행한다는 것입니다. 데이터와 결과는 해쉬 일 필요는 없지만 값이 해시 일 것으로 예상되기 때문에 'hiera_hash()'가 필요하거나 필요하지는 않습니다. 보통'hiera()'함수는 대신에 표준 우선 순위 룩업을 수행하고 실제로 발견 된 값의 타입 인 경우 해시를 반환합니다. –

답변

6

많은 문제가 있습니다.

<%= location[host] %> 

... host는 (정확하게)은 로컬 변수 또는 방법 이름 해석 : 첫번째 코드에서이다. host이라는 변수 나 메소드가 없으므로 오류가 발생합니다.

문자열 인 "host" 키를 사용하여 값에 액세스하려는 경우 해당 문자열을 사용해야합니다.

<%= location["host"] %> 

두 번째 문제는 YAML 파일에 있습니다.

reg_connection: 
    toronto: 
    - host: apple.net 
    - port: 701 
    - user: george 
    - ssl: true 
    - allowed: banana,orange 
    texas: 
    # ... 

여기 당신은 하나의 키, reg_connection와 (같은-이고로 - 루비 해시 구문 분석) 매핑을 가지고있다. 이 키와 관련된 값은 자체적으로 두 개의 키, 즉 torontotexas이있는 매핑입니다. 여태까지는 그런대로 잘됐다. 그러나 toronto과 관련된 값은 각 행이 -으로 시작하기 때문에 매핑이 아니라 시퀀스 (읽기 : 배열)입니다. 매핑에는 다섯 개의 항목이 있으며 각 항목에는 단일 키와 값이 있습니다. 동일한 데이터 구조를 나타내는 또 다른 방법은 문제를 설명하는 데 도움이 될 수있는 방법입니다. 당신이 원하는 무엇

{ reg_connection: 
    { toronto: 
    [ { host: apple.net }, 
     { port: 701 }, 
     { user: george }, 
     # ... 
    ], 
    texas: 
     # ... 
    } 
} 

, 나는 의심의 매핑을로 그 안쪽의 데이터 구조입니다,하지 순서 :

reg_connection: 
    toronto: 
    host: apple.net 
    port: 701 
    user: george 
    ssl: true 
    allowed: banana,orange 
    texas: 
    # ... 

세 번째 문제는 당신이 반복하려는 방식에있다 결과 해시 : 당신은 (참고 : 관용적 루비에 괄호가 빈 인수 목록에 대한 생략) reg_connection.keys.sort.each라고했습니다

<% reg_connection.keys().sort.each do |location| -%> 
<%= location %>host=<%= location["host"] %> 
<%= location %>port=<%= location["port"] %> 
... 

, 당신은 위치 반복하지 않는 의미, 요 해시 reg_connection의 키를 반복합니다. 즉, 배열 ["toronto", "texas"]을 반복하므로 후속 행은 "toronto"["host"]과 동일하므로 작동하지 않습니다.

location["host"]reg_connection[location]["host"]으로 바꿉니다.하지만 과도합니다.그냥 이렇게 :

<% reg_connection.sort.each do |location, values| -%> 
<%= location %>host=<%= values["host"] %> 
<%= location %>port=<%= values["port"] %> 
... 

은 - 당신은 단지 해시를 직접 호출 할 수 있습니다 sort를 호출하기 전에 reg_connection 's의 키를 취득 할 필요가 없습니다. 사실, 해시를 키 - 값 쌍 (2 요소 배열)의 배열로 변환합니다. 루비는 정렬에 문제가 없습니다. 그런 다음 each이라고하는 두 개의 값이 블록 location (예 : "toronto")과 values ("host", "port" 등) 키를 사용하여 해시로 전달됩니다.

+0

매우 교훈적입니다. 고마워요. – RASG

관련 문제