Установка packer в Unix/Linux

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» завершена.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.