2017-05-12 15 views
0

나는 freeradius 인형극 모듈로 거의 끝났습니다. 지금 ERB 템플릿에서 해시 키를 반복하는 방법에 문제가 있습니다. 802.1x에 반경을 사용하여 사용자를 인증하고 있습니다. 사용자가 특정 LDAP 그룹의 구성원 인 경우 radius는이 그룹과 연결된 VLAN을 할당합니다. 내가 ERB 템플릿을 통해이 파일을 작성하고 싶은루프, erb 템플릿에서 hiera 해시를 초과하는 경우

/etc/freeradius/sites-available/inner-tunnel

.... 
.... 
.... 
ldap 
if (LDAP-Group == vlan_101) { 
    update reply { 
     Tunnel-Type = VLAN 
     Tunnel-Medium-Type = IEEE-802 
     Tunnel-Private-Group-ID = 101 
    } 
} 
elsif (LDAP-Group == vlan_102) { 
    update reply { 
     Tunnel-Type = VLAN 
     Tunnel-Medium-Type = IEEE-802 
     Tunnel-Private-Group-ID = 102 
    } 
} 
elsif (LDAP-Group == vlan_103) { 
    update reply { 
     Tunnel-Type = VLAN 
     Tunnel-Medium-Type = IEEE-802 
     Tunnel-Private-Group-ID = 103 
    } 
} 
else { 
    update reply { 
     Tunnel-Type = VLAN 
     Tunnel-Medium-Type = IEEE-802 
     Tunnel-Private-Group-ID = 110 
    } 
} 
    .... 
    .... 
    .... 

: 이것은 내 현재의 구성입니다.

common.yaml

test_freeradius::tunnel: 
    'vlan_101': 
     vlan: '101' 
    'vlan_102': 
     vlan: '102' 
    'vlan_103': 
     vlan: '103' 
    'vlan_110': 
     vlan: '110' 

와 나는 정의 다음 사용하고 있습니다.

init.pp

.... 
.... 
$groups = hiera('test_freeradius::tunnel') 
create_resources(test_freeradius::tunnel, $groups) 
.... 
.... 

이는 inner-을 만들 수 test_freeradius :: 터널

define test_freeradius::tunnel (

    $vlan, 

){ 

    include test_freeradius::service 

    file { '/etc/freeradius/sites-available/inner-tunnel' : 
    ensure => 'file', 
    owner => 'root', 
    group => 'freerad', 
    mode => '0644', 
    content => template("${module_name}/tunnel.erb"), 
    require => Class['test_freeradius::install'], 
    notify => Service['freeradius'], 
    } 
} 

및 init.pp에 지금 전화를 정의 ERB 템플릿을 사용하는 터널 파일, 어떻게해야합니까? 아니면 hiera가없는 단순한 파일로 사용하고 파일 내에서 변경해야합니까?

+0

Puppet 해시는 ERB에서 Ruby 해시로 표시됩니다. 모든 루비 해시가 제공하는 메소드를 통해 키 세트에 액세스하거나, 값을 검색하거나, 전체 해시를 반복 할 수 있습니다. –

+0

@JohnBollinger, 답장을 보내 주셔서 감사합니다. 여기서 나의 문제는 'elsif'와'else' 서술이다. 나는 단지'if' 문을 사용하는 것이 한 문에서 키를 루핑하고 값을 추가함으로써 작업을 더 쉽게 만들 것이라고 생각합니다. 나는 elsif와 else 문을 사용하는 방법을 찾지 못했다. – Max

답변

1

나는 그것을 풀 수 있었으므로 깨끗한 루비 코드인지는 알 수 없다. 나는 file 리소스의 중복 된 선언 때문에 정의를 재정렬해야했습니다.

tunnel.erb 내가 제거있어

..... 
    ..... 
    ..... 
    ldap 
    <% @groups.each do |key,value| -%> 
    <% if key == 'vlan_10' %> 
    if (LDAP-Group == vlan_10) { 
     update reply { 
      Tunnel-Type = VLAN 
      Tunnel-Medium-Type = IEEE-802 
      Tunnel-Private-Group-ID = 10 
     } 
    } 
    <% else %> 
    elsif (LDAP-Group == <%= key %>) { 
    update reply { 
     Tunnel-Type = VLAN 
     Tunnel-Medium-Type = IEEE-802 
     Tunnel-Private-Group-ID = <%= value['vlan'] %> 
    } 
    } 
    <% end -%> 
    <% end -%> 
..... 
..... 
..... 

:

define test_freeradius::tunnel (

    $vlan, 

){ 

    include test_freeradius::service 

    ensure_resource('file', '/etc/freeradius/sites-available/inner-tunnel', { 
     ensure => 'file', 
     owner => 'root', 
     group => 'freerad', 
     mode => '0644', 
     content => template("${module_name}/tunnel.erb"), 
     require => Class['test_freeradius::install'], 
     notify => Service['freeradius'], 
    } 
) 

    ensure_resource('file', '/etc/freeradius/sites-enabled/inner-tunnel', { 
     ensure => 'link', 
     target => '/etc/freeradius/sites-available/inner-tunnel', 
    } 
) 
} 

그리고 여기가 tunnel.erb의 관련 섹션 test_freeradius :: 터널을 정의 마지막으로 else 성명을 사용합니다. 게스트 LAN 및 W 용 LDAP 그룹을 사용할 것이므로 LAN.

코드를 조금 더 깨끗하게 만들 수있어서 기쁩니다.

감사합니다.