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

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

Terraform — это инструмент для создания, изменения и управления структурой безопасно и эффективно. Он может управлять существующими и популярными облачными сервисами ( Google Cloud, AWS).

Файлы конфигурации описывают Terraform компоненты, необходимые для запуска одного приложения или всего вашего стека. Данная утилита, создает план выполнения, описывающий, что он будет делать, чтобы достичь желаемого состояния, а затем выполняет его для создания описанной инфраструктуры. По мере изменения конфигурации Terraform может определить, что изменилось и создать инкрементные планы выполнения, которые могут быть применены.

В инфраструктуру Terraform могут быть включены компоненты низкого уровня, такие как вычислительные экземпляры, хранилища и сети, а также компоненты высокого уровня, такие как записи DNS, функции SaaS и т. д.

Установка terraform в CentOS/Fedora/RedHat

Если у вас еще используется 32-битная ОС, то вы можете использовать следующую ссылку чтобы скачать ПО:

# cd /usr/local/src && curl -O https://releases.hashicorp.com/terraform/0.10.7/terraform_0.10.7_linux_386.zip

Если у вас используется 64-битная ОС, то вы можете использовать следующую ссылку чтобы скачать ПО:

# cd /usr/local/src && curl -O https://releases.hashicorp.com/terraform/0.10.7/terraform_0.10.7_linux_amd64.zip

Если у вас используется ARM, то вы можете использовать следующую ссылку чтобы скачать ПО:

# cd /usr/local/src && curl -O https://releases.hashicorp.com/terraform/0.10.7/terraform_0.10.7_linux_arm.zip

PS: На момент написания статьи, я использовал самую новую версию данной утилиты. Данный продукт довольно быстро развиваеться и за ним нужно следить и скачивать самую новую версию (если есть необходимость). На официальном сайте можно скачать актуальную версию.

Установка terraform в Debian/Ubuntu

Если у вас еще используется 32-битная ОС, то вы можете использовать следующую ссылку чтобы скачать ПО:

# cd /usr/local/src && curl -O https://releases.hashicorp.com/terraform/0.10.7/terraform_0.10.7_linux_386.zip

Если у вас используется 64-битная ОС, то вы можете использовать следующую ссылку чтобы скачать ПО:

# cd /usr/local/src && curl -O https://releases.hashicorp.com/terraform/0.10.7/terraform_0.10.7_linux_amd64.zip

Если у вас используется ARM, то вы можете использовать следующую ссылку чтобы скачать ПО:

# cd /usr/local/src && curl -O https://releases.hashicorp.com/terraform/0.10.7/terraform_0.10.7_linux_arm.zip

PS: На момент написания статьи, я использовал самую новую версию данной утилиты. Данный продукт довольно быстро развиваеться и за ним нужно следить и скачивать самую новую версию (если есть необходимость). На официальном сайте можно скачать актуальную версию.

Установка terraform в Mac OS X

Для скачивания ПО, можно использовать следующу команду:

# cd /usr/local/src && curl -O https://releases.hashicorp.com/terraform/0.10.7/terraform_0.10.7_darwin_amd64.zip

PS: На момент написания статьи, я использовал самую новую версию данной утилиты. Данный продукт довольно быстро развиваеться и за ним нужно следить и скачивать самую новую версию (если есть необходимость). На официальном сайте можно скачать актуальную версию.

Установка terraform в FreeBSD

Если у вас еще используется 32-битная ОС, то вы можете использовать следующую ссылку чтобы скачать ПО:

# cd /usr/local/src && curl -O https://releases.hashicorp.com/terraform/0.10.7/terraform_0.10.7_freebsd_386.zip

Если у вас используется 64-битная ОС, то вы можете использовать следующую ссылку чтобы скачать ПО:

# cd /usr/local/src && curl -O https://releases.hashicorp.com/terraform/0.10.7/terraform_0.10.7_freebsd_amd64.zip

Если у вас используется ARM, то вы можете использовать следующую ссылку чтобы скачать ПО:

# cd /usr/local/src && curl -O https://releases.hashicorp.com/terraform/0.10.7/terraform_0.10.7_freebsd_arm.zip

PS: На момент написания статьи, я использовал самую новую версию данной утилиты. Данный продукт довольно быстро развиваеться и за ним нужно следить и скачивать самую новую версию (если есть необходимость). На официальном сайте можно скачать актуальную версию.

Установка terraform в OpenBSD

Если у вас еще используется 32-битная ОС, то вы можете использовать следующую ссылку чтобы скачать ПО:

# cd /usr/local/src && curl -O https://releases.hashicorp.com/terraform/0.10.7/terraform_0.10.7_openbsd_386.zip

Если у вас используется 64-битная ОС, то вы можете использовать следующую ссылку чтобы скачать ПО:

# cd /usr/local/src && curl -O https://releases.hashicorp.com/terraform/0.10.7/terraform_0.10.7_openbsd_amd64.zip

PS: На момент написания статьи, я использовал самую новую версию данной утилиты. Данный продукт довольно быстро развиваеться и за ним нужно следить и скачивать самую новую версию (если есть необходимость). На официальном сайте можно скачать актуальную версию.

Установка terraform в Solaris

Для скачивания ПО, можно использовать следующу команду:

# cd /usr/local/src && curl -O https://releases.hashicorp.com/terraform/0.10.7/terraform_0.10.7_solaris_amd64.zip

PS: На момент написания статьи, я использовал самую новую версию данной утилиты. Данный продукт довольно быстро развиваеться и за ним нужно следить и скачивать самую новую версию (если есть необходимость). На официальном сайте можно скачать актуальную версию.

Установка terraform для других Unix/Linux ОС

Можно попробовать скомпилировать данное ПО. Я работу не проверял, но разработчики выкладуют исходный код на гитхабе и его можно попробовать заюзать.

# cd /usr/local/src && git clone https://github.com/hashicorp/terraform.git

И дальше следовать инструкциям.

Настройка terraform в Unix/Linux

Скачать то архив упели, но нужно его еще и расспаковать и подготовить к работе.

# cd /usr/local/src; unzip terraform_*.zip && rm -f unzip terraform_*.zip

Перенесем файл:

# mv /usr/local/src/terraform /usr/local/bin/

PS: Если не прописан PATH для /usr/local/bin — стоит прописать его в .bash_profile!

Для всего этого дела, я создал скрипт:

# vim install_terraform.sh

Содержание у него следующее:

#!/bin/bash -x

# CREATED:
# vitaliy.natarov@yahoo.com
#
# Unix/Linux blog:
# http://linux-notes.org
# Vitaliy Natarov
#

function install_terraform () {
	#
	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/terraform/"
        Latest_terraform_version=$(curl -s "$site" --list-only | grep -E "terraform_" | grep -Ev "beta|alpha" | head -n1| cut -d ">" -f2| cut -d "<" -f1 | cut -d"_" -f2)
        URL_with_latest_terraform_package=$site$Latest_terraform_version
		#
		if [ "`uname -m`" == "x86_64" ]; then
 			Latest_terraform_package=$(curl -s "$URL_with_latest_terraform_package/" --list-only |grep -E "terraform_" | grep -E "linux_amd64"|cut -d ">" -f2| cut -d "<" -f1)
 			Current_link_to_archive=$URL_with_latest_terraform_package/$Latest_terraform_package
 		elif [ "`uname -m`" == "i386|i686" ]; then
 			Latest_terraform_package=$(curl -s "$URL_with_latest_terraform_package/" --list-only |grep -E "terraform_" | grep -Ev "(SHA256SUMS|windows)"| grep -E "linux_386"|cut -d ">" -f2| cut -d "<" -f1)
 			Current_link_to_archive=$URL_with_latest_terraform_package/$Latest_terraform_package	
 		fi	
 		echo $Current_link_to_archive
		cd /usr/local/src/ && wget $Current_link_to_archive &> /dev/null
		unzip $Latest_terraform_package
		rm -rf /usr/local/src/$Latest_terraform_package*
		yes|mv -f /usr/local/src/terraform /usr/local/bin/terraform
		chmod +x /usr/local/bin/terraform
	
	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/terraform/"
        Latest_terraform_version=$(curl -s "$site" --list-only | grep -E "terraform_" | grep -Ev "beta|alpha" | head -n1| cut -d ">" -f2| cut -d "<" -f1 | cut -d"_" -f2)
        URL_with_latest_terraform_package=$site$Latest_terraform_version	
		#
		if [ "`uname -m`" == "x86_64" ]; then
 			Latest_terraform_package=$(curl -s "$URL_with_latest_terraform_package/" --list-only |grep -E "terraform_" | grep -E "linux_amd64"|cut -d ">" -f2| cut -d "<" -f1)
 			Current_link_to_archive=$URL_with_latest_terraform_package/$Latest_terraform_package
 		elif [ "`uname -m`" == "i386|i686" ]; then
 			Latest_terraform_package=$(curl -s "$URL_with_latest_terraform_package/" --list-only |grep -E "terraform_" | grep -Ev "(SHA256SUMS|windows)"| grep -E "linux_386"|cut -d ">" -f2| cut -d "<" -f1)
 			Current_link_to_archive=$URL_with_latest_terraform_package/$Latest_terraform_package	
 		fi	
 		echo $Current_link_to_archive
		cd /usr/local/src/ && wget $Current_link_to_archive &> /dev/null
		unzip $Latest_terraform_package
		rm -rf /usr/local/src/$Latest_terraform_package*
		yes|mv -f /usr/local/src/terraform /usr/local/bin/terraform
		chmod +x /usr/local/bin/terraform
		# 
	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/terraform/"
		Latest_terraform_version=$(curl -s "$site" --list-only | grep -E "terraform_" | head -n1| cut -d ">" -f2| cut -d "<" -f1| cut -c8-)
		URL_with_latest_terraform_package=$site$Latest_terraform_version
		#	
		if [ "`uname -m`" == "x86_64" ]; then
			Latest_terraform_package=$(curl -s "$URL_with_latest_terraform_package/" --list-only |grep -E "terraform_" | grep -E "linux_amd64"|cut -d ">" -f2| cut -d "<" -f1)
 			Current_link_to_archive=$URL_with_latest_terraform_package/$Latest_terraform_package
 		elif [ "`uname -m`" == "i386|i686" ]; then
 			Latest_terraform_package=$(curl -s "$URL_with_latest_terraform_package/" --list-only |grep -E "terraform_" | grep -Ev "(SHA256SUMS|windows)"| grep -E "linux_386"|cut -d ">" -f2| cut -d "<" -f1)
 			Current_link_to_archive=$URL_with_latest_terraform_package/$Latest_terraform_package	
 		fi	
 		echo $Current_link_to_archive
		cd /usr/local/src/ && wget $Current_link_to_archive &> /dev/null
		unzip $Latest_terraform_package
		rm -rf /usr/local/src/$Latest_terraform_package*
		yes|mv -f /usr/local/src/terraform /usr/local/bin/terraform
		chmod +x /usr/local/bin/terraform
	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

        site="https://releases.hashicorp.com/terraform/"
        Latest_terraform_version=$(curl -s "$site" --list-only | grep -E "terraform_" | grep -Ev "beta|alpha" | head -n1| cut -d ">" -f2| cut -d "<" -f1 | cut -d"_" -f2)
        URL_with_latest_terraform_package=$site$Latest_terraform_version

		Latest_terraform_package=$(curl -s "$URL_with_latest_terraform_package/" --list-only |grep -E "terraform_"| grep -E "darwin_amd64" |cut -d ">" -f2| cut -d "<" -f1)
 		Current_link_to_archive=$URL_with_latest_terraform_package/$Latest_terraform_package
 		echo $Current_link_to_archive

		wget $Current_link_to_archive  -O /usr/local/src/$Latest_terraform_package &> /dev/null
        unzip /usr/local/src/$Latest_terraform_package -d /usr/local/src
		rm -f /usr/local/src/$Latest_terraform_package*
		yes|mv -f /usr/local/src/terraform /usr/local/bin/terraform
		chmod +x /usr/local/bin/terraform
	else
    	OS=$(uname -s)
    	VER=$(uname -r)
    	echo 'OS=' $OS 'VER=' $VER
	fi
}
install_terraform
echo "========================================================================================================";
echo "================================================FINISHED================================================";
echo "========================================================================================================";

Чтобы запустить установку, выполните:

# bash install_terraform.sh

Проверялось на Debian 8, CentOS 6/7 и MacOS X.

Как-то так.

Использование terraform в Unix/Linux

Для начала, можно проверить версию используемого ПО:

$ terraform version
Terraform v0.10.7

Установим полузную функцию, для этого, выполним:

$ terraform -install-autocomplete

Приступим к примерам….

Управление GitHub с помощью Terraform

Хотел бы рассказать и показать как я начал изучать terraform. Пример так себе, но взят с официального сайта. Структура выглядит следующим образом:

┌(captain@Macbook)─(✓)─(11:13 PM Thu Oct 19)
└─(~/Projects/terraform)─(1 files, 0b)─> tree
.
└── github
    ├── main.tf
    └── variables.tf

1 directory, 2 files

┌(captain@Macbook)─(✓)─(11:13 PM Thu Oct 19)
└─(~/Projects/terraform)─(1 files, 0b)─>

Т.е у меня имеется папка, где я надумал сохранять все свои проекты с терраформом (модули). В этой папке (~/Projects/terraform), я созадал мой первый модуль — github, у которого имеются 2 файла:

  • main.tf — Основной файл, всем описываем шаги (действия).
  • variables.tf — Будет использоватся для переменных.

Открываем файл:

# vim main.tf

И приводим к виду:

# Configure the GitHub Provider
provider "github" {
  token        = "${var.github_token}"
  organization = "${var.github_organization}"
  #base_url     = "${var.github_base_url}"
}

# Create terraform repo
resource "github_repository" "terraform_repo" {
  name              = "terraform-repo"
  description       = "My terraform repo"
  private           = false
  auto_init         = true
}

# Add a team to the organization
resource "github_team" "dev_team" {
  name        = "dev-team"
  description = "Dev team"
  privacy     = "secret"
}

# Add a team to the organization
resource "github_team" "prod_team" {
  name        = "prod-team"
  description = "Prod team"
  privacy     = "secret"
}

# Add a user to the organization
resource "github_membership" "dev_team" {
  username = "vnatarov"
  role     = "member"
}

И так, 1-й строчкой — задаем провайдера (в моем случае github). Вообще, имеется довольно много провайдеров (AWS, Azure, Google Cloud и так далее) и появляются новые. У заданного параметра имеется 2 поля:

  • token, — Это сгенерированные токен с гитхаба. Для этой темы, token должен иметь repo, admin:org и delete_repo разрешения.
  • organization — Название организации.
  • base_url — Для интерпрайс юзеров, нужно будет задать УРЛ самого гитхаба.

Дальше, давайте создадим репозиторий, например —   example-repo. И конечно же, я всегда стараюсь писать описания для каждого из действий.

Открываем файл:

# vim variables.tf

И приводим к виду:

variable "github_token" {
 default = "cffcfa3f2b231d2dd457a6d24453a722228a0333"
}
variable "github_organization" {
 default = "linux-notes"
}
variable "github_base_url" {
 default = "https://github.com"
}

Т.е, я задал стандартные значения для переменных которые использую в модуле.

Вроде бы все уже имеется. На все это дело,  я потратил часа 3 своего времени. Чтобы понять что и к чему…..

И так, пришло время инициализировать проект:

┌(captain@Macbook)─(✓)─(03:45 PM Fri Oct 20)
└─(~/Projects/terraform/github)─(2 files, 16b)─> terraform init

Initializing provider plugins...

The following providers do not have any version constraints in configuration,
so the latest version was installed.

To prevent automatic upgrades to new major versions that may contain breaking
changes, it is recommended to add version = "..." constraints to the
corresponding provider blocks in configuration, with the constraint strings
suggested below.

* provider.github: version = "~> 0.1"

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

┌(captain@Macbook)─(✓)─(03:46 PM Fri Oct 20)
└─(~/Projects/terraform/github)─(2 files, 16b)─>

Далее, выполняем «terraform plan» чтобы увидеть, какие изменения планируются применится на хитхабе:

┌(captain@Macbook)─(✓)─(01:07 AM Wed Oct 25)
└─(~/Projects/terraform/github)─(2 files, 16b)─> terraform plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.


------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  + github_membership.dev_team
      id:                 <computed>
      role:               "member"
      username:           "vnatarov"

  + github_repository.terraform_repo
      id:                 <computed>
      allow_merge_commit: "true"
      allow_rebase_merge: "true"
      allow_squash_merge: "true"
      auto_init:          "true"
      default_branch:     <computed>
      description:        "My terraform repo"
      full_name:          <computed>
      git_clone_url:      <computed>
      http_clone_url:     <computed>
      name:               "terraform-repo"
      private:            "false"
      ssh_clone_url:      <computed>
      svn_url:            <computed>

  + github_team.dev_team
      id:                 <computed>
      description:        "Dev team"
      name:               "dev-team"
      privacy:            "secret"

  + github_team.prod_team
      id:                 <computed>
      description:        "Prod team"
      name:               "prod-team"
      privacy:            "secret"


Plan: 4 to add, 0 to change, 0 to destroy.

------------------------------------------------------------------------

Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.


┌(captain@Macbook)─(✓)─(01:07 AM Wed Oct 25)
└─(~/Projects/terraform/github)─(2 files, 16b)─>

Выполняем «terraform apply» для внесения изменений. Это создаст реальный репозиторий на GitHub:

┌(captain@Macbook)─(✓)─(01:07 AM Wed Oct 25)
└─(~/Projects/terraform/github)─(2 files, 16b)─> terraform apply
github_membership.dev_team: Creating...
  role:     "" => "member"
  username: "" => "vnatarov"
github_team.dev_team: Creating...
  description: "" => "Dev team"
  name:        "" => "dev-team"
  privacy:     "" => "secret"
github_repository.terraform_repo: Creating...
  allow_merge_commit: "" => "true"
  allow_rebase_merge: "" => "true"
  allow_squash_merge: "" => "true"
  auto_init:          "" => "true"
  default_branch:     "" => "<computed>"
  description:        "" => "My terraform repo"
  full_name:          "" => "<computed>"
  git_clone_url:      "" => "<computed>"
  http_clone_url:     "" => "<computed>"
  name:               "" => "terraform-repo"
  private:            "" => "false"
  ssh_clone_url:      "" => "<computed>"
  svn_url:            "" => "<computed>"
github_team.prod_team: Creating...
  description: "" => "Prod team"
  name:        "" => "prod-team"
  privacy:     "" => "secret"
github_team.dev_team: Creation complete after 1s (ID: 2532174)
github_team.prod_team: Creation complete after 1s (ID: 2532175)
github_membership.dev_team: Creation complete after 2s (ID: linux-notes:vnatarov)
github_repository.terraform_repo: Creation complete after 3s (ID: terraform-repo)

Apply complete! Resources: 4 added, 0 changed, 0 destroyed.

┌(captain@Macbook)─(✓)─(01:08 AM Wed Oct 25)
└─(~/Projects/terraform/github)─(3 files, 24b)─>

Смотрим что получилось:

организация в гитхаб

Смотрим кто входит:

Люди которые входят в организацию на гитхабе

Смотрим созданные команды:

Созданные команды на гитхаб

Смотрим что все работает и для первого опыта покатит.

PS: Организацию я создавал руками! Я не мог понять как ее можно создать автоматически.

На этом у меня все, статья «Установка terraform в Unix/Linux» завершена.

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

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

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