162 lines
5.8 KiB
ObjectPascal
162 lines
5.8 KiB
ObjectPascal
|
# @summary
|
||
|
# managers a Docker Swarm Mode cluster
|
||
|
#
|
||
|
# @param ensure
|
||
|
# This ensures that the cluster is present or not.
|
||
|
# Note this forcefully removes a node from the cluster. Make sure all worker nodes
|
||
|
# have been removed before managers
|
||
|
#
|
||
|
# @param init
|
||
|
# This creates the first worker node for a new cluster.
|
||
|
# Set init to true to create a new cluster
|
||
|
#
|
||
|
# @param join
|
||
|
# This adds either a worker or manger node to the cluster.
|
||
|
# The role of the node is defined by the join token.
|
||
|
# Set to true to join the cluster
|
||
|
#
|
||
|
# @param advertise_addr
|
||
|
# The address that your node will advertise to the cluster for raft.
|
||
|
# On multihomed servers this flag must be passed
|
||
|
#
|
||
|
# @param autolock
|
||
|
# Enable manager autolocking (requiring an unlock key to start a stopped manager)
|
||
|
#
|
||
|
# @param cert_expiry
|
||
|
# Validity period for node certificates (ns|us|ms|s|m|h) (default 2160h0m0s)
|
||
|
#
|
||
|
# @param default_addr_pool
|
||
|
# Array of default subnet pools for global scope networks (['30.30.0.0/16','40.40.0.0/16'])
|
||
|
#
|
||
|
# @param default_addr_pool_mask_length
|
||
|
# Default subnet pools mask length for default-addr-pools (CIDR block number)
|
||
|
#
|
||
|
# @param dispatcher_heartbeat
|
||
|
# Dispatcher heartbeat period (ns|us|ms|s|m|h) (default 5s)
|
||
|
#
|
||
|
# @param external_ca
|
||
|
# Specifications of one or more certificate signing endpoints
|
||
|
#
|
||
|
# @param force_new_cluster
|
||
|
# Force create a new cluster from current state
|
||
|
#
|
||
|
# @param listen_addr
|
||
|
# The address that your node will listen to the cluster for raft.
|
||
|
# On multihomed servers this flag must be passed
|
||
|
#
|
||
|
# @param max_snapshots
|
||
|
# Number of additional Raft snapshots to retain
|
||
|
#
|
||
|
# @param snapshot_interval
|
||
|
# Number of log entries between Raft snapshots (default 10000)
|
||
|
#
|
||
|
# @param token
|
||
|
# The authentication token to join the cluster. The token also defines the type of
|
||
|
# node (worker or manager)
|
||
|
#
|
||
|
# @param manager_ip
|
||
|
# The ip address of a manager node to join the cluster.
|
||
|
#
|
||
|
define docker::swarm (
|
||
|
Enum[present,absent] $ensure = 'present',
|
||
|
Boolean $init = false,
|
||
|
Boolean $join = false,
|
||
|
Optional[String] $advertise_addr = undef,
|
||
|
Boolean $autolock = false,
|
||
|
Optional[String] $cert_expiry = undef,
|
||
|
Optional[Array] $default_addr_pool = undef,
|
||
|
Optional[String] $default_addr_pool_mask_length = undef,
|
||
|
Optional[String] $dispatcher_heartbeat = undef,
|
||
|
Optional[String] $external_ca = undef,
|
||
|
Boolean $force_new_cluster = false,
|
||
|
Optional[String] $listen_addr = undef,
|
||
|
Optional[String] $max_snapshots = undef,
|
||
|
Optional[String] $snapshot_interval = undef,
|
||
|
Optional[String] $token = undef,
|
||
|
Optional[String] $manager_ip = undef,
|
||
|
) {
|
||
|
include docker::params
|
||
|
|
||
|
if $facts['os']['family'] == 'windows' {
|
||
|
$exec_environment = "PATH=${facts['docker_program_files_path']}/Docker/"
|
||
|
$exec_path = ["${facts['docker_program_files_path']}/Docker/",]
|
||
|
$exec_timeout = 3000
|
||
|
$exec_provider = 'powershell'
|
||
|
$unless_init = '$info = docker info | select-string -pattern "Swarm: active"
|
||
|
if ($info -eq $null) { Exit 1 } else { Exit 0 }'
|
||
|
$unless_join = '$info = docker info | select-string -pattern "Swarm: active"
|
||
|
if ($info -eq $null) { Exit 1 } else { Exit 0 }'
|
||
|
$onlyif_leave = '$info = docker info | select-string -pattern "Swarm: active"
|
||
|
if ($info -eq $null) { Exit 1 } else { Exit 0 }'
|
||
|
} else {
|
||
|
$exec_environment = 'HOME=/root'
|
||
|
$exec_path = ['/bin', '/usr/bin',]
|
||
|
$exec_timeout = 0
|
||
|
$exec_provider = undef
|
||
|
$unless_init = 'docker info | grep -w "Swarm: active"'
|
||
|
$unless_join = 'docker info | grep -w "Swarm: active"'
|
||
|
$onlyif_leave = 'docker info | grep -w "Swarm: active"'
|
||
|
}
|
||
|
|
||
|
$docker_command = "${docker::params::docker_command} swarm"
|
||
|
|
||
|
if $init {
|
||
|
$docker_swarm_init_flags = docker_swarm_init_flags({
|
||
|
init => $init,
|
||
|
advertise_addr => $advertise_addr,
|
||
|
autolock => $autolock,
|
||
|
cert_expiry => $cert_expiry,
|
||
|
dispatcher_heartbeat => $dispatcher_heartbeat,
|
||
|
default_addr_pool => $default_addr_pool,
|
||
|
default_addr_pool_mask_length => $default_addr_pool_mask_length,
|
||
|
external_ca => $external_ca,
|
||
|
force_new_cluster => $force_new_cluster,
|
||
|
listen_addr => $listen_addr,
|
||
|
max_snapshots => $max_snapshots,
|
||
|
snapshot_interval => $snapshot_interval,
|
||
|
}
|
||
|
)
|
||
|
|
||
|
$exec_init = "${docker_command} ${docker_swarm_init_flags}"
|
||
|
|
||
|
exec { 'Swarm init':
|
||
|
command => $exec_init,
|
||
|
environment => $exec_environment,
|
||
|
path => $exec_path,
|
||
|
provider => $exec_provider,
|
||
|
timeout => $exec_timeout,
|
||
|
unless => $unless_init,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if $join {
|
||
|
$docker_swarm_join_flags = docker_swarm_join_flags({
|
||
|
join => $join,
|
||
|
advertise_addr => $advertise_addr,
|
||
|
listen_addr => $listen_addr,
|
||
|
token => $token,
|
||
|
}
|
||
|
)
|
||
|
|
||
|
$exec_join = "${docker_command} ${docker_swarm_join_flags} ${manager_ip}"
|
||
|
|
||
|
exec { 'Swarm join':
|
||
|
command => $exec_join,
|
||
|
environment => $exec_environment,
|
||
|
path => $exec_path,
|
||
|
provider => $exec_provider,
|
||
|
timeout => $exec_timeout,
|
||
|
unless => $unless_join,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if $ensure == 'absent' {
|
||
|
exec { 'Leave swarm':
|
||
|
command => 'docker swarm leave --force',
|
||
|
onlyif => $onlyif_leave,
|
||
|
path => $exec_path,
|
||
|
provider => $exec_provider,
|
||
|
}
|
||
|
}
|
||
|
}
|