Статьи

Создание образов Docker с помощью Puppet

Docker-логотипВсе должны создавать образы Docker! но что, если вы не хотите писать все эти сценарии оболочки, что в сущности является Dockerfile , набором команд оболочки в RUNобъявлениях; или если вы уже используете некоторые модули Puppet для создания виртуальных машин?

Создать образ Docker из манифестов Puppet достаточно просто. Например, я построил этот образ докера Jenkis-slave , поэтому вот шаги.

Команда Devops Israel создала несколько образов Docker для CentOS с предустановленной Puppet , так что это хорошее начало.

 

FROM devopsil/puppet:3.5.1

В противном случае вы можете просто установить Puppet в любом голом образе, используя обычные инструкции по установке. Следует учитывать, что образы Docker довольно просты и могут не иметь установленных пакетов. В этом случае образ centos6 не был tarустановлен и некоторые вещи не запускались. В некоторых образах CentOS репозиторий centosplus должен быть включен для успешной установки.

FROM centos:centos6
RUN rpm --import https://yum.puppetlabs.com/RPM-GPG-KEY-puppetlabs && \
    rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm
 
# Need to enable centosplus for the image libselinux issue
RUN yum install -y yum-utils
RUN yum-config-manager --enable centosplus
 
RUN yum install -y puppet tar

После установки Puppet мы можем применить любой манифест к серверу, нам просто нужно разместить нужные файлы в нужных местах. Если нам нужны дополнительные модули, мы можем скопировать их с хоста, возможно, используя librarian-puppet для управления ими. Обратите внимание, что я избегаю запускать библиотекаря или любой другой инструмент в образе, так как для этого потребуется установить дополнительные пакеты, которые могут не понадобиться во время выполнения.

ADD modules/ /etc/puppet/modules/

Основной манифест может идти куда угодно, но место по умолчанию — в /etc/puppet/manifests/site.pp. Конфигурация данных по умолчанию Hiera входит в /var/lib/hiera/common.yaml.

ADD site.pp /etc/puppet/manifests/
ADD common.yaml /var/lib/hiera/common.yaml

Тогда мы можем просто запустить puppet applyи проверить, что ошибок не было

RUN puppet apply /etc/puppet/manifests/site.pp --verbose --detailed-exitcodes || [ $? -eq 2 ]

После этого это обычная CMDконфигурация Docker . В этом случае мы вызываем Jenkins slave jar из сценария оболочки, который обрабатывает некоторые переменные среды, с информацией о мастере Jenkins, поэтому его можно переопределить во время выполнения с помощью docker run -e.

ADD cmd.sh /cmd.sh
 
#ENV JENKINS_USERNAME jenkins
#ENV JENKINS_PASSWORD jenkins
#ENV JENKINS_MASTER http://jenkins:8080
 
CMD su jenkins-slave -c '/bin/sh /cmd.sh'

Конфигурация Puppet достаточно проста

node 'default' {
  package { 'wget':
    ensure => present
  } ->
  class { '::jenkins::slave': }
}

и настройки Hiera, использующие исправленный модуль Jenkins для этого.

# Jenkins slave
jenkins::slave::ensure: stopped
jenkins::slave::enable: false

И это все, вы можете увидеть полный исходный код на GitHub . Если вы в Docker, ознакомьтесь с этой исследовательской статьей IBM, в которой сравниваются производительность виртуальных машин (KVM) и контейнеров Linux (Docker) .