Terraform: инфраструктура на уровне кода | страница 27
•Процедурный код не полностью охватывает состояние инфраструктуры. Даже если вы прочитаете все три предыдущих шаблона Ansible, вы все равно не будете знать, что у вас развернуто. Помимо прочего, вам должен быть известен порядок, в котором эти шаблоны были применены. Если применить их не в том порядке, можно получить другую инфраструктуру, и этого нельзя увидеть по одной лишь кодовой базе. Иными словами, чтобы разобраться в коде Ansible или Chef, вам нужно знать историю всех изменений, которые когда-либо произошли.
•Процедурный код ограничивает повторное использование. Универсальность процедурного кода всегда ограничена, так как вам приходится самостоятельно учитывать текущее состояние инфраструктуры. Поскольку оно постоянно меняется, код, который вы использовали неделю назад, может оказаться неактуальным, если состояние инфраструктуры, на которое он был рассчитан, больше не существует. В итоге процедурные кодовые базы со временем разрастаются и усложняются.
Благодаря декларативному подходу Terraform код всегда описывает текущее состояние вашей инфраструктуры. Вы можете с одного взгляда определить, что сейчас развернуто и как оно сконфигурировано, не заботясь об истории изменений или синхронизации. Это также облегчает написание кода, пригодного для повторного использования, поскольку вам не нужно самостоятельно учитывать текущее состояние окружающего мира. Вместо этого вы можете сосредоточиться лишь на описании нужного вам состояния, а Terraform автоматически сообразит, как к нему перейти. Поэтому кодовая база Terraform обычно остается компактной и понятной.
Конечно, у декларативного подхода есть свои недостатки. Отсутствие доступа к полноценному языку программирования сказывается на выразительности. Например, некоторые виды изменения инфраструктуры, такие как развертывание без простоя, сложно (но реально, как вы увидите в главе 5) выразить в чисто декларативном стиле. Аналогично ограниченные средства описания «логики» (такие как условные выражения и циклы) делают непростым написание универсального кода, который можно применять повторно. К счастью, Terraform предоставляет ряд мощных примитивов: входные и выходные переменные, модули, create_before_destroy, count, тернарный синтаксис и встроенные функции. Все это позволяет писать чистый, конфигурируемый, модульный код даже на декларативном языке. Мы вернемся к этим темам в главах 4 и 5.
Наличие или отсутствие центрального сервера