Yuvipanda has submitted this change and it was merged. Change subject: zookeeper: Refactor roles to be more generic ......................................................................
zookeeper: Refactor roles to be more generic People outside of analytics might want to use zookeeper, so this refactors the zookeeper roles to be not specific to analytics. - Rename from role::analytics::* to role::* - Use hiera for keeping list of zookeeper hosts, rather than realm branching - Kill the ::config class - Use includes rather than inheritance - Use has_ganglia flag to enable / disable reporting to ganglia This enables it for prod and disables it on labs, which has no ganglia Change-Id: I3bb793beb422c5d93f86a99bd703d4e4b3ff7147 --- M hieradata/eqiad.yaml M hieradata/labs.yaml M manifests/role/analytics/hive.pp M manifests/role/analytics/kafka.pp D manifests/role/analytics/zookeeper.pp A manifests/role/zookeeper.pp M manifests/site.pp 7 files changed, 96 insertions(+), 119 deletions(-) Approvals: Yuvipanda: Verified; Looks good to me, approved diff --git a/hieradata/eqiad.yaml b/hieradata/eqiad.yaml index 39fe083..ccd3013 100644 --- a/hieradata/eqiad.yaml +++ b/hieradata/eqiad.yaml @@ -18,3 +18,7 @@ - '10.64.48.95:11211:1 "shard17"' - '10.64.48.96:11211:1 "shard18"' ganglia_class: "old" +zookeeper_hosts: + analytics1023.eqiad.wmnet: '1023' + analytics1024.eqiad.wmnet: '1024' + analytics1025.eqiad.wmnet: '1025' diff --git a/hieradata/labs.yaml b/hieradata/labs.yaml index 148d528..51c3e27 100644 --- a/hieradata/labs.yaml +++ b/hieradata/labs.yaml @@ -37,3 +37,5 @@ role::cache::bits::bits_domain: 'bits.beta.wmflabs.org' role::cache::bits::top_domain: 'beta.wmflabs.org' role::cache::mobile::zero_site: 'http://zero.wikimedia.beta.wmflabs.org' +zookeeper_hosts: + "${::fqdn}": 1 diff --git a/manifests/role/analytics/hive.pp b/manifests/role/analytics/hive.pp index 750b1b4..0a66320 100644 --- a/manifests/role/analytics/hive.pp +++ b/manifests/role/analytics/hive.pp @@ -17,7 +17,6 @@ # class role::analytics::hive::config { # require zookeeper config to get zookeeper hosts array. - include role::analytics::zookeeper::config include role::analytics::hadoop::config # Set this pretty high, to avoid limiting the number @@ -38,7 +37,7 @@ } # Hive uses Zookeeper for table locking. - $zookeeper_hosts = $role::analytics::zookeeper::config::hosts_array + $zookeeper_hosts = keys(hiera('zookeeper_hosts')) # We set support concurrency to false by default. # if someone needs to use it in their hive job, they diff --git a/manifests/role/analytics/kafka.pp b/manifests/role/analytics/kafka.pp index d63cb02..24c157f 100644 --- a/manifests/role/analytics/kafka.pp +++ b/manifests/role/analytics/kafka.pp @@ -15,8 +15,6 @@ # include role::analytics::kafka::server # class role::analytics::kafka::config { - require role::analytics::zookeeper::config - if ($::realm == 'labs') { # In labs, this can be set via hiera, or default to $::instanceproject $kafka_cluster_name = hiera('role::analytics::kafka::config::kafka_cluster_name', $::instanceproject) @@ -108,7 +106,7 @@ } else { $brokers_array = [] } - $zookeeper_hosts = $role::analytics::zookeeper::config::hosts_array + $zookeeper_hosts = keys(hiera('zookeeper_hosts')) $zookeeper_chroot = "/kafka/${kafka_cluster_name}" $zookeeper_url = inline_template("<%= zookeeper_hosts.sort.join(',') %><%= zookeeper_chroot %>") } diff --git a/manifests/role/analytics/zookeeper.pp b/manifests/role/analytics/zookeeper.pp deleted file mode 100644 index 4776a76..0000000 --- a/manifests/role/analytics/zookeeper.pp +++ /dev/null @@ -1,113 +0,0 @@ -# role/analytics/zookeeper.pp -# -# Role classes for Analytics Zookeeper nodes. -# These role classes will configure Zookeeper properly in either -# the Analytics labs or Analytics production environments. -# -# Usage: -# -# If you only need Zookeeper client configs to talk to Zookeeper servers: -# include role::analytics::zookeeper::client -# -# If you want to set up a Zookeeper server: -# include role::analytics::zookeeper::server -# - -# == Class role::analytics::zookeeper::config -# Bare config role class for client and server classes. -# You may include this class manually if you need to know use the -# $role::analytics::zookeeper::hosts or -# $role::analytics::zookeeper::hosts_array variables. -# -class role::analytics::zookeeper::config { - - # Lookup labs zookeeper hosts from hiera. - if $::realm == 'labs' { - $hosts = hiera('role::analytics::zookeeper::config::hosts', { "${::fqdn}" => '1' } ) - } - # else production - else { - $hosts = { - 'analytics1023.eqiad.wmnet' => '1023', - 'analytics1024.eqiad.wmnet' => '1024', - 'analytics1025.eqiad.wmnet' => '1025', - } - } - - # maintain a $hosts_array variable here for - # cases where you need a list of zookeeper hosts, - # rather than a hash with ZK IDs. (This is used - # in role/analytics/hive.pp, for example.) - $hosts_array = keys($hosts) -} - - -# == Class role::analytics::zookeeper::client -# -class role::analytics::zookeeper::client { - require role::analytics::zookeeper::config - - $version = $::lsbdistcodename ? { - 'trusty' => '3.4.5+dfsg-1', - 'precise' => '3.3.5+dfsg1-1ubuntu1', - } - - class { '::zookeeper': - hosts => $role::analytics::zookeeper::config::hosts, - version => $version, - # Default tick_time is 2000ms, this should allow a max - # of 16 seconds of latency for Zookeeper client sessions. - # See comments in role::analytics::kafka::server for more info. - sync_limit => 8, - } -} - -# == Class role::analytics::zookeeper::server -# -class role::analytics::zookeeper::server inherits role::analytics::zookeeper::client { - system::role { 'role::analytics::zookeeper::server': - description => 'Analytics Cluster Zookeeper Server' - } - - class { '::zookeeper::server': } - - if ($::realm == 'labs') { - $ganglia_host = 'aggregator.eqiad.wmflabs' - $ganglia_port = 50090 - } - else { - # TODO: use variables from new ganglia module once it is finished. - $ganglia_host = '239.192.1.32' - $ganglia_port = 8649 - - # Only allow hosts in the Analytics Cluster to - # connect to the Zookeeper admin client port. - # - # We don't include base::firewall yet, but do - # want to restrict access to administrative - # services. We need defs.erb to be rendered - # so we can reference defined networks in rules. - # NOTE: This should be removed if we get a useable - # base::firewall class. - include ferm - include network::constants - ferm::conf { 'defs': - # defs can always be present. - # They don't actually do firewalling. - ensure => 'present', - prio => '00', - content => template('base/firewall/defs.erb') - } - - ferm::service { 'zookeeper': - proto => 'tcp', - # Zookeeper client, protocol, and jmx listen ports. - port => "(2181 2182 2183 ${$::zookeeper::server::jmx_port})", - srange => '($ANALYTICS_NETWORKS)', - } - # Use jmxtrans for sending metrics to ganglia - class { 'zookeeper::jmxtrans': - ganglia => "${ganglia_host}:${ganglia_port}", - } - } -} diff --git a/manifests/role/zookeeper.pp b/manifests/role/zookeeper.pp new file mode 100644 index 0000000..8a67c0b --- /dev/null +++ b/manifests/role/zookeeper.pp @@ -0,0 +1,87 @@ +# role/zookeeper.pp +# +# Classes for Zookeeper nodes. +# These role classes will configure Zookeeper properly in either +# the labs or production environments. +# +# Usage: +# +# If you only need Zookeeper client configs to talk to Zookeeper servers: +# include role::zookeeper::client +# +# If you want to set up a Zookeeper server: +# include role::zookeeper::server +# +# +# You need to include the hiera variable 'zookeeper_hosts' as a +# assoc array with key being name of node and value being zookeeper id +# for the client / server roles to work. + +# == Class role::zookeeper::client +# +class role::zookeeper::client { + + $version = $::lsbdistcodename ? { + 'trusty' => '3.4.5+dfsg-1', + 'precise' => '3.3.5+dfsg1-1ubuntu1', + } + + $hosts = hiera('zookeeper_hosts') + + class { '::zookeeper': + hosts => $hosts, + version => $version, + # Default tick_time is 2000ms, this should allow a max + # of 16 seconds of latency for Zookeeper client sessions. + # See comments in role::analytics::kafka::server for more info. + sync_limit => 8, + } +} + +# == Class role::zookeeper::server +# +class role::zookeeper::server { + system::role { 'role::zookeeper::server': + description => 'Analytics Cluster Zookeeper Server' + } + + include role::zookeeper::client + + class { '::zookeeper::server': } + + if hiera('has_ganglia', true) { + # TODO: use variables from new ganglia module once it is finished. + $ganglia_host = '239.192.1.32' + $ganglia_port = 8649 + + # Only allow hosts in the Analytics Cluster to + # connect to the Zookeeper admin client port. + # + # We don't include base::firewall yet, but do + # want to restrict access to administrative + # services. We need defs.erb to be rendered + # so we can reference defined networks in rules. + # NOTE: This should be removed if we get a useable + # base::firewall class. + include ferm + include network::constants + ferm::conf { 'defs': + # defs can always be present. + # They don't actually do firewalling. + ensure => 'present', + prio => '00', + content => template('base/firewall/defs.erb') + } + + ferm::service { 'zookeeper': + proto => 'tcp', + # Zookeeper client, protocol, and jmx listen ports. + port => "(2181 2182 2183 ${$::zookeeper::server::jmx_port})", + srange => '($ANALYTICS_NETWORKS)', + } + # Use jmxtrans for sending metrics to ganglia + class { 'zookeeper::jmxtrans': + ganglia => "${ganglia_host}:${ganglia_port}", + } + } +} diff --git a/manifests/site.pp b/manifests/site.pp index 9bb5ce7..ce2ee2f 100644 --- a/manifests/site.pp +++ b/manifests/site.pp @@ -142,7 +142,7 @@ node /analytics102[345].eqiad.wmnet/ { role analytics include standard - include role::analytics::zookeeper::server + include role::zookeeper::server } # Analytics1026 is the Impala master -- To view, visit https://gerrit.wikimedia.org/r/208849 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I3bb793beb422c5d93f86a99bd703d4e4b3ff7147 Gerrit-PatchSet: 3 Gerrit-Project: operations/puppet Gerrit-Branch: production Gerrit-Owner: Yuvipanda <[email protected]> Gerrit-Reviewer: Giuseppe Lavagetto <[email protected]> Gerrit-Reviewer: Milimetric <[email protected]> Gerrit-Reviewer: Ottomata <[email protected]> Gerrit-Reviewer: Yuvipanda <[email protected]> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list [email protected] https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits
