簡體   English   中英

循環,如果不是在erb模板中的hiera哈希上

[英]loop, if else over hiera hash in erb template

我的freeradius木偶模塊幾乎完成了。 我現在面臨一個問題,該問題是如何遍歷ERB模板中的哈希鍵。 我正在使用802.1x的radius來驗證用戶身份。 如果用戶是特定LDAP組的成員,radius將為其分配與該組關聯的VLAN,依此類推。 這是我當前的配置:

/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
    }
}
  ....
  ....
  ....

我想通過ERB模板創建此文件。

普通郵件

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

我正在使用以下定義。

定義test_freeradius :: tunnel

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中調用它

初始化文件

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

是否可以使用ERB模板創建內部隧道文件,該怎么辦? 還是應該僅將其用作沒有hiera的簡單文件並在文件中進行更改?

我可以解決它,因此我不知道它是否是干凈的Ruby代碼。 由於file資源的重復聲明,我不得不重新排列我的定義。

定義test_freeradius :: tunnel

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的相關部分:

隧道

  .....
  .....
  .....
  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 -%>
.....
.....
.....

我擺脫了最后一個else語句,因為我將對來賓LAN和WLAN使用LDAP組。

我會很高興提出任何使代碼更簡潔的建議。

謝謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM