Все должны создавать образы 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) .