2017-12-21 5 views
3

히어로 해시의 많은 항목을 반복하고 매니페스트에 기본값을 설정하여 동일한 중복 줄을 hiera에서 제거하고자합니다 (예 : ensure, groups , managehome 등), 중복 키/값 쌍이 hiera에있는 경우 기본값이 무시됩니다.퍼핏 - 해시를 반복 할 때 하이퍼에없는 경우 매니페스트에 기본값을 설정합니다.

현재까지 시도한 모든 것이 기본값을 얻지 못했습니다. 내가 리소스를 선언해야한다는 생각이 들지만, 불확실하다.

내가 조회 및 기타 방법으로 "default_values_hash"로 설정 시도했다, 그러나 아무것도이 내 매니페스트 및 hiera 데이터의 (의사) 예입니다 반복하고 --debug 출력

에 기본값을 통과 나타납니다. 모든 지침을 진심으로 감사드립니다. 고맙습니다. Hiera에서

class test (
    Hash $testhash = lookup('test::hash', "merge" => 'hash'}), 
){ 

    $testhash.each |$key, $value| { 
    user { $key : 
     ensure  => $value['ensure'], 
     name  => $value['name'], 
     password => $value['password'], 
     groups  => $value['groups'], 
     managehome => $value['managehome'], 
    } 
    } 
} 
include class test 

: 나는 매니페스트 (너무 많은 데이터의 모든 데이터를 유지하는 경우가 수행하지만, 반복에 전달하지 않습니다 (User를 대문자로) 매니페스트

test::hash: 

'fred': 
    name:   fred 
    password:  somepassword 
    groups:  wheel 
    managehome: true 

'mary': 
    name:   mary 
    password:  otherpassword 

'john': 
    name:   john 
    password:  anotherpassword 

'harry': 

설정 자원 기본값 하기 위해서).

답변

3

lookup 함수를 사용하면 해시 자체의 기본값을 설정할 수 있지만 실제로 해시 내부의 키와 값은 설정할 수 없습니다. 또한 lookup 함수를 Puppet의 클래스 매개 변수 값으로 사용하면 자동 매개 변수 바인딩으로 대체됩니다. 즉,이 상황에서 사용자의 lookup 함수는 아무 것도 수행하지 않습니다. 왜냐하면 Puppet은 자동 매개 변수 바인딩을 선호하기 때문에 이러한 매개 변수를 사용하고 있습니다 (사용중인 것으로 보이는 lookup은 Hiera 5와 함께 사용됩니다). 나는 개인적으로이 행동이 짜증나는 것을 발견하지만, 그것이 바로 그 것이다. 편집 : 그 특별한 추론에 신경 쓰지 마라. 매개 변수는 이 아니라 $testhash입니다. 이 매개 변수가 모듈 데이터에서 나오는 경우 퍼핏은 모듈 데이터에 대한 자동 매개 변수 바인딩 만 허용하기 때문에 lookup은 여전히 ​​무시됩니다.

리소스 기본값이 여기에서 작동하지 않는다는 것에 놀랐습니다. 나는 이것이 의도하지 않았다고 믿어야한다. 그렇지 않으면 그 길을 갔을 때 뭔가 잘못 구현되었다.

여기에 상관없이 보장되는 방법입니다. 첫째, 우리는 당 표현 기본 속성을 구현합니다 https://puppet.com/docs/puppet/5.3/lang_resources_advanced.html#per-expression-default-attributes

class test (
    Hash $testhash = lookup('test::hash', "merge" => 'hash'}), 
){ 

    $testhash.each |String $key, Hash $value| { 
    user { 
     default: 
     ensure  => present, 
     name  => 'username', 
     password => 'userpassword', 
     groups  => ['usergroups'], 
     managehome => false, 
     ; 
     $key: 
     ensure  => $value['ensure'], 
     name  => $value['name'], 
     password => $value['password'], 
     groups  => $value['groups'], 
     managehome => $value['managehome'], 
     ; 
    } 
    } 
} 

하나의 문제는 여전히 모든 반복에 대한 두 번째 블록의 속성에 대한 값을 설정하는 것입니다있는,하지만 여기에 남아있다. 이러한 키 - 값 쌍이 정의되지 않은 경우 Puppet은 다른 값을 기본값으로 설정하는 대신 오류가 발생합니다. 처음에 애트리뷰트에 대한 값을 정의한 경우 퍼핏에게 애트리뷰트 값을 설정하도록 지시해야한다. 다행히, 우리는 * 속성이 작업을 수행 할 수 있습니다 https://puppet.com/docs/puppet/5.3/lang_resources_advanced.html#setting-attributes-from-a-hash

class test (
    Hash $testhash = lookup('test::hash', "merge" => 'hash'}), 
){ 

    $testhash.each |String $key, Hash $value| { 
    user { 
     default: 
     ensure  => present, 
     name  => 'username', 
     password => 'userpassword', 
     groups  => ['usergroups'], 
     managehome => false, 
     ; 
     $key: 
     * => $value, 
     ; 
    } 
    } 
} 

하나 추천 여기 람다 반복자 변수 $key, $value 좀 더 투명하게 이름을하는 것입니다. 또 다른 참고 사항은 * 속성이 작동하려면 해시 키가 퍼핏 속성 이름과 일치해야한다는 경고입니다.

업데이트 된 질문 : 해시에 nil 값이있는 키가있는 상황에서 람다 반복기 매개 변수에서 키 값의 기본값으로 빈 해시를 설정할 수 있습니다. 빈 해시는 반복 동안 $valueundef (Puppet nil)을 바꿉니다. 이렇게하면 어떤 특성과 값도 * 연산자에 포함되지 않으며 모든 기본값이 우선 적용됩니다.

class test (
    Hash $testhash = lookup('test::hash', "merge" => 'hash'}), 
){ 

    $testhash.each |String $key, Hash $value = {}| { 
    user { 
     default: 
     ensure  => present, 
     name  => 'username', 
     password => 'userpassword', 
     groups  => ['usergroups'], 
     managehome => false, 
     ; 
     $key: 
     * => $value, 
     ; 
    } 
    } 
} 
+0

신속하고 자세한 답장을 보내 주셔서 감사합니다. 불행하게도 hiera 해시의 첫 번째 키만 처리하므로 두 코드 블록을 모두 테스트했습니다 (오류는 발생하지 않음). hiera에 키/쌍이없고 (기본 값과 일치하는) 키가 필요하고 Hiera에 매니페스트 기본값을 무시할 수있는 권한이 있는지 반영하기 위해 내 게시물을 약간 편집했습니다. 추가 지침은 진심으로 감사드립니다. – xit

+0

@xit 코드가 해시 반복을 잃을지도 모른다는 의혹이있었습니다. 기능을 잃지 않고 해시 반복을 유지하는 방법을 생각해야합니다. 불행히도, 이것은 어레이 반복과 함께 본질적으로 작동합니다. 주석의 후반부마다 람다 기본 값을 사용하여 주석을 처리 할 수 ​​있습니다. 그 대답을 업데이트 중입니다. –

+1

@xit 위 코드에서 제공 한 mary와 john 해시 코드를 테스트 한 결과, mary와 john이 모두 처리되었습니다. 내 코드와 결합 된 샘플 해시가 원하는 결과를 생성하기 때문에 여기에 뭔가가 진행되고 있습니까? –

관련 문제