Дженкинс как код | Кодементор

Мне нужен был новый сервер Jenkins для стороннего проекта, и я не хотел слишком беспокоиться о том, что он станет произведением искусства. Часто серверы Jenkins, с которыми я сталкивался, были в сети более 300 дней, что означает, что они не получают важных обновлений программного обеспечения и потенциально уязвимы. Это результат того, что он просто продолжает работать, не желая терять какую-либо информацию о конфигурации или сборке, а также потому, что поддержание Jenkins в актуальном состоянии может быть немного обременительным, поскольку новые версии выходят каждую неделю. В итоге вы создаете сервер-снежинка, который боитесь потерять.

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

Я также хотел изучить новый, легкий способ объединения инструментов в цепочку при использовании Terraform. Я сделал это для SSH и Ansible, но не вижу причин, по которым тот же подход не работал бы ни с одним программным обеспечением. Я понятия не имею, как это назвать, но я буду использовать Terraform для создания команд, которые пользователь сможет запускать после успешного применения Terraform.

Проект можно найти на GitHub здесь:

Технический стек

Проект состоит из одного модуля Terraform и двух плейбуков Ansible.

Terraform отвечает за создание капли, закрытых ключей, сертификата LetsEncrypt и проверку. После запуска Terraform предоставит команду, необходимую для запуска плейбуков Ansible. Я не видел такого подхода к соединению Terraform и Ansible вместе, поэтому я думаю, что нужно немного больше объяснений.

TFX-команды

Terraform позволяет указать выходные данные, которые затем можно использовать для связывания других модулей или инструментов. В прошлом я использовал выходные данные в формате JSON, передавал их в JQ, чтобы получить нужные мне биты информации, а затем передавал эти значения в пользовательский сценарий. Это будет выглядеть примерно так:

terraform output -json servers \
  | jq -r '.server_ips|.value|join(" ")' \
  | verify_deployment.sh

Это может быть немного многословно, и это, конечно, нелегко запомнить, особенно если у вас сложный селектор JQ.

Новая идея проста. Предоставьте Terraform всю информацию, необходимую для подачи команд Ansible и Compose Bash в выходные данные Terraform.

Их довольно легко сочинять и исполнять. Ниже приведен пример того, как этот шаблон будет работать, и вы найдете рабочие примеры в вывод.tf (все работает через tfx ssh, tfx ansibleа также tfx sync_jobs)

variable "server_name" {}

output "ssh" {
  value = "ssh ${var.server_name}"
}

После запуска terraform apply затем мы можем запустить команду SSH в Bash, используя $(terraform output ssh)

tfx команда, сокращенно от Terraform execute, добавляет немного синтаксического сахара, чтобы сделать это проще, и становится просто tfx ssh.

Это упрощенный пример, но я надеюсь, вы увидите, как он расширен в моем проекте. Ниже приведена команда Ansible playbook для настройки сервера. Посмотрите, как все аргументы и динамический ввод схлопываются в tfx ansible!

output "ansible" {
  sensitive = true
  value = "ansible-playbook -u root --private-key ${local_file.private.filename} -i ${digitalocean_droplet._.ipv4_address}, --extra-vars domain_name=${digitalocean_record._.fqdn} --extra-vars jenkins_admin_password=${var.admin_password} --extra-vars host_key_checking=False ansible/jenkins.yaml"
}

Это выведет что-то вроде:

$ terraform output ansible
ansible-playbook -u root --private-key /path/to/the/generated/key -i 123.123.123.123, --extra-vars domain_name=jenkins.example.com --extra-vars jenkins_admin_password=1234 --extra-vars host_key_checking=False ansible/jenkins.yaml

В качестве бонуса команда не отображается в терминале при запуске через $(terraform output ansible)!

Разработка инфраструктуры как кода (IaC)

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

Циклические ссылки

Циклические ссылки с Terraform могут быть проблемой. Иногда вам просто нужно, чтобы несколько вещей появились одновременно, чтобы Terraform полностью управлял всеми аспектами вашего проекта.

Один из примеров этого, с которым я столкнулся, был при попытке заставить работать сертификаты LetsEncrypt. Я хотел бы разместить сертификаты на сервере с помощью файловых поставщиков Terraform, однако сертификат зависел от доменного имени, а доменное имя зависело от дроплета.

Из-за этой циклической ссылки мне пришлось поместить сертификат, сгенерированный Terraform, в файловую систему, а затем поместить его на сервер с помощью Ansible.

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

Итерируйте быстро и регулярно уничтожайте

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

Сжигая вещи дотла время от времени, вы укрепляете уверенность в своем коде, и ваш проект становится более устойчивым.

Заключительные мысли и следующие шаги

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

  • Управление пользователями — обычно мне нравится использовать Плагин GitHub OAuth так что управление пользователями может осуществляться через GitHub.
  • Управление учетными данными. Это область, которую мне нужно изучить подробнее, но я предполагаю, что Поставщик GitHub позволит мне автоматизировать довольно много этого процесса.
  • Настройка подчиненного пула Jenkins, который позволит мне увеличивать или уменьшать емкость по мере необходимости без необходимости приобретать главный сервер большего размера.
  • Перенос большей части конфигурации на переменные Terraform.
  • Сделайте его более независимым от облака. Это одна из лучших функций Terraform, и я мог бы использовать ее, настроив поставщика, которого вы хотели бы использовать (поддерживаются десятки).

Дальнейшее чтение

Если вы новичок в Terraform, я настоятельно рекомендую следовать их Введение а также Руководство по началу работы. Они обеспечивают очень прочную основу для понимания того, как управлять всей вашей инфраструктурой с помощью Terraform.

Этот пост от Aukjan заставил меня задуматься о различных способах заставить эти инструменты работать вместе без лишней суеты. Я определенно рекомендую его пост под названием Инвентарь Ansible, сгенерированный из Terraform.

Похожие записи

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

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