Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updates to run multiple instances of memcached. #54

Merged
merged 1 commit into from
May 25, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 29 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,38 @@ If you find this module useful, send some bitcoins to 1Na3YFUmdxKxJLiuRXQYJU2kiN
}
```

### Run multiple instances

Instantiating the class gets you a default instance of memcached. This instance is fully configurable.
```ruby
class { 'memcached': }
```
You can configure additional instances of memcached with hiera data.
```ruby
memcached::instance_configs:
'memcached_11222':
tcp_port: 11222
udp_port: 11222
max_memory: '12%'
```
If you choose to configure all instances via hiera data instantiate the class like this.
```ruby
class { 'memcached':
default_instance => false
}
```
Or if you want to declare the instances in a manifest.
```ruby
memcached::instance { 'memcached_11222':
tcp_port => 11222,
udp_port => 11222,
max_memory => '12%',
}
```

### Other class parameters

* $package_ensure = 'present'
* $logfile = '/var/log/memcached.log'
* $pidfile = '/var/run/memcached.pid' (Debian family only, set to false to disable pidfile)
* $max_memory = false
* $item_size = false
* $lock_memory = false (WARNING: good if used intelligently, google for -k key)
Expand Down
89 changes: 37 additions & 52 deletions manifests/init.pp
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@
#
class memcached (
$package_ensure = 'present',
$logfile = $::memcached::params::logfile,
$pidfile = '/var/run/memcached.pid',
$manage_firewall = false,
$max_memory = false,
$item_size = false,
Expand All @@ -24,18 +22,11 @@
$use_sasl = false,
$use_registry = $::memcached::params::use_registry,
$registry_key = 'HKLM\System\CurrentControlSet\services\memcached\ImagePath',
$large_mem_pages = false
$large_mem_pages = false,
$default_instance = true,
$instance_configs = hiera_hash('memcached::instance_configs', undef),
) inherits memcached::params {

# validate type and convert string to boolean if necessary
if is_string($manage_firewall) {
$manage_firewall_bool = str2bool($manage_firewall)
} else {
$manage_firewall_bool = $manage_firewall
}
validate_bool($manage_firewall_bool)
validate_bool($service_restart)

if $package_ensure == 'absent' {
$service_ensure = 'stopped'
$service_enable = false
Expand All @@ -44,54 +35,45 @@
$service_enable = true
}

package { $memcached::params::package_name:
ensure => $package_ensure,
provider => $memcached::params::package_provider
class { '::memcached::package':
package_ensure => $package_ensure,
install_dev => $install_dev,
}

if $install_dev {
package { $memcached::params::dev_package_name:
ensure => $package_ensure,
require => Package[$memcached::params::package_name]
}
$default_configs = {
'memcached' => {
manage_firewall => $manage_firewall,
max_memory => $max_memory,
item_size => $item_size,
lock_memory => $lock_memory,
listen_ip => $listen_ip,
tcp_port => $tcp_port,
udp_port => $udp_port,
max_connections => $max_connections,
verbosity => $verbosity,
unix_socket => $unix_socket,
processorcount => $processorcount,
use_sasl => $use_sasl,
large_mem_pages => $large_mem_pages,
service_ensure => $service_ensure,
service_enable => $service_enable,
},
}

if $manage_firewall_bool == true {
firewall { "100_tcp_${tcp_port}_for_memcached":
port => $tcp_port,
proto => 'tcp',
action => 'accept',
}

firewall { "100_udp_${udp_port}_for_memcached":
port => $udp_port,
proto => 'udp',
action => 'accept',
}
if $default_instance and is_hash($instance_configs) {
validate_hash($instance_configs)
$final_configs = merge($default_configs, $instance_configs)
}

if $service_restart {
$service_notify_real = Service[$memcached::params::service_name]
} else {
$service_notify_real = undef
elsif $default_instance {
$final_configs = $default_configs
}

if ( $memcached::params::config_file ) {
file { $memcached::params::config_file:
owner => 'root',
group => 'root',
mode => '0644',
content => template($memcached::params::config_tmpl),
require => Package[$memcached::params::package_name],
notify => $service_notify_real,
}
elsif is_hash($instance_configs) {
validate_hash($instance_configs)
$final_configs = $instance_configs
}

service { $memcached::params::service_name:
ensure => $service_ensure,
enable => $service_enable,
hasrestart => true,
hasstatus => $memcached::params::service_hasstatus,
if ! is_hash($final_configs) {
fail('No configuration provided to the Memcached class')
}

if $use_registry {
Expand All @@ -102,4 +84,7 @@
notify => Service[$memcached::params::service_name]
}
}

create_resources(memcached::instance, $final_configs)

}
120 changes: 120 additions & 0 deletions manifests/instance.pp
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
# == Type: memcached::instance
#
# Manage memcached instances
#
define memcached::instance (
$package_ensure = 'present',
$manage_firewall = false,
$max_memory = false,
$item_size = false,
$lock_memory = false,
$listen_ip = '0.0.0.0',
$tcp_port = 11211,
$udp_port = 11211,
$max_connections = '8192',
$verbosity = undef,
$unix_socket = undef,
$install_dev = false,
$processorcount = $::processorcount,
$service_restart = true,
$auto_removal = false,
$use_sasl = false,
$large_mem_pages = false,
$service_ensure = 'running',
$service_enable = true,
) {

include ::memcached::params

# This is needed only if instances are exclusively defined rather than using the base class
if ! defined(Class['::memcached::package']) {
class { '::memcached::package':
package_ensure => $package_ensure,
install_dev => $install_dev,
}
}

$user = $memcached::params::user
$pidfile = "/var/run/memcached_${tcp_port}.pid"

if $::osfamily != 'Windows' {
$logfile = "/var/log/memcached_${tcp_port}.log"
}

# validate type and convert string to boolean if necessary
if is_string($manage_firewall) {
$manage_firewall_bool = str2bool($manage_firewall)
} else {
$manage_firewall_bool = $manage_firewall
}
validate_bool($manage_firewall_bool)
validate_bool($service_restart)

if $manage_firewall_bool == true {
firewall { "100_tcp_${tcp_port}_for_memcached":
port => $tcp_port,
proto => 'tcp',
action => 'accept',
}

firewall { "100_udp_${udp_port}_for_memcached":
port => $udp_port,
proto => 'udp',
action => 'accept',
}
}

case $::osfamily {
'Debian': {
$config_file = "/etc/memcached_${tcp_port}.conf"
$service_name = 'memcached'
# We don't manage the init script for Debian
}
'Windows': {
$config_file = undef
$service_name = 'memcached'
}
default: {
$config_file = "/etc/sysconfig/memcached_${tcp_port}"
$service_name = "memcached_${tcp_port}"
$init_script = "/etc/init.d/memcached_${tcp_port}"
}
}

if $service_restart {
$service_notify_real = Service[$service_name]
} else {
$service_notify_real = undef
}

if $config_file {
file { $config_file:
owner => 'root',
group => 'root',
mode => '0644',
content => template($memcached::params::config_tmpl),
require => Package[$memcached::params::package_name],
notify => $service_notify_real,
}
}

if $::osfamily != 'Debian' {
file { $init_script:
owner => 'root',
group => 'root',
mode => '0755',
content => template($memcached::params::init_tmpl),
require => Package[$memcached::params::package_name],
notify => $service_notify_real,
}
}

ensure_resource('service', $service_name, {
ensure => $service_ensure,
enable => $service_enable,
hasrestart => true,
hasstatus => $memcached::params::service_hasstatus,
}
)

}
21 changes: 21 additions & 0 deletions manifests/package.pp
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# == Class: memcached::package
#
# Manage memcached installation
#
class memcached::package (
$package_ensure = 'present',
$install_dev = false,
) inherits memcached::params {

package { $memcached::params::package_name:
ensure => $package_ensure,
}

if $install_dev {
package { $memcached::params::dev_package_name:
ensure => $package_ensure,
require => Package[$memcached::params::package_name]
}
}

}
12 changes: 2 additions & 10 deletions manifests/params.pp
Original file line number Diff line number Diff line change
Expand Up @@ -5,31 +5,25 @@
'Debian': {
$package_name = 'memcached'
$package_provider = undef
$service_name = 'memcached'
$service_hasstatus = false
$dev_package_name = 'libmemcached-dev'
$config_file = '/etc/memcached.conf'
$config_tmpl = "${module_name}/memcached.conf.erb"
$user = 'nobody'
$logfile = '/var/log/memcached.log'
$use_registry = false
}
/RedHat|Suse/: {
$package_name = 'memcached'
$package_provider = undef
$service_name = 'memcached'
$service_hasstatus = true
$dev_package_name = 'libmemcached-devel'
$config_file = '/etc/sysconfig/memcached'
$config_tmpl = "${module_name}/memcached_sysconfig.erb"
$init_tmpl = "${module_name}/memcached.init.erb"
$user = 'memcached'
$logfile = '/var/log/memcached.log'
$use_registry = false
}
/windows/: {
$package_name = 'memcached'
$package_provider = 'chocolatey'
$service_name = 'memcached'
$service_hasstatus = true
$dev_package_name = 'libmemcached-devel'
$config_file = undef
Expand All @@ -43,13 +37,11 @@
'Amazon': {
$package_name = 'memcached'
$package_provider = undef
$service_name = 'memcached'
$service_hasstatus = true
$dev_package_name = 'libmemcached-devel'
$config_file = '/etc/sysconfig/memcached'
$config_tmpl = "${module_name}/memcached_sysconfig.erb"
$init_tmpl = "${module_name}/memcached.init.erb"
$user = 'memcached'
$logfile = '/var/log/memcached.log'
$use_registry = false
}
default: {
Expand Down
Loading