Обзор этой статьи призван показать вам, как развернуть инстанс Bitnami Jenkins на инстансе Amazon EC2 с помощью Terraform. Эта статья ни в коем случае не лучший способ выполнить эту задачу и включает ли она лучший в мире скрипт терраформирования, но она объясняет и показывает, как начать создавать экземпляр EC2 на AWS.

Требования

  1. Аккаунт AWS
  2. AWS CLI
  3. Профиль по умолчанию, настроенный с помощью интерфейса командной строки AWS
  4. Интерфейс командной строки Terraform

Почему бы не создать экземпляр в консоли AWS EC2.

Да, вы можете просто создать свой экземпляр в консоли AWS EC2, именно так я выполнял эту задачу в течение многих лет. Но это ручной шаг, и в мире DevOps мы должны пытаться автоматизировать там, где это возможно, и это не должно быть исключением.

Шаги

  1. Настройте поставщика AWS.

Это сообщает terraform, какую версию поставщика AWS использовать, а также регион AWS для развертывания. В нашем случае мы разворачиваем к нам-восток-1

terraform {
  required_providers {
   aws = {
      source  = "hashicorp/aws"
      version = "~> 3.0"
   }
  }
}
# Configure the AWS Provider
provider "aws" {
   region = "us-east-1"
}

2. Настройте входные параметры

Для этого варианта использования есть 2 входных параметра / переменных.

  1. jenkinsInstanceName: имя экземпляра EC2, созданного на AWS.
  2. public_key: это содержимое вашего локального файла открытого ключа. Этот открытый ключ будет создан на AWS, и вы сможете использовать связанный закрытый ключ для входа в свой экземпляр EC2 после его создания.
variable "jenkinsInstanceName" {
   type = string
}
variable "public_key" {
   type = string
}

3. Переменные скрипта настройки

Устанавливаются еще три переменные. Они отличаются от входных переменных тем, что пользователю не будет предложено ввести эти значения из-за наличия значения по умолчанию.

  1. instance_type: это размер создаваемого экземпляра EC2 - по умолчанию t3.small, чтобы снизить затраты.
  2. ingress_rules: они используются для настройки групп безопасности. Эти порты определяют разрешенные порты для приема входящего трафика.
  3. egress_rules: они также используются для настройки групп безопасности. Эти порты определяют разрешенные порты для публикации исходящего трафика на
variable "instance_type" {
   type    = string
   default = "t3.small"
}
variable "ingress_rules" {
  type    = list(number)
  default = [22, 80, 443]
}
variable "egress_rules" {
   type    = list(number)
   default = [0]
}

4. Создайте ключ AWS EC2

Этот ресурс создаст ключ с именем jenkins-key, используя значения, которые были отправлены для входной переменной public_key.

resource "aws_key_pair" "jenkins_key" {
   key_name   = "jenkins-key"
   public_key = var.public_key
}

5. Найдите правильный идентификатор AMI для использования

На этом шаге использовался источник данных terraform. Источник данных terraform позволяет вам найти значение, которое будет использоваться в другом месте вашей конфигурации terraform. В этом случае мы используем источник данных aws_ami_ids.

Источник данных будет запрашивать идентификаторы AMI, которые принадлежат aws-marketplace, и начинать со значения, называемого bitnami-jenkins. Мы собираемся развернуть версию Jenkins для Bitnami.

Установив для sort_ascending значение false, будет возвращен список всех идентификаторов AMI, начиная с самого нового. Это значение будет использоваться далее в нашем скрипте при создании экземпляра EC2.

Но почему бы просто не установить AMI id и не возиться с этим источником данных terraform?

Это хороший вопрос (поскольку я понимаю, что говорю сам с собой). Без жесткого кодирования AMI ID мы можем развернуть этот код в любом регионе AWS. Идентификатор AWS AMI уникален для каждого региона, поэтому, если бы мы развернули этот код на us-east-2, идентификатор AWS AMI был бы другим.

[Примечание: я устанавливаю регион в блоке провайдера AWS. Этого можно было избежать, установив регион AWS по умолчанию при настройке интерфейса командной строки AWS.]

data "aws_ami_ids" "jenkins_ami" {
   sort_ascending = false
   owners = ["aws-marketplace"]
   filter {
      name   = "name"
      values = ["bitnami-jenkins*"]
   }
}

6. Настройте группы безопасности

Этот шаг включает в себя настройку групп безопасности AWS для определения трафика, разрешенного для входа и выхода из экземпляра Jenkins.

Для этого ресурса мы используем динамические блоки и указанные ранее переменные ingress_rules и egress_rules. Динамические блоки позволяют избежать повторения кодовых блоков. Думайте об этом как о цикле для настройки групп безопасности.

resource "aws_security_group" "jenkins_security_group" {
   name        = "Jenkins Security Group"
   description = "Allow traffic to access Jenkins instrance"
   dynamic "ingress" {
      iterator = port
      for_each = var.ingress_rules
      content {
        from_port   = port.value
        to_port     = port.value
        protocol    = "TCP"
        cidr_blocks = ["0.0.0.0/0"]
     }
   }
   dynamic "egress" {
      iterator = port
      for_each = var.egress_rules
      content {
        from_port   = port.value
        to_port     = port.value
        protocol    = "-1"
        cidr_blocks = ["0.0.0.0/0"]
     }
  }
}

7. Создать экземпляр Bitnami Jenkins EC2

Это основная часть этого урока, где и происходит действие.

Здесь создается экземпляр Amazon EC2 с образом Bitnami Jenkins. Это разбивка параметров, переданных в ресурс terraform aws_instance

ami: это используемый идентификатор AMI. data.aws_ami_ids.jenkins_ami относится к источнику данных, в котором мы искали идентификаторы экземпляров Bitnami Jenkins. Берем первый результат ([0]), который будет соответствовать новейшему AMI id для Bitnami Jenkins.

instance_type: Тип создаваемого экземпляра. Это значение получается из переменной instance_type, которая была определена в верхней части этой статьи.

security_groups: группа безопасности, назначаемая этому экземпляру EC2. Группа безопасности была создана выше в этой статье и использовала динамические блоки.

key_name: ключ, используемый для разрешения ssh'инга на этот экземпляр. Опять же, открытый ключ был принят как вводимый пользователем, и на его основе был создан ключ EC2.

теги: теги, применяемые к этому экземпляру. Тег Name важен, и он соответствует входному параметру, который был предоставлен пользователем для jenkinsInstanceName.

depends_on: в этом блоке указано, что экземпляр EC2 не должен создаваться до тех пор, пока группа безопасности jenkins_security_group не будет успешно создана.

resource "aws_instance" "jenkins_instance" {
   ami             = data.aws_ami_ids.jenkins_ami.ids[0]
   instance_type   = var.instance_type
   security_groups =[aws_security_group.jenkins_security_group.name]
   key_name        = aws_key_pair.jenkins_key.key_name
   tags = {
     Name = var.jenkinsInstanceName
   }
  depends_on = [aws_security_group.jenkins_security_group]
}

8. Вывести идентификатор экземпляра

Последний шаг в процессе включает вывод созданного instanceid. Этот идентификатор экземпляра будет выведен, когда сценарий terraform завершит выполнение.

output "jenkins_public_ip" {  
   description = "The ip address for the newly created jenkins instance"  
  value       = aws_instance.jenkins_instance.public_ip
}

9. Создайте ресурсы

Выполните эти команды, чтобы создать ресурсы на AWS.

terraform init - устанавливает поставщика AWS и настраивает все созданные модули

terraform apply - применит конфигурацию. Эта команда предлагает пользователю ввести jenkinsInstanceName и общедоступный sshKey. Он также предлагает пользователю одобрить создание ресурсов.

terraform apply -var = ”jenkinsInstanceName = [НАЗВАНИЕ ЭКЗАМЕНА]” -var = ”public_key = [PUBLIC SSH KEY]” -auto-Approve - эта команда не будет запрашивать у пользователя и создаст необходимые ресурсы.

например Terraform применять -var =»jenkinsInstanceName = JenkinsServer» -var =»public_key = SSH-RSA AAAAB3NzaC1yc2EAAAADAQABAAABAQD3F6tyPEFEzV0LX3X8BsXdMsQz1x2cEikKDEY0aIj41qgxMCP ​​/ iteneqXSIFZBp5vizPvaoIR3Um9xK7PGoW8giupGn + EPuxIA4cDM4vzOqOkiMPhz5XK0whEjkVzTo4 + S0puvDZuwIsdiW9mxhJc7tgBNL0cYlWSYVkz4G / fslNfRPW5mYAM49f4fhtxPb5ok4Q2Lg9dPKVHO / Bgeu5woMc7RY0p1ej6D4CKFE6lymSDJpW0YHX / wqE9 + cfEauh7xZcG0q9t2ta6F6fmX0agvpFyZo8aFbXeUBr7osSCJNgvavWbM / 06niWrOvYX2xwWdhXmXSrbX8ZbabVohBK41[email protected]» -auto одобрить

10. Получите пароль для Bitnami Jenkins

Первый шаг вручную включает получение пароля для экземпляра Bitnami Jenkins. Нам нужно подключиться к экземпляру по SSH и получить пароль из файла. Можно использовать следующие команды, просто замените своими значениями путь к закрытому ключу ssh и общедоступный IP-адрес экземпляра EC2.

ssh -i [PATH TO PRIVATE SSH KEY] bitnami@[EC2 INSTANCE PUBLIC IP]
sudo cat /home/bitnami/bitnami_credentials

11. Jenkins установлен

Когда вы через несколько секунд перейдете к IP-адресу, полученному на шаге 8, вы должны увидеть следующий экран, на котором настроен Jenkins. Войдите в систему с именем пользователя и паролем, полученным на шаге 10, чтобы начать использовать Jenkins.

12. Уничтожить инфраструктуру

Если вы просто тестируете это руководство или больше не нуждаетесь в экземпляре Jenkins, выполните следующую команду, чтобы удалить стек.

Примечание. Если вы оставите стек включенным, с вас может взиматься плата со стороны AWS. Пользователь должен убедиться, что у него работает инфраструктура, за которую он готов платить.

Заключение

Это было краткое руководство, показывающее, как настроить экземпляр Bitnami Jenkins на инстансе Amazon EC2. Опять же, это не исчерпывающее руководство, и его следует использовать для начала. Можно вносить и улучшать настройки и улучшения, но, надеюсь, эта статья поможет вам начать свой путь с Jenkins.

Полный файл конфигурации terraform для этого руководства можно найти здесь.