Установка 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» завершена.