
Packer прост в использовании и автоматизирует создание любого типа образа машин. Он охватывает современное управление конфигурацией, используя автоматические скрипты для установки и настройки программного обеспечения на ваших образах, созданных упаковщиком. Т.е packer — это инструмент для создания одинаковых образов ОС для различных платформ из одного описания.
Установка packer в CentOS/Fedora/RedHat
Если у вас еще используется 32-битная ОС, то вы можете использовать следующую ссылку чтобы скачать ПО:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/packer/1.1.3/packer_1.1.3_linux_386.zip
Если у вас используется 64-битная ОС, то вы можете использовать следующую ссылку чтобы скачать ПО:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/packer/1.1.3/packer_1.1.3_linux_amd64.zip
Если у вас используется ARM, то вы можете использовать следующую ссылку чтобы скачать ПО:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/packer/1.1.3/packer_1.1.3_linux_arm.zip
Если у вас используется ARM64, то вы можете использовать следующую ссылку чтобы скачать ПО:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/packer/1.1.3/packer_1.1.3_linux_arm64.zip
PS: На момент написания статьи, я использовал самую новую версию данной утилиты. Данный продукт довольно быстро развиваеться и за ним нужно следить и скачивать самую новую версию (если есть необходимость). На официальном сайте можно скачать актуальную версию.
Установка packer в Debian/Ubuntu
Если у вас еще используется 32-битная ОС, то вы можете использовать следующую ссылку чтобы скачать ПО:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/packer/1.1.3/packer_1.1.3_linux_386.zip
Если у вас используется 64-битная ОС, то вы можете использовать следующую ссылку чтобы скачать ПО:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/packer/1.1.3/packer_1.1.3_linux_amd64.zip
Если у вас используется ARM, то вы можете использовать следующую ссылку чтобы скачать ПО:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/packer/1.1.3/packer_1.1.3_linux_arm.zip
Если у вас используется ARM64, то вы можете использовать следующую ссылку чтобы скачать ПО:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/packer/1.1.3/packer_1.1.3_linux_arm64.zip
PS: На момент написания статьи, я использовал самую новую версию данной утилиты. Данный продукт довольно быстро развиваеться и за ним нужно следить и скачивать самую новую версию (если есть необходимость). На официальном сайте можно скачать актуальную версию.
Установка packer в Mac OS X
Для скачивания ПО, можно использовать следующу команду:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/packer/1.1.3/packer_1.1.3_darwin_amd64.zip
PS: На момент написания статьи, я использовал самую новую версию данной утилиты. Данный продукт довольно быстро развиваеться и за ним нужно следить и скачивать самую новую версию (если есть необходимость). На официальном сайте можно скачать актуальную версию.
Установка packer в FreeBSD
Если у вас еще используется 32-битная ОС, то вы можете использовать следующую ссылку чтобы скачать ПО:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/packer/1.1.3/packer_1.1.3_freebsd_386.zip
Если у вас используется 64-битная ОС, то вы можете использовать следующую ссылку чтобы скачать ПО:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/packer/1.1.3/packer_1.1.3_freebsd_amd64.zip
Если у вас используется ARM, то вы можете использовать следующую ссылку чтобы скачать ПО:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/packer/1.1.3/packer_1.1.3_freebsd_arm.zip
PS: На момент написания статьи, я использовал самую новую версию данной утилиты. Данный продукт довольно быстро развиваеться и за ним нужно следить и скачивать самую новую версию (если есть необходимость). На официальном сайте можно скачать актуальную версию.
Установка packer в OpenBSD
Если у вас еще используется 32-битная ОС, то вы можете использовать следующую ссылку чтобы скачать ПО:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/packer/1.1.3/packer_1.1.3_openbsd_386.zip
Если у вас используется 64-битная ОС, то вы можете использовать следующую ссылку чтобы скачать ПО:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/packer/1.1.3/packer_1.1.3_openbsd_amd64.zip
PS: На момент написания статьи, я использовал самую новую версию данной утилиты. Данный продукт довольно быстро развиваеться и за ним нужно следить и скачивать самую новую версию (если есть необходимость). На официальном сайте можно скачать актуальную версию.
Установка packer в Solaris
Для скачивания ПО, можно использовать следующу команду:
# cd /usr/local/src && curl -O https://releases.hashicorp.com/packer/1.1.3/packer_1.1.3_solaris_amd64.zip
PS: На момент написания статьи, я использовал самую новую версию данной утилиты. Данный продукт довольно быстро развиваеться и за ним нужно следить и скачивать самую новую версию (если есть необходимость). На официальном сайте можно скачать актуальную версию.
Установка packer для других Unix/Linux ОС
Можно попробовать скомпилировать данное ПО. Я работу не проверял, но разработчики выкладуют исходный код на гитхабе и его можно попробовать заюзать.
# cd /usr/local/src && git clone https://github.com/hashicorp/packer.git
И дальше следовать инструкциям.
Настройка packer в Unix/Linux
Скачать то архив упели, но нужно его еще и расспаковать и подготовить к работе.
# cd /usr/local/src; unzip packer_*.zip && rm -f unzip packer_*.zip
Перенесем файл:
# mv /usr/local/src/packer /usr/local/bin/
PS: Если не прописан PATH для /usr/local/bin — стоит прописать его в .bash_profile!
Для установки packer, я написал скрипт:
# vim install_packer.sh
Который имеет следующий код:
#!/bin/bash -x
# CREATED:
# vitaliy.natarov@yahoo.com
#
# Unix/Linux blog:
# http://linux-notes.org
# Vitaliy Natarov
#
function install_packer () {
#
if [ -f /etc/centos-release ] || [ -f /etc/redhat-release ] ; then
#update OS
yum update &> /dev/null -y && yum upgrade &> /dev/null -y
#
if ! type -path "wget" > /dev/null 2>&1; then yum install wget &> /dev/null -y; fi
if ! type -path "curl" > /dev/null 2>&1; then yum install curl &> /dev/null -y; fi
if ! type -path "unzip" > /dev/null 2>&1; then yum install unzip &> /dev/null -y; fi
if [ -z "`rpm -qa | grep redhat-lsb-core`" ]; then
yum install redhat-lsb-core &> /dev/null -y
fi
OS=$(lsb_release -ds|cut -d '"' -f2|awk '{print $1}')
OS_MAJOR_VERSION=$(sed -rn 's/.*([0-9]).[0-9].*/\1/p' /etc/redhat-release)
OS_MINOR_VERSION=$(cat /etc/redhat-release | cut -d"." -f2| cut -d " " -f1)
Bit_OS=$(uname -m | sed 's/x86_//;s/i[3-6]86/32/')
echo "$OS-$OS_MAJOR_VERSION.$OS_MINOR_VERSION with $Bit_OS bit arch"
#
site="https://releases.hashicorp.com/packer/"
Latest_packer_version=$(curl -s "$site" --list-only | grep -E "packer_" | head -n1| cut -d ">" -f2| cut -d "<" -f1| cut -c8-)
URL_with_latest_packer_package=$site$Latest_packer_version
#
if [ "`uname -m`" == "x86_64" ]; then
Latest_packer_package=$(curl -s "$URL_with_latest_packer_package/" --list-only |grep -E "packer_" | grep -E "linux_amd64"|cut -d ">" -f2| cut -d "<" -f1)
Current_link_to_archive=$URL_with_latest_packer_package/$Latest_packer_package
elif [ "`uname -m`" == "i386|i686" ]; then
Latest_packer_package=$(curl -s "$URL_with_latest_packer_package/" --list-only |grep -E "packer_" | grep -Ev "(SHA256SUMS|windows)"| grep -E "linux_386"|cut -d ">" -f2| cut -d "<" -f1)
Current_link_to_archive=$URL_with_latest_packer_package/$Latest_packer_package
fi
echo $Current_link_to_archive
cd /usr/local/src/ && wget $Current_link_to_archive &> /dev/null
unzip $Latest_packer_package
rm -rf /usr/local/src/$Latest_packer_package*
yes|mv -f /usr/local/src/packer /usr/local/bin/packer
chmod +x /usr/local/bin/packer
elif [ -f /etc/fedora_version ]; then
if ! type -path "wget" > /dev/null 2>&1; then apt-get install wget &> /dev/null -y; fi
if ! type -path "curl" > /dev/null 2>&1; then apt-get install curl &> /dev/null -y; fi
if ! type -path "unzip" > /dev/null 2>&1; then apt-get install unzip &> /dev/null -y; fi
echo "Fedora";
OS=$(lsb_release -ds|cut -d '"' -f2|awk '{print $1}')
OS_MAJOR_VERSION=`sed -rn 's/.*([0-9])\.[0-9].*/\1/p' /etc/fedora_version`
OS_MINOR_VERSION=`sed -rn 's/.*[0-9].([0-9]).*/\1/p' /etc/fedora_version`
Bit_OS=$(uname -m | sed 's/x86_//;s/i[3-6]86/32/')
echo "$OS-$OS_MAJOR_VERSION.$OS_MINOR_VERSION($CODENAME) with $Bit_OS bit arch"
#
site="https://releases.hashicorp.com/packer/"
Latest_packer_version=$(curl -s "$site" --list-only | grep -E "packer_" | head -n1| cut -d ">" -f2| cut -d "<" -f1| cut -c8-)
URL_with_latest_packer_package=$site$Latest_packer_version
#
if [ "`uname -m`" == "x86_64" ]; then
Latest_packer_package=$(curl -s "$URL_with_latest_packer_package/" --list-only |grep -E "packer_" | grep -E "linux_amd64"|cut -d ">" -f2| cut -d "<" -f1)
Current_link_to_archive=$URL_with_latest_packer_package/$Latest_packer_package
elif [ "`uname -m`" == "i386|i686" ]; then
Latest_packer_package=$(curl -s "$URL_with_latest_packer_package/" --list-only |grep -E "packer_" | grep -Ev "(SHA256SUMS|windows)"| grep -E "linux_386"|cut -d ">" -f2| cut -d "<" -f1)
Current_link_to_archive=$URL_with_latest_packer_package/$Latest_packer_package
fi
echo $Current_link_to_archive
cd /usr/local/src/ && wget $Current_link_to_archive &> /dev/null
unzip $Latest_packer_package
rm -rf /usr/local/src/$Latest_packer_package*
yes|mv -f /usr/local/src/packer /usr/local/bin/packer
chmod +x /usr/local/bin/packer
#
elif [ -f /etc/debian_version ]; then
#update OS
apt-get update &> /dev/null -y && apt-get upgrade &> /dev/null -y
yes| apt-get install apt-transport-https &> /dev/null
#
if ! type -path "wget" > /dev/null 2>&1; then yes| apt-get install wget &> /dev/null; fi
if ! type -path "curl" > /dev/null 2>&1; then yes| apt-get install curl &> /dev/null; fi
if ! type -path "unzip" > /dev/null 2>&1; then yes| apt-get install unzip &> /dev/null; fi
#
echo "Debian/Ubuntu/Kali Linux";
OS=$(lsb_release -ds|cut -d '"' -f2|awk '{print $1}')
OS_MAJOR_VERSION=`sed -rn 's/.*([0-9])\.[0-9].*/\1/p' /etc/debian_version`
OS_MINOR_VERSION=`sed -rn 's/.*[0-9].([0-9]).*/\1/p' /etc/debian_version`
Bit_OS=$(uname -m | sed 's/x86_//;s/i[3-6]86/32/')
#
CODENAME=`cat /etc/*-release | grep "VERSION="`
CODENAME=${CODENAME##*\(}
CODENAME=${CODENAME%%\)*}
echo "$OS-$OS_MAJOR_VERSION.$OS_MINOR_VERSION($CODENAME) with $Bit_OS bit arch"
#
site="https://releases.hashicorp.com/packer/"
Latest_packer_version=$(curl -s "$site" --list-only | grep -E "packer_" | head -n1| cut -d ">" -f2| cut -d "<" -f1| cut -c8-)
URL_with_latest_packer_package=$site$Latest_packer_version
#
if [ "`uname -m`" == "x86_64" ]; then
Latest_packer_package=$(curl -s "$URL_with_latest_packer_package/" --list-only |grep -E "packer_" | grep -E "linux_amd64"|cut -d ">" -f2| cut -d "<" -f1)
Current_link_to_archive=$URL_with_latest_packer_package/$Latest_packer_package
elif [ "`uname -m`" == "i386|i686" ]; then
Latest_packer_package=$(curl -s "$URL_with_latest_packer_package/" --list-only |grep -E "packer_" | grep -Ev "(SHA256SUMS|windows)"| grep -E "linux_386"|cut -d ">" -f2| cut -d "<" -f1)
Current_link_to_archive=$URL_with_latest_packer_package/$Latest_packer_package
fi
echo $Current_link_to_archive
cd /usr/local/src/ && wget $Current_link_to_archive &> /dev/null
unzip $Latest_packer_package
rm -rf /usr/local/src/$Latest_packer_package*
yes|mv -f /usr/local/src/packer /usr/local/bin/packer
chmod +x /usr/local/bin/packer
elif [ -f /usr/sbin/system_profiler ]; then
OS=$(uname)
Mac_Ver=$(sw_vers -productVersion | awk -F '.' '{print $1 "." $2}')
Bit_OS=$(uname -m | sed 's/x86_//;s/i[3-6]86/32/')
echo "MacOS: $OS-$Mac_Ver with $Bit_OS bit arch"
which -s brew
if [[ $? != 0 ]] ; then
# Install Homebrew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
else
# update homebrew
brew update && brew upgrade
fi
Latest_packer_package=$(curl -s "$URL_with_latest_packer_package/" --list-only |grep -E "packer_" | grep -E "darwin_amd64"|cut -d ">" -f2| cut -d "<" -f1)
Current_link_to_archive=$URL_with_latest_packer_package/$Latest_packer_package
echo $Current_link_to_archive
cd /usr/local/src/ && wget $Current_link_to_archive &> /dev/null
unzip $Latest_packer_package
rm -rf /usr/local/src/$Latest_packer_package*
yes|mv -f /usr/local/src/packer /usr/local/bin/packer
chmod +x /usr/local/bin/packer
else
OS=$(uname -s)
VER=$(uname -r)
echo 'OS=' $OS 'VER=' $VER
fi
}
install_packer
echo "========================================================================================================";
echo "================================================FINISHED================================================";
echo "========================================================================================================";
Запустить установку можно следующим образом:
# bash install_packer.sh
Проверялось на Debian 8, CentOS 6/7 и на Mac OS X.
Использование packer в Unix/Linux
Приведу примеры использования.
Пример использования (общий, просто простой пример)
Создадим файл:
# vim first_test_with_packer.json
Пример кода:
{
"variables": {
"aws_access_key": "",
"aws_secret_key": ""
},
"builders": [{
"type": "amazon-ebs",
"access_key": "{{user `aws_access_key`}}",
"secret_key": "{{user `aws_secret_key`}}",
"region": "us-east-1",
"source_ami_filter": {
"filters": {
"virtualization-type": "hvm",
"name": "ubuntu/images/*ubuntu-xenial-16.04-amd64-server-*",
"root-device-type": "ebs"
},
"owners": ["099720109477"],
"most_recent": true
},
"instance_type": "t2.micro",
"ssh_username": "ubuntu",
"ami_name": "first_test_with_packer {{timestamp}}"
}]
}
Проверяем валидацию темплейта:
$ packer validate first_test_with_packer.json
Template validated successfully.
Создаем образ:
$ packer build \
-var 'aws_access_key=YOUR ACCESS KEY' \
-var 'aws_secret_key=YOUR SECRET KEY' \
first_test_with_packer.json
Если заэкспортить переменные, таким вот образом:
export AWS_ACCESS_KEY_ID="AWS_ACCESS_KEY_ID"
export AWS_SECRET_ACCESS_KEY="AWS_SECRET_ACCESS_KEY"
То запустить можно вот так:
$ packer build \
-var 'aws_access_key=$AWS_ACCESS_KEY_ID' \
-var 'aws_secret_key=$AWS_SECRET_ACCESS_KEY' \
first_test_with_packer.json
Пример использования Packer с Bash
Имеется такая структура папки:
$ tree
.
├── additional_folder
│ └── install_all_needed.sh
├── ami_structure.json
└── variables.sh
1 directory, 3 files
Структура AMI-шки (ami_structure.json) тут:
{
"variables": {
"aws_access_key": "{{env `AWS_ACCESS_KEY_ID`}}",
"aws_secret_key": "{{env `AWS_SECRET_ACCESS_KEY`}}",
"region": "{{env `AWS_REGION`}}",
"ami_name": "{{env `AWS_AMI_NAME`}}",
"ami_description": "{{env `AWS_AMI_DESCRIPTION`}}",
"ami_filters_name": "{{env `AWS_AMI_FILTERS_NAME`}}",
"ami_root_device_type": "{{env `AWS_AMI_ROOT_DEVICE_TYPE`}}",
"instance_type": "{{env `AWS_INSTANCE_TYPE`}}",
"virtualization_type": "{{env `AWS_VIRTUALIZATION_TYPE`}}",
"ssh_username": "{{env `AWS_SSH_USERNAME`}}",
"vpc_id": "{{env `AWS_VPC_ID`}}",
"subnet_id": "{{env `AWS_SUBNET_ID`}}",
"builders_name": "{{env `PACKER_BUILDERS_NAME`}}",
"builders_type": "{{env `PACKER_BUILDERS_TYPE`}}"
},
"builders": [
{
"name": "AWS AMI Builder ----",
"ami_description": "Amazon Linux test AMI by captain",
"type": "amazon-ebs",
"associate_public_ip_address": "true",
"access_key": "{{user `aws_access_key`}}",
"ami_name": "{{user `ami_name` | clean_ami_name}}",
"instance_type": "{{user `instance_type`}}",
"region": "{{user `region`}}",
"secret_key": "{{user `aws_secret_key`}}",
"vpc_id": "{{user `vpc_id`}}",
"subnet_id": "{{user `subnet_id`}}",
"ssh_username": "{{user `ssh_username`}}",
"source_ami_filter": {
"filters": {
"virtualization-type": "{{user `virtualization_type`}}",
"name": "{{user `ami_filters_name`}}",
"root-device-type": "{{user `ami_root_device_type`}}"
},
"owners": [
"137112412989", "591542846629", "801119661308",
"102837901569", "013907871322", "206029621532",
"286198878708", "443319210888"
],
"most_recent": true
},
"tags": {
"Name": "{{user `ami_name`}}"
},
"run_tags": {
"Name": "{{user `ami_name`}}"
},
"run_volume_tags": {
"Name": "{{user `ami_name`}}"
},
"snapshot_tags": {
"Name": "{{user `ami_name`}}"
}
}
],
"provisioners": [
{
"type": "shell",
"script": "./additional_folder/install_all_needed.sh"
},
{
"type": "shell",
"inline": [
"sudo yum install python-pip python-wheel -y",
"whereis pip",
"whereis python"
]
}
]
}
Переменные которые сторит заэкспортить (variables.sh файл):
#!/usr/bin/env bash
# vars for AWS
export AWS_ACCESS_KEY_ID="AWS_ACCESS_KEY_ID"
export AWS_SECRET_ACCESS_KEY="AWS_SECRET_ACCESS_KEY"
export AWS_REGION="us-east-1"
export AWS_AMI_NAME="packer-linux-aws-demo"
export AWS_AMI_FILTERS_NAME="amzn2-ami-hvm-2.0.????????-x86_64-gp2"
export AWS_AMI_ROOT_DEVICE_TYPE="ebs"
#export AWS_AMI_DESCRIPTION="Amazon Linux test AMI by captain"
export AWS_INSTANCE_TYPE="t2.micro"
export AWS_VIRTUALIZATION_TYPE="hvm"
export AWS_SSH_USERNAME="ec2-user"
export AWS_VPC_ID=""
export AWS_SUBNET_ID=""
#
#export PACKER_BUILDERS_NAME="AWS AMI Builder ----"
#export PACKER_BUILDERS_TYPE="amazon-ebs"
# Debuging packer configuration
export PACKER_LOG=""
export PACKER_LOG_PATH=""
Вспомогательный баш-скрипт (additional_folder/install_all_needed.sh):
#!/usr/bin/env bash
echo "Runs localy"
Простой баш-файл, взял для теста.
И так, запустим экспорт переменных:
$ bash variables.sh
Затем, можно проверить валидацию:
$ packer validate ami_structure.json
[warning] Fixable configuration found.
You may need to run `packer fix` to get your build to run
correctly. See debug log for more information.
Template validated successfully.
Для билда выполняем:
$ packer build ami_structure.json
Пример использования Packer с Ansible
Более сложный вариант, соберу материал до кучи и дополню статью…..
Вот и все, статья «Установка packer в Unix/Linux» завершена.