185 lines
6.2 KiB
Puppet
185 lines
6.2 KiB
Puppet
# @summary
|
|
# Module to install an up-to-date version of a Docker image
|
|
# from the registry
|
|
#
|
|
# @param ensure
|
|
# Whether you want the image present or absent.
|
|
#
|
|
# @param image
|
|
# If you want the name of the image to be different from the
|
|
# name of the puppet resource you can pass a value here.
|
|
#
|
|
# @param image_tag
|
|
# If you want a specific tag of the image to be installed
|
|
#
|
|
# @param image_digest
|
|
# If you want a specific content digest of the image to be installed
|
|
#
|
|
# @param docker_file
|
|
# If you want to add a docker image from specific docker file
|
|
#
|
|
# @param docker_tar
|
|
# If you want to load a docker image from specific docker tar
|
|
#
|
|
# @param force
|
|
#
|
|
# @param docker_dir
|
|
#
|
|
define docker::image (
|
|
Enum[present,absent,latest] $ensure = 'present',
|
|
Optional[Pattern[/^[\S]*$/]] $image = $title,
|
|
Optional[String] $image_tag = undef,
|
|
Optional[String] $image_digest = undef,
|
|
Boolean $force = false,
|
|
Optional[String] $docker_file = undef,
|
|
Optional[String] $docker_dir = undef,
|
|
Optional[String] $docker_tar = undef,
|
|
) {
|
|
include docker::params
|
|
|
|
$docker_command = $docker::params::docker_command
|
|
|
|
if $facts['os']['family'] == 'windows' {
|
|
$update_docker_image_template = 'docker/windows/update_docker_image.ps1.epp'
|
|
$update_docker_image_path = "${facts['docker_user_temp_path']}/update_docker_image.ps1"
|
|
$exec_environment = "PATH=${facts['docker_program_files_path']}/Docker/"
|
|
$exec_timeout = 3000
|
|
$update_docker_image_owner = undef
|
|
$exec_path = ["${facts['docker_program_files_path']}/Docker/",]
|
|
$exec_provider = 'powershell'
|
|
} else {
|
|
$update_docker_image_template = 'docker/update_docker_image.sh.epp'
|
|
$update_docker_image_path = '/usr/local/bin/update_docker_image.sh'
|
|
$update_docker_image_owner = 'root'
|
|
$exec_environment = 'HOME=/root'
|
|
$exec_path = ['/bin', '/usr/bin',]
|
|
$exec_timeout = 0
|
|
$exec_provider = undef
|
|
}
|
|
|
|
$parameters = {
|
|
'docker_command' => $docker_command,
|
|
}
|
|
# Wrapper used to ensure images are up to date
|
|
ensure_resource('file', $update_docker_image_path,
|
|
{
|
|
ensure => $docker::params::ensure,
|
|
owner => $update_docker_image_owner,
|
|
group => $update_docker_image_owner,
|
|
mode => '0555',
|
|
content => epp($update_docker_image_template, $parameters),
|
|
}
|
|
)
|
|
|
|
if ($docker_file) and ($docker_tar) {
|
|
fail('docker::image must not have both $docker_file and $docker_tar set')
|
|
}
|
|
|
|
if ($docker_dir) and ($docker_tar) {
|
|
fail('docker::image must not have both $docker_dir and $docker_tar set')
|
|
}
|
|
|
|
if ($image_digest) and ($docker_file) {
|
|
fail('docker::image must not have both $image_digest and $docker_file set')
|
|
}
|
|
|
|
if ($image_digest) and ($docker_dir) {
|
|
fail('docker::image must not have both $image_digest and $docker_dir set')
|
|
}
|
|
|
|
if ($image_digest) and ($docker_tar) {
|
|
fail('docker::image must not have both $image_digest and $docker_tar set')
|
|
}
|
|
|
|
if $force {
|
|
$image_force = '-f '
|
|
} else {
|
|
$image_force = ''
|
|
}
|
|
|
|
if $image_tag {
|
|
$image_arg = "${image}:${image_tag}"
|
|
$image_remove = "${docker_command} rmi ${image_force}${image}:${image_tag}"
|
|
$image_find = "${docker_command} images -q ${image}:${image_tag}"
|
|
} elsif $image_digest {
|
|
$image_arg = "${image}@${image_digest}"
|
|
$image_remove = "${docker_command} rmi ${image_force}${image}:${image_digest}"
|
|
$image_find = "${docker_command} images -q ${image}@${image_digest}"
|
|
} else {
|
|
$image_arg = $image
|
|
$image_remove = "${docker_command} rmi ${image_force}${image}"
|
|
$image_find = "${docker_command} images -q ${image}"
|
|
}
|
|
|
|
if $facts['os']['family'] == 'windows' {
|
|
$_image_find = "If (-not (${image_find}) ) { Exit 1 }"
|
|
} else {
|
|
$_image_find = "${image_find} | grep ."
|
|
}
|
|
|
|
if ($docker_dir) and ($docker_file) {
|
|
$image_install = "${docker_command} build -t ${image_arg} -f ${docker_file} ${docker_dir}"
|
|
} elsif $docker_dir {
|
|
$image_install = "${docker_command} build -t ${image_arg} ${docker_dir}"
|
|
} elsif $docker_file {
|
|
if $facts['os']['family'] == windows {
|
|
$image_install = "Get-Content ${docker_file} -Raw | ${docker_command} build -t ${image_arg} -"
|
|
} else {
|
|
$image_install = "${docker_command} build -t ${image_arg} - < ${docker_file}"
|
|
}
|
|
} elsif $docker_tar {
|
|
$image_install = "${docker_command} load -i ${docker_tar}"
|
|
} else {
|
|
if $facts['os']['family'] == 'windows' {
|
|
$image_install = "& ${update_docker_image_path} -DockerImage ${image_arg}"
|
|
} else {
|
|
$image_install = "${update_docker_image_path} ${image_arg}"
|
|
}
|
|
}
|
|
|
|
if $ensure == 'absent' {
|
|
exec { $image_remove:
|
|
path => $exec_path,
|
|
environment => $exec_environment,
|
|
onlyif => $_image_find,
|
|
provider => $exec_provider,
|
|
timeout => $exec_timeout,
|
|
logoutput => true,
|
|
}
|
|
} elsif $ensure == 'latest' or $image_tag == 'latest' or $force {
|
|
notify { "Check if image ${image_arg} is in-sync":
|
|
noop => false,
|
|
}
|
|
~> exec { $image_install:
|
|
environment => $exec_environment,
|
|
path => $exec_path,
|
|
timeout => $exec_timeout,
|
|
returns => ['0', '2'],
|
|
require => File[$update_docker_image_path],
|
|
provider => $exec_provider,
|
|
logoutput => true,
|
|
}
|
|
~> exec { "echo 'Update of ${image_arg} complete'":
|
|
environment => $exec_environment,
|
|
path => $exec_path,
|
|
timeout => $exec_timeout,
|
|
require => File[$update_docker_image_path],
|
|
provider => $exec_provider,
|
|
logoutput => true,
|
|
refreshonly => true,
|
|
}
|
|
} elsif $ensure == 'present' {
|
|
exec { $image_install:
|
|
unless => $_image_find,
|
|
environment => $exec_environment,
|
|
path => $exec_path,
|
|
timeout => $exec_timeout,
|
|
returns => ['0', '2'],
|
|
require => File[$update_docker_image_path],
|
|
provider => $exec_provider,
|
|
logoutput => true,
|
|
}
|
|
}
|
|
|
|
Docker::Image <| title == $title |>
|
|
}
|