通过木偶中的2组数据循环 - 优化

时间:2016-03-05 18:25:25

标签: apache puppet

我需要建议优化我的木偶代码。作为输入,我有两种类型的数据 - 包含端口号的数组和包含vhost详细信息的哈希,我喜欢将它们与另一个混合(每个端口的每个vhost)。每个vhost和端口的结果应该是apache :: vhost。让我们假设这些课程:

class proxy(
  $ports = ['80', '8080'],
  ) {
  class { 'apache':
    default_vhost => false,
  }

$vhosts = {
'myhost1' => {
  serveraliases => ['page.myhost1', ],
  proxy_pass    => [
    {
      'path' => '/url/',
      'url'  => 'http://localhost:8088/anotherurl/'
    },
  ],
},
'myhost2' => {
  serveraliases => ['page.myhost2', ],
  proxy_pass    => [
    {
      'path' => '/url/',
      'url'  => 'http://localhost:8088/anotherurl/'
    },
  ],
},
 proxy::vhosts { $ports:
  vhosts => $vhosts,
 }
}

现在我需要做一些魔术来使vhost定义uniq(我将端口号附加到形式为myhost1_80的vhost名称):

define proxy::vhosts (
  $vhosts,
  ) {

  $vhosts_keys = keys($vhosts)

  $servername_port_string = join($vhosts_keys, "_${title},")
  $servername_port_string_full = "${servername_port_string}_${title}"

  $servername_port_array = split($servername_port_string_full, ',')

  proxy::vhost { $servername_port_array:
    vhosts    => $vhosts,
    port => $name,
  }

}

最后在拆分之前为每个vhost和端口创建apache :: vhost定义名称之前已合并(因此host1_80拆分为host1和80):

define proxy::vhost (
  $vhosts,
  $port,
  ) {

  $servername_and_port = split($name, '_')

  apache::vhost { $name:
    servername    => $servername_and_port[0],
    serveraliases => $vhosts[$servername_and_port[0]]['serveraliases'],
    docroot       => '/var/www',
    port          => $servername_and_port[1],
    directories   => [
      { 'path'     => '/var/www',
        'provider' => 'files',
        'deny'     => 'from all'
      },
    ],
    proxy_pass    => $vhosts[$servername_and_port[0]]['proxy_pass'],
  }

}

不幸的是,apache类不支持数组作为端口值的输入,我不能使用更新版本的puppet> 3.2(据我记得 - 引入了每个和其他新功能)。这些可以用更简单的方式完成吗?

1 个答案:

答案 0 :(得分:0)

对于Puppet 3,你可以使用create_resources,结合一些红宝石:

define b(
  $port,
  $vhost)
{
  notice("created ${vhost}:${port}")
}

class a(
  $all_ports,
  $all_vhosts,
) {
  $y = inline_template("<%= require 'yaml'; \
                        t = @all_ports.product(@all_vhosts).map { |(port, vhost)| \
                          [\"#{port}:#{vhost}\", { port: port, vhost: vhost }] \
                        }; \
                        YAML.dump(Hash[t]) %>")
  $spec = parseyaml($y)
  create_resources('b', $spec)
}

class { 'a':
  all_ports  => [8080, 80],
  all_vhosts => ['one.example.com', 'two.example.com'],
}

parseyaml来自stdlib。如果你创建一个木偶函数而不是使用inline_template,那会更漂亮。