Статьи

Агротехнические машины и приложения для защиты окружающей среды

Примечание куратора:   Если вам нужен инструмент для быстрого определения, создания экземпляров и управления средами, лучше всего подойдет инструмент с открытым исходным кодом Terraform . Terraform интегрируется с EC2 и vShpere для раскрутки новых виртуальных машин в их собственной виртуальной сети. По сути, вы клонируете целые среды, а не только виртуальные машины.

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

Идентичный в этом смысле означает:

 

  • Puppet не знает, в какой среде находится машина. Наши факторные переменные предполагают, что среда — это производство.
  • Мы устанавливаем переменную RACK_ENV в рабочий режим, чтобы приложения не знали, в какой среде они находятся.
  • IP-адреса и имена хостов эквивалентных машин в производстве / подготовке идентичны

 

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

Единственное место, где мы делаем что-то другое в зависимости от среды, — это развертывание приложений из Jenkins .

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

Зачем мы это делаем?

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

Ранее мы заметили, что мы склонны писать операторы switch или if / else в марионеточном коде на основе среды, что означало, что машины настраивались по-разному в зависимости от среды.

Было несколько проблем с этим подходом, большинство из которых мы нашли решение.

Проблемы

Приложения, которые полагаются на знание своей среды

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

Например, у нас есть задание на обработку электронной почты, основанное на переменной RACK_ENV, и мы закончим обработку производственных электронных писем при постановке, если мы развернем там задание с RACK_ENV, установленным в «production».

Нашим временным исправлением для этого было изменение механизма развертывания приложения, чтобы эта работа не выполнялась поэтапно, а долгосрочное исправление — сделать ее независимой от среды.

Адресация машин вне сети

Иногда нам нужно подключать SSH к машинам через Jumpbox, и теперь это становится более сложным, поскольку машины на стадии производства и подготовки имеют идентичные IP-адреса и имена хостов.

Мы справились с этим с некоторым умом переписать имя хоста, если оно закончилось постановкой. ~ / .Ssh / конфигурационный файл читается так:

Host *.staging
  IdentityFile ~/.ssh/id_rsa 
  ProxyCommand sh -c "/usr/bin/ssh_staging %h %p"

И в / usr / bin / ssh_staging у нас есть следующее:

 HOSTNAME=`echo $1 | sed s/staging/production/`
 ssh staging-jumpbox1 nc $HOSTNAME $2

Если бы мы запустили следующую команду:

ssh some-box.staging

Это приведет нас к SSH на промежуточную перемычку и затем прокси-соединение SSH на some-box.production с помощью netcat.

Поскольку веб-приложения как в промежуточной, так и в рабочей среде имеют одно и то же полное доменное имя (FQDN), нам необходимо обновить наш файл / etc / hosts для доступа к промежуточной версии.

staging.ip     some-app.production.whatever.else

При SSHing вы не можете сказать, в какой среде находится машина

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

В итоге мы определили PS1 на основе общедоступного IP-адреса компьютера, который мы обнаружили, позвонив по адресу icanhazip.com.

В целом, несмотря на то, что изначально это было больно — и игра Shodhan — полностью взяла на себя большую часть этой боли — чтобы сделать это, я думаю, что это имеет смысл как идея, и я, вероятно, хотел бы, чтобы ее запекли с самого начала на чем-либо, над чем я работаю в будущем.