많은 문제가 있습니다.
<%= 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
와 (같은-이고로 - 루비 해시 구문 분석) 매핑을 가지고있다. 이 키와 관련된 값은 자체적으로 두 개의 키, 즉 toronto
및 texas
이있는 매핑입니다. 여태까지는 그런대로 잘됐다. 그러나 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"
등) 키를 사용하여 해시로 전달됩니다.
'hiera_hash()'의 요점은 * 해시 - 병합 * 검색을 수행한다는 것입니다. 데이터와 결과는 해쉬 일 필요는 없지만 값이 해시 일 것으로 예상되기 때문에 'hiera_hash()'가 필요하거나 필요하지는 않습니다. 보통'hiera()'함수는 대신에 표준 우선 순위 룩업을 수행하고 실제로 발견 된 값의 타입 인 경우 해시를 반환합니다. –