Комментарии 31
И второе верно подмечено. Терраформ = BreakingChanges'R'Us (ВсёЛомающиеОбновленияЭтоМы).
Как лучше в таком случае поступить?
Это не совсем о "паттернах". То, что вы говорите звучит, как странная бизнес-логика. Теоретически, такие проверки не вызовут ужаса у читающего код (уже 50% успеха), но и восторга все эти when тоже не вызывают. Идеальным вариантом было бы иметь модуль, который и проверит, и обновит, и в коде будет понятно читающему о чём речь.
Я бы написал так:
- copy:
content: 'This is a required content'
dest: /path/to/file
register: file_copy_result
- meta: end_host
when: not file_copy_result.changed
Однако скорее всего в логике "пропустить хост если файл уже имеет правильное содержимое" кроется ошибка. Предположим если содержимое неверное, то вы ещё хотите сделать A,B,C,D. И в какой-то момент при запуске плейбука он ломается на действии B. Вы устраняете проблему, вновь запускаете плейбук, а уже всё, файл в нужном состоянии и C,D выполнены не будут.
У нас в продакшене есть такой паттерн — делать dist-upgrade и ребутать (если пендится) хост при провизе, но никогда не делать этого в продакшене.
Выглядит это просто (пишу псевдокодом)
- setup
- end_host
when: ansible_local.tier == production
- dist-upgrade
- reboot
- file: dest=/etc/ansible/tier.fact content=production
И всё. Как только отработала, второй раз не будет. (Что как раз и требуется, чтобы неожиданно не ребутать продакшен. У ops команды своя техника апдейтов для уже запущенных систем).
Цель плейбуки привести файл в нужное состояние.
Верно ли я понимаю, что лучшим методом будет копировать этот файл из репы безусловно на хост, перезаписывая если такой уже есть?
Не понял претензии, шаред стейт и локи есть из коробки (s3 + dynamodb например).
гы ) в приватной инфре, если ты не хочешь отдавать стейт файл наружу (а он содержит сенситив данные, так-то), то s3 и dynamodb нет. А базовый S3 ( если речь, скажем, про минио) — локов нет. Короче, Хашикорп — молодцы, тут спору нет, смогли терраформом заморочить голову потребителю, но по факту — использование этого крутого (он действительно крутой) инструментарий — это как бег с препятствиями. ЗАЧЕМ? Если все то же самое можно сделать в 100 раз проще?
Терраформ по крайней мере не прибит гвоздями к конкретному провайдеру/стеку.
это звучит смешно, потому что обещания очень большие, но чтобы сделать реально кросс-клауд — что на ансибле, что на терраформе придётся писать свои роли/модули, которые инкапсулируют в себя специфику конкретного провайдера. 1:1
Я уж не говорю о том, что между разными провайдерами тупо может не быть соответствующих похожих примитивов
http, consul и тд…
эм, там тоже блокировки не везде, а без них — терраформом попросту опасно пользоваться. Хотя можно административно в пайплайне вызова TF что-то накостылить самому, но это точно не совсем production использование )))
Если вы про cloudformation/heat так там свои грабли есть
у каждого инструмента есть свои недостатки )))
я имею ввиду ситуацию если у меня часть инфры в GCP, часть в амазоне, часть akamai, а часть это просто алерты в NewRelic то я все это покрываю терраформом и единым вокрфлоу.
я накидывал коллегам… а чего не https://www.pulumi.com например?
я вам перечислил те где есть.
my bad, consul — да, есть, но его тащить надо, а http — там извращаться со своей разработкой.
Ни слова про saltstack плаки плаки… А штука крутая… Хотя и порог входа сильно выше, чем у ансибла, НО ЭТО И ХОРОШО (!), как это парадоксально и ни было
Касательно Tower — очень интересно было бы сравнить его с Rundeck, Polemarch, StackStorm — что там еще модно?
Xудшие практики для Ansible. Георгий Шуклин