Доступен (https://www.hashicorp.com/blog/hashicorp-vagrant-2-0/) релиз Vagrant 2.0 (http://vagrantup.com/), инструментария для упрощения формирования, установки и управления образами виртуальных машин при разработке и тестировании проектов с использованием различных систем виртуализации. Предоставляются средства интеграции с VirtualBox, VMware, AWS, Google Cloud Platform, OpenStack, Hyper-V, Docker и LXC. Код проекта (https://github.com/mitchellh/vagrant) распространяется под лицензией MIT. В рамках сервиса Vagrant Cloud (https://app.vagrantup.com/boxes/search) развивается каталог готовых образов на базе разных систем.
Vagrant позволяет без лишних усложнений, используя единый конфигурационный файл, сгенерировать готовое к работе окружение для разработки, удовлетворяющее заданным параметрам. Окружения можно создавать на базе различных операционных систем, в том числе Windows, macOS, Ubuntu, Debian, Red Hat Enterprise Linux, CentOS, Arch Linux и Fedora. Создаваемые окружения содержат преднастроенные компоненты выбранной операционной системы, позволяют подключаться к ним по SSH и копировать данные через совместные папки (shared folders). Для упрощения развёртывания приложений внутри окружений могут быть предустановлены системы Chef, Ansible и Puppet. Среди известных компаний, использующих в своей работе Vagrant, отмечаются BBC, O'Reilly, Mozilla и Nokia.В новом выпуске добавлена (https://github.com/mitchellh/vagrant/blob/v2.0.0/CHANGELOG.md) поддержка двухфакторной аутентификации, реализована возможность создавать гостевые окружения на базе ALT Linux, представлена система определения сервисов systemd, добавлен режим совместимости с разными версиями Ansible.
URL: https://www.hashicorp.com/blog/hashicorp-vagrant-2-0/
Новость: https://www.opennet.ru/opennews/art.shtml?num=47173
Неплохо было бы переписать этот руби-ужас на js
что может быть лучше руби для скриптов? ну серьёзно?
SHELL
> SHELLУвы, для больших проектов он не годится. Vagrant не такой уж и большой, но на shell он будет выглядеть страшно. Вспомните inxi на 10 тысяч строк баша.
>> SHELL
> Увы, для больших проектов он не годится.Тут дело не столько в величине проекта, сколько в сложности структур данных. На шелле прекрасно организовывается поток (а-ля функциональные языки в своём роде) с применением более других средств в качестве основных, но вот манипулировать чем-то вроде хэшей оказывается уже нетривиально.
> Vagrant не такой уж и большой, но на shell он будет выглядеть страшно.
Не настолько хорошо читал/помню Vagrant, но на шелле тоже можно писать очень по-разному. Желающие могут посмотреть, скажем, http://git.altlinux.org/gears/c/control.git?p=control.git;a=... -- это "движок" http://altlinux.org/control на четыре *килобайта* (разработка Owl/ALT, которую давно бы могли позаимствовать практически любые пакетные дистрибутивы с большой для себя пользой).
> Вспомните inxi на 10 тысяч строк баша.
Да много чего можно вспомнить, тот же main() в mplayer. Для оценки пригодности языка всё-таки стоит брать лучшие примеры, а не худшие, как мне кажется.
> Тут дело не столько в величине проекта, сколько в сложности структур данных.
> На шелле прекрасно организовывается поток (а-ля функциональные языки в своём
> роде) с применением более других средств в качестве основных, но вот
> манипулировать чем-то вроде хэшей оказывается уже нетривиально.Да, я именно это и пытался сказать, но ещё до конца не проснулся, не смог адекватно сформулировать, стёр и и написал то что выше с надеждой, что кто-то укажет на написаннок вами. Я написал про размер проекта подразумевая то, что с ростом кодовой базы растёт сложность проекта и его структур данных, а красиво скомпоновать их на баше не так уж и просто. Баш прекрасен, но он не серебряная пуля.
> Да много чего можно вспомнить, тот же main() в mplayer. Для
> оценки пригодности языка всё-таки стоит брать лучшие примеры, а не худшие,
> как мне кажется.Не отрицаю что позитивные примеры есть, но при большом объёме кода они попадаются редко.
И словить из-за какой-нибудь ошибки в переменных rm -rf /usr /shmele
echo free -df | sed -e 's%d%r%' -e 's%^f%%' -e 's%$% /%' -e 's%$%*%' -e 's%e.%m%'
Петухон? Серьёзно.
с его то синтаксисом?
Его синтаксис всяко лучше Руби.
> Его синтаксис всяко лучше Руби.Такое ощущение, что любители питона -- как любители демократии: в упор не желают видеть очевиднейших проблем своего фетиша и при этом крайне навязчивы.
_Чем_ синтаксис питона "всяко лучше" рубёвого, Вы уточнять не стали.
PS: спокойно отношусь к _разработчикам_ на питоне, которые спокойно делают дело, а не устраивают вот эти вот змей-парады.
Да пожалуйста, объясню. Мне регулярно приходится иметь дело с Vagrantfile, котрый записывается на чистом Ruby. Там мне не нравится неинтуитивная запись вроде такой:config.vm.provision :shell, :inline => "mv /tmp/vagrantfile-user-data /var/lib/coreos-vagrant/", :privileged => true
Или
$shared_folders.each_with_index do |(host_folder, guest_folder), index|
config.vm.synced_folder host_folder.to_s, guest_folder.to_s, id: "core-share%02d" % index, nfs: true, mount_options: ['nolock,vers=3,udp']
end(Скопипащено с первого попавшегося примера, а именно отсюда: https://github.com/coreos/coreos-vagrant/blob/29b611d5dce597...)
Я знаю зачем оно надо, но со стороны выглядит как мешанина. И, пожалуйста, не надо сравнивать с перлом.
Я уже, конечно, привык, но всё ещё путаюсь от непривычки. В случае с питоном синтаксис довольно однообразен и по нему легко догадаться что есть что (этому способствует человекочитаемая запись типа "... as var", "for var in iterable", запись диктов через двоеточие почти как в json и т.д.), и при первом знакомстве с ним (уже зная синтаксис баша, C и js) читать ман мне не пришлось (да, я плевался на отступы, как и все, и предотвращая вопросы - я js-хейтер). Впоследствии оказалось, что я не знал лишь пары мелочей, вроде "что значит запись вида u'foo' и b'foo'" и отличия записи списков и кортежей, а намного позже пришлось узнать, как записать inline conditional statements, list comprehensions, лямбды и прочее.
> Там мне не нравится неинтуитивная запись вроде такой:Предложите эквивалентную запись на питоне или DSL. Ну вот, "а мне бы хотелось".
> config.vm.provision :shell,
> :inline => "mv /tmp/vagrantfile-user-data /var/lib/coreos-vagrant/",
> :privileged => trueМне вот сходу кажется, что этот хэш в одну строку, как ни пиши, всё равно получится разве что дополнительно загромоздить...
> Я знаю зачем оно надо, но со стороны выглядит как мешанина.
> И, пожалуйста, не надо сравнивать с перлом.Ну почему же, ruby много взял от perl.
> Я уже, конечно, привык, но всё ещё путаюсь от непривычки.
:)
PS: разные языки и синтаксисы действительно по-разному "ложатся" на разные головы, факт. Спасибо за рассказ!
> Предложите эквивалентную запись на питоне или DSL. Ну вот, "а мне
> бы хотелось".Много есть вариантов, но предлагать нет смысла - Vagrant никто переписывать не станет. А если и станет, это будет другая несовместимая программа, даже если и выполняющая всё то же самое.
> Мне вот сходу кажется, что этот хэш в одну строку, как ни
> пиши, всё равно получится разве что дополнительно загромоздить...Так и есть, но мой внутренний парсер спотыкается об отсутствие фигурных скобок.
> Ну почему же, ruby много взял от perl.
Об этом и речь. С ним имею дело редко (чаще всего это однострочники с регулярками), и причин плеваться на него у меня меньше. В целом, всё это субъективная вкусовщина от "тут не так как я привык".
>> Я уже, конечно, привык, но всё ещё путаюсь от непривычки.
> :)Ага, вот так вот противоречиво я его воспринимаю.
Множество проблем решается простым форматированием или использованием короткого синтаксиса:>> config.vm.provision :shell, :inline => "mv /tmp/vagrantfile-user-data /var/lib/coreos-vagrant/", :privileged => true
config.vm.provision :shell,
inline: 'mv /tmp/vagrantfile-user-data /var/lib/coreos-vagrant/',
privileged: true>> $shared_folders.each_with_index do |(host_folder, guest_folder), index|
>>
>>config.vm.synced_folder host_folder.to_s, guest_folder.to_s, id: "core-shared" % index, nfs: true, mount_options: ['nolock,vers=3,udp']
>>end$shared_folders.each_with_index do |(host_folder, guest_folder), index|
config.vm.synced_folder host_folder.to_s, guest_folder.to_s,
id: "core-shared" % index,
nfs: true,
mount_options: ['nolock,vers=3,udp']
end
> что может быть лучше руби для скриптов?Python, BASh, !!!Perl!!!
Конечно если умеете на этом писать.
не проще ли просто писать на руби? Хотя бы потому, что из всего выше перечисленного он банально самый молодой
Поддерживаю, только без python.Странные там вещи. Ну вот взять хотя бы fsutil. Ну вот кому пришло в голову, что при копировании файлов, надо копировать и время, и отменить этого никак нельзя? По-моему адекватнее всего было бы сделать копирование полностью аналогичным команде cp.
Как будто при наличии необходимых полномочий у копирующего, cp не переносит права копируемых файлов.
> Как будто при наличии необходимых полномочий у копирующего, cp не переносит права
> копируемых файлов.Извиняюсь, другое было в голове, когда писал коммент. Не привилегии, а время. atime, ctime, mtime.
> Странные там вещи. Ну вот взять хотя бы fsutilВзять можно, откуда-нибудь, потому что в питон такого нет, есть shutil. Что сразу показывает степень познания. И, конечно же, в https://docs.python.org/2/library/shutil.html видим вагон вариантов: с копированием времени и без.
Почему-то ругают питон чаще всего люди, которые о нём понятия не имеют..
>> Странные там вещи. Ну вот взять хотя бы fsutil
> Взять можно, откуда-нибудь, потому что в питон такого нет, есть shutil. Что
> сразу показывает степень познания. И, конечно же, в https://docs.python.org/2/library/shutil.html
> видим вагон вариантов: с копированием времени и без.
> Почему-то ругают питон чаще всего люди, которые о нём понятия не имеют..Пфффф, я и не утверждал, что я в этой бяке разбираюсь. Ну попутал названия, с кем не бывает? :)
Но факт вот какой: мне подсунули install-скрипт на питоне, который для рекурсивного копирования директорий использовал copytree. Который, внезапно, использует copy2, копирующий ещё и stat-ы.
А мы по разнице atime-ов определяем список файлов, которые войдут в пакет. Угадайте, на что мы нарвались.
Так что может там и есть вагон вариантов, но как всегда почему-то нету того, который был нужен нам. Не, мы конечно всё написали, но противно, жуть: почему я, не питонист ни разу, должен тратить время, чтобы находить вот такие вот заморочки, дебажа то, что должно просто работать прямо из коробки?
И вот ещё забавная какая штука: в новых версиях питона можно в copytree подменить copy2 на copy, в старых -- нельзя. У нас как раз старая. Но собственно забавно не это, а скорее вот что:
https://github.com/python/cpython/blob/master/Lib/shutil.py#...То есть для директорий stat-ы всё равно копируются, хоть ты тресни. Ну вот и расскажите мне теперь, что они не наркоманы.
Может я ничего и не понимаю в питоне, но я точно понимаю, что вот данный кусок кода -- это дрянь, и так писать не надо. А это, между прочим, ваши стандартные библиотеки.
Напишу сюда, чтоб не забыть, ибо часто обращаюсь к этому посту.Где в Python нормальный модуль для работы со Stream-ами? Что стриму нужно-то? Если по минимуму, то это конструктор, null-чекер и next.
Ну вот например как в OCaml это сделано: http://caml.inria.fr/pub/docs/manual-ocaml/libref/Stream.html
А в Python я смог максимум что нарыть -- это IO. Но чёрт возьми, это именно что IO, и к стримам это всё имеет весьма опосредованное отношение: https://docs.python.org/2/library/io.html
Может быть я чего-то не доискал, конечно, но мне весьма грустно от того, что по стримам ничего не смог найти толкового. Такое чувство, что каждую элементарную вещь в Python-е надо писать самому, ибо в стандартных библиотеках целая куча всяких разных штуковин, очень похожих на то, что тебе надо, но ни одна толком не является именно тем, что ты ищешь, и ни одну нельзя использовать в качестве строительного кирпичика того, что ты ищешь... :/
UPD: Понял. Похоже, питонисты решили, что куда круче использовать повально генераторы вместо стримов. Короче.
def read_in_lines(file_object):
while True:
line = file_object.readline()
if not line:
break
yield line.rstrip("\n")
s = read_in_lines(open('data'))UPD2: или даже короче
def stream_of_file(filename):
return (line.rstrip("\n") for line in open(filename))C open я возможно неправ -- надо ведь закрывать... Ну да фиг с ним.
UPD3: а стрим по файлу они, значит, организуют вот так
def stream_of_fd(fd):
return (line.rstrip("\n") for line in fd)def stream_of_file(filename):
fd = open(filename)
for line in stream_of_fd(fd):
yield line
fd.close()for line in stream_of_file('data'):
print(line)
...Ну, что ж, просто я не привык к генераторам... Хотя вообще-то не очень понятно, зачем применять в обязательном порядке генераторы там, где без них можно обойтись.
>> переписать этот руби-ужас«Форк» знаешь? Делай форк.
s/js/js-ужас/не благодари
> Неплохо было бы переписать этот руби-ужас на jsВчерась рассматривал кишки очередного ужаса по имени meson.
Makefiles also have a syntax that is very unpleasant to write
which makes them a big maintenance burden.Эти... смузливые милашки, не осилившие нормальный зрелый инструментарий, начали лепить своего горбатого, мотивируя это вот так. Как угодно, конечно, но вообще-то такое к психиатру.
Разумеется, шаг вправо-влево -- и из него полезли черви. А с тем же scons и шагать не надо было, достаточно хлопка в ладоши прямо на gcc/linux/x86_64.
Но кому-то так жить проще.
PS: и ведь все такие на старте орут "быстрее, быстрее, а этот init/make/younameit вообще никак нельзя сделать быстрее!"; как только ввязываются в бой, вдруг выясняется, что скорость -- не такое уж и большое достоинство, и вообще.
А вот за "смузливых милашек" - огромное инженерное спасибо! Буду широко использовать термин.
Хотя вроде как его хотели прикрыть. Но...
> Хотя вроде как его хотели прикрыть. Но...Да не, с чего бы? Это они Otto прикрыли, как я понял - в пользу Atlas.
https://blog.codeship.com/otto-next-generation-vagrant/
Сначала было это: https://www.hashicorp.com/blog/otto/
А потом это: https://www.hashicorp.com/blog/decommissioning-otto/