Обзор этой статьи призван показать вам, как развернуть инстанс Bitnami Jenkins на инстансе Amazon EC2 с помощью Terraform. Эта статья ни в коем случае не лучший способ выполнить эту задачу и включает ли она лучший в мире скрипт терраформирования, но она объясняет и показывает, как начать создавать экземпляр EC2 на AWS.
Требования
- Аккаунт AWS
- AWS CLI
- Профиль по умолчанию, настроенный с помощью интерфейса командной строки AWS
- Интерфейс командной строки Terraform
Почему бы не создать экземпляр в консоли AWS EC2.
Да, вы можете просто создать свой экземпляр в консоли AWS EC2, именно так я выполнял эту задачу в течение многих лет. Но это ручной шаг, и в мире DevOps мы должны пытаться автоматизировать там, где это возможно, и это не должно быть исключением.
Шаги
- Настройте поставщика 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 входных параметра / переменных.
- jenkinsInstanceName: имя экземпляра EC2, созданного на AWS.
- public_key: это содержимое вашего локального файла открытого ключа. Этот открытый ключ будет создан на AWS, и вы сможете использовать связанный закрытый ключ для входа в свой экземпляр EC2 после его создания.
variable "jenkinsInstanceName" { type = string } variable "public_key" { type = string }
3. Переменные скрипта настройки
Устанавливаются еще три переменные. Они отличаются от входных переменных тем, что пользователю не будет предложено ввести эти значения из-за наличия значения по умолчанию.
- instance_type: это размер создаваемого экземпляра EC2 - по умолчанию t3.small, чтобы снизить затраты.
- ingress_rules: они используются для настройки групп безопасности. Эти порты определяют разрешенные порты для приема входящего трафика.
- 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 для этого руководства можно найти здесь.